From bbd754aab7814b7cf7e150cbb78e7bd97ca1d97c Mon Sep 17 00:00:00 2001 From: ymipsl Date: Mon, 13 Oct 2014 11:30:53 +0000 Subject: [PATCH 01/31] Create XIOS_V1_00 branch YM git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@504 d613d254-d18a-4304-b296-5125d4c4d670 --- Doxyfile | 1725 ++ Licence.txt | 1428 ++ Licence_CeCILL_V2-en.txt | 506 + Licence_CeCILL_V2-fr.txt | 512 + arch/arch-BG_FERMI.env | 8 + arch/arch-BG_FERMI.fcm | 24 + arch/arch-BG_FERMI.path | 19 + arch/arch-BG_TURING.env | 10 + arch/arch-BG_TURING.fcm | 24 + arch/arch-BG_TURING.path | 19 + arch/arch-GCC_LINUX.env | 6 + arch/arch-GCC_LINUX.fcm | 24 + arch/arch-GCC_LINUX.path | 15 + arch/arch-GCC_MACOSX.env | 14 + arch/arch-GCC_MACOSX.fcm | 25 + arch/arch-GCC_MACOSX.path | 11 + arch/arch-PW6_VARGAS.env | 7 + arch/arch-PW6_VARGAS.fcm | 24 + arch/arch-PW6_VARGAS.path | 15 + arch/arch-X64_ADA.env | 4 + arch/arch-X64_ADA.fcm | 24 + arch/arch-X64_ADA.path | 15 + arch/arch-X64_CURIE.env | 4 + arch/arch-X64_CURIE.fcm | 24 + arch/arch-X64_CURIE.path | 19 + arch/arch-X64_CURIE_GCC.env | 8 + arch/arch-X64_CURIE_GCC.fcm | 24 + arch/arch-X64_CURIE_GCC.path | 15 + arch/arch-X64_CURIE_PGI.env | 13 + arch/arch-X64_CURIE_PGI.fcm | 24 + arch/arch-X64_CURIE_PGI.path | 15 + arch/arch-X64_CURIE_VAMPIR.env | 6 + arch/arch-X64_CURIE_VAMPIR.fcm | 23 + arch/arch-X64_CURIE_VAMPIR.path | 15 + arch/arch-X64_HORUS.env | 6 + arch/arch-X64_HORUS.fcm | 24 + arch/arch-X64_HORUS.path | 15 + arch/arch-X64_JADE.env | 12 + arch/arch-X64_JADE.fcm | 24 + arch/arch-X64_JADE.path | 15 + arch/arch-X64_TITANE.env | 4 + arch/arch-X64_TITANE.fcm | 24 + arch/arch-X64_TITANE.path | 15 + arch/arch-X64_TITANE_VAMPIR.env | 4 + arch/arch-X64_TITANE_VAMPIR.fcm | 23 + arch/arch-X64_TITANE_VAMPIR.path | 15 + arch/arch-XE6_LYNX.env | 4 + arch/arch-XE6_LYNX.fcm | 24 + arch/arch-XE6_LYNX.path | 15 + arch/arch-ifort_LSCE.fcm | 20 + arch/arch-ifort_LSCE.path | 6 + bld.cfg | 58 + doc/XIOS_reference_guide.pdf | Bin 0 -> 197405 bytes doc/reference_xml.pdf | Bin 0 -> 581527 bytes extern/src_netcdf4/attr.c | 1164 ++ extern/src_netcdf4/cache.c | 369 + extern/src_netcdf4/cdf3.c | 770 + extern/src_netcdf4/ceconstraints.h | 31 + extern/src_netcdf4/common34.c | 924 ++ extern/src_netcdf4/config.h | 474 + extern/src_netcdf4/constraints3.c | 853 + extern/src_netcdf4/constraints3.h | 40 + extern/src_netcdf4/dapalign.c | 332 + extern/src_netcdf4/dapalign.h | 56 + extern/src_netcdf4/dapattr3.c | 341 + extern/src_netcdf4/dapcvt.c | 265 + extern/src_netcdf4/dapdebug.c | 44 + extern/src_netcdf4/dapdebug.h | 73 + extern/src_netcdf4/dapdump.c | 607 + extern/src_netcdf4/dapdump.h | 68 + extern/src_netcdf4/daplex.c | 350 + extern/src_netcdf4/dapnc.h | 21 + extern/src_netcdf4/dapodom.c | 252 + extern/src_netcdf4/dapodom.h | 42 + extern/src_netcdf4/dapparse.c | 480 + extern/src_netcdf4/dapparselex.h | 95 + extern/src_netcdf4/daptab.c | 2493 +++ extern/src_netcdf4/daptab.h | 80 + extern/src_netcdf4/daputil.c | 786 + extern/src_netcdf4/daputil.h | 86 + extern/src_netcdf4/datt.c | 166 + extern/src_netcdf4/dattget.c | 256 + extern/src_netcdf4/dattinq.c | 208 + extern/src_netcdf4/dattput.c | 366 + extern/src_netcdf4/dceconstraints.c | 866 + extern/src_netcdf4/dceconstraints.h | 122 + extern/src_netcdf4/dcelex.c | 216 + extern/src_netcdf4/dceparse.c | 397 + extern/src_netcdf4/dceparselex.h | 100 + extern/src_netcdf4/dcetab.c | 1997 +++ extern/src_netcdf4/dcetab.h | 58 + extern/src_netcdf4/dcompound.c | 489 + extern/src_netcdf4/dcopy.c | 619 + extern/src_netcdf4/ddim.c | 445 + extern/src_netcdf4/ddispatch.c | 213 + extern/src_netcdf4/denum.c | 176 + extern/src_netcdf4/derror.c | 255 + extern/src_netcdf4/dfile.c | 1650 ++ extern/src_netcdf4/dgroup.c | 187 + extern/src_netcdf4/dim.c | 497 + extern/src_netcdf4/dnclog.c | 166 + extern/src_netcdf4/dopaque.c | 70 + extern/src_netcdf4/dparallel.c | 130 + extern/src_netcdf4/dstring.c | 302 + extern/src_netcdf4/dsubstrate.c | 915 ++ extern/src_netcdf4/dtype.c | 111 + extern/src_netcdf4/dutf8proc.c | 590 + extern/src_netcdf4/dv2i.c | 1160 ++ extern/src_netcdf4/dvar.c | 585 + extern/src_netcdf4/dvarget.c | 1432 ++ extern/src_netcdf4/dvarinq.c | 573 + extern/src_netcdf4/dvarput.c | 1358 ++ extern/src_netcdf4/dvlen.c | 192 + extern/src_netcdf4/err_macros.h | 81 + extern/src_netcdf4/error4.c | 75 + extern/src_netcdf4/fbits.h | 26 + extern/src_netcdf4/getvara.h | 40 + extern/src_netcdf4/getvara3.c | 1112 ++ extern/src_netcdf4/lookup3.c | 1017 ++ extern/src_netcdf4/memio.c | 604 + extern/src_netcdf4/mmapio.c | 595 + extern/src_netcdf4/nc.c | 1559 ++ extern/src_netcdf4/nc.h | 429 + extern/src_netcdf4/nc3dispatch.c | 500 + extern/src_netcdf4/nc3dispatch.h | 186 + extern/src_netcdf4/nc4attr.c | 897 ++ extern/src_netcdf4/nc4dim.c | 401 + extern/src_netcdf4/nc4dispatch.c | 110 + extern/src_netcdf4/nc4dispatch.h | 271 + extern/src_netcdf4/nc4file.c | 3203 ++++ extern/src_netcdf4/nc4grp.c | 440 + extern/src_netcdf4/nc4hdf.c | 4041 +++++ extern/src_netcdf4/nc4internal.c | 1476 ++ extern/src_netcdf4/nc4internal.h | 425 + extern/src_netcdf4/nc4type.c | 741 + extern/src_netcdf4/nc4var.c | 1485 ++ extern/src_netcdf4/nc_logging.h | 62 + extern/src_netcdf4/nc_tests.h | 37 + extern/src_netcdf4/nc_uri.c | 466 + extern/src_netcdf4/nc_uri.h | 50 + extern/src_netcdf4/ncaux.c | 390 + extern/src_netcdf4/ncaux.h | 25 + extern/src_netcdf4/ncbytes.c | 191 + extern/src_netcdf4/ncbytes.h | 58 + extern/src_netcdf4/nccommon.h | 333 + extern/src_netcdf4/ncconfigure.h | 58 + extern/src_netcdf4/ncd3dispatch.c | 218 + extern/src_netcdf4/ncd3dispatch.h | 67 + extern/src_netcdf4/ncdap3.c | 692 + extern/src_netcdf4/ncdap3.h | 149 + extern/src_netcdf4/ncdap3a.c | 800 + extern/src_netcdf4/ncdaperr.c | 43 + extern/src_netcdf4/ncdimscale.h | 12 + extern/src_netcdf4/ncdispatch.h | 386 + extern/src_netcdf4/ncfunc.c | 100 + extern/src_netcdf4/nchashmap.c | 194 + extern/src_netcdf4/nchashmap.h | 60 + extern/src_netcdf4/ncio.c | 132 + extern/src_netcdf4/ncio.h | 175 + extern/src_netcdf4/nclist.c | 224 + extern/src_netcdf4/nclist.h | 67 + extern/src_netcdf4/nclistmgr.c | 80 + extern/src_netcdf4/nclog.h | 31 + extern/src_netcdf4/nctime.c | 1169 ++ extern/src_netcdf4/nctime.h | 159 + extern/src_netcdf4/ncx.c | 8385 ++++++++++ extern/src_netcdf4/ncx.h | 753 + extern/src_netcdf4/netcdf.h | 1883 +++ extern/src_netcdf4/netcdf_f.h | 63 + extern/src_netcdf4/netcdf_par.h | 50 + extern/src_netcdf4/oc.c | 957 ++ extern/src_netcdf4/oc.h | 443 + extern/src_netcdf4/ocbytes.c | 190 + extern/src_netcdf4/ocbytes.h | 54 + extern/src_netcdf4/occlientparams.c | 128 + extern/src_netcdf4/occlientparams.h | 11 + extern/src_netcdf4/occonstraints.h | 39 + extern/src_netcdf4/occontent.c | 1174 ++ extern/src_netcdf4/occontent.h | 35 + extern/src_netcdf4/occurlfunctions.c | 206 + extern/src_netcdf4/occurlfunctions.h | 19 + extern/src_netcdf4/ocdata.h | 28 + extern/src_netcdf4/ocdatatypes.h | 61 + extern/src_netcdf4/ocdebug.c | 67 + extern/src_netcdf4/ocdebug.h | 93 + extern/src_netcdf4/ocdrno.c | 62 + extern/src_netcdf4/ocdrno.h | 18 + extern/src_netcdf4/ocdump.c | 482 + extern/src_netcdf4/ocdump.h | 16 + extern/src_netcdf4/ochttp.c | 338 + extern/src_netcdf4/ochttp.h | 22 + extern/src_netcdf4/ocinternal.c | 574 + extern/src_netcdf4/ocinternal.h | 198 + extern/src_netcdf4/oclist.c | 171 + extern/src_netcdf4/oclist.h | 57 + extern/src_netcdf4/oclog.c | 132 + extern/src_netcdf4/oclog.h | 20 + extern/src_netcdf4/ocnode.c | 757 + extern/src_netcdf4/ocnode.h | 81 + extern/src_netcdf4/ocrc.c | 548 + extern/src_netcdf4/ocrc.h | 36 + extern/src_netcdf4/ocread.c | 202 + extern/src_netcdf4/ocread.h | 15 + extern/src_netcdf4/ocuri.c | 737 + extern/src_netcdf4/ocuri.h | 52 + extern/src_netcdf4/ocutil.c | 442 + extern/src_netcdf4/ocutil.h | 36 + extern/src_netcdf4/onstack.h | 71 + extern/src_netcdf4/posixio.c | 1802 +++ extern/src_netcdf4/pstdint.h | 799 + extern/src_netcdf4/putget.c | 5362 +++++++ extern/src_netcdf4/rnd.h | 17 + extern/src_netcdf4/stub.c | 71 + extern/src_netcdf4/utf8proc.h | 397 + extern/src_netcdf4/utf8proc_data.h | 13383 ++++++++++++++++ extern/src_netcdf4/v1hpg.c | 1400 ++ extern/src_netcdf4/var.c | 740 + extern/src_netcdf4/xxdr.c | 463 + extern/src_netcdf4/xxdr.h | 183 + header_licence | 10 + inputs/COMPLETE/context_atmosphere.xml | 30 + inputs/COMPLETE/context_surface.xml | 56 + inputs/COMPLETE/iodef.xml | 22 + inputs/iodef.xml | 55 + make_xios | 202 + src/array.hpp | 93 + src/array_mac.hpp | 26 + src/array_new.hpp | 225 + src/attribute.cpp | 111 + src/attribute.hpp | 118 + src/attribute_array.hpp | 77 + src/attribute_array_decl.cpp | 13 + src/attribute_array_impl.hpp | 181 + src/attribute_enum.hpp | 86 + src/attribute_enum_impl.hpp | 205 + src/attribute_map.cpp | 707 + src/attribute_map.hpp | 74 + src/attribute_template.hpp | 104 + src/attribute_template_decl.cpp | 11 + src/attribute_template_impl.hpp | 359 + src/attribute_template_specialisation.hpp | 217 + src/buffer.cpp | 49 + src/buffer.hpp | 78 + src/buffer_client.cpp | 110 + src/buffer_client.hpp | 44 + src/buffer_decl.cpp | 25 + src/buffer_impl.hpp | 175 + src/buffer_in.cpp | 69 + src/buffer_in.hpp | 64 + src/buffer_in_decl.cpp | 23 + src/buffer_in_impl.hpp | 94 + src/buffer_out.cpp | 72 + src/buffer_out.hpp | 66 + src/buffer_out_decl.cpp | 23 + src/buffer_out_impl.hpp | 94 + src/buffer_server.cpp | 172 + src/buffer_server.hpp | 34 + src/calendar.cpp | 153 + src/calendar.hpp | 101 + src/calendar_util.cpp | 195 + src/calendar_util.hpp | 37 + src/client.cpp | 284 + src/client.hpp | 39 + src/config/axis_attribute.conf | 14 + src/config/calendar_type.conf | 21 + src/config/context_attribute.conf | 6 + src/config/domain_attribute.conf | 64 + src/config/field_attribute.conf | 25 + src/config/file_attribute.conf | 16 + src/config/functor_type.conf | 26 + src/config/grid_attribute.conf | 5 + src/config/node_type.conf | 34 + src/config/properties.conf | 24 + src/config/var_attribute.conf | 2 + src/configure.cpp | 14 + src/configure.hpp | 14 + src/context_client.cpp | 214 + src/context_client.hpp | 55 + src/context_server.cpp | 224 + src/context_server.hpp | 50 + src/cxios.cpp | 115 + src/cxios.hpp | 69 + src/cxios_decl.cpp | 16 + src/cxios_impl.hpp | 26 + src/data_output.cpp | 104 + src/data_output.hpp | 63 + src/date.cpp | 297 + src/date.hpp | 77 + src/date/allleap.cpp | 39 + src/date/allleap.hpp | 39 + src/date/calendar_type.hpp | 10 + src/date/d360.cpp | 36 + src/date/d360.hpp | 40 + src/date/gregorian.cpp | 52 + src/date/gregorian.hpp | 39 + src/date/julian.cpp | 45 + src/date/julian.hpp | 39 + src/date/noleap.cpp | 32 + src/date/noleap.hpp | 38 + src/declare_attribute.hpp | 130 + src/declare_group.hpp | 58 + src/duration.cpp | 164 + src/duration.hpp | 51 + src/event_client.cpp | 90 + src/event_client.hpp | 34 + src/event_scheduler.cpp | 256 + src/event_scheduler.hpp | 176 + src/event_server.cpp | 64 + src/event_server.hpp | 38 + src/exception.cpp | 87 + src/exception.hpp | 56 + src/functor.cpp | 66 + src/functor.hpp | 62 + src/functor/accumulate.cpp | 51 + src/functor/accumulate.hpp | 41 + src/functor/average.cpp | 88 + src/functor/average.hpp | 41 + src/functor/functor_type.hpp | 12 + src/functor/instant.cpp | 36 + src/functor/instant.hpp | 40 + src/functor/maximum.cpp | 52 + src/functor/maximum.hpp | 40 + src/functor/minimum.cpp | 51 + src/functor/minimum.hpp | 40 + src/functor/once.cpp | 37 + src/functor/once.hpp | 40 + src/generate_fortran_interface.cpp | 196 + src/generate_interface.hpp | 72 + src/generate_interface_decl.cpp | 21 + src/generate_interface_impl.hpp | 954 ++ src/globalScopeData.hpp | 14 + src/group_factory.cpp | 18 + src/group_factory.hpp | 79 + src/group_factory_decl.cpp | 27 + src/group_factory_impl.hpp | 140 + src/group_parser.hpp | 127 + src/group_template.hpp | 106 + src/group_template_decl.cpp | 18 + src/group_template_impl.hpp | 594 + src/indent.cpp | 71 + src/indent.hpp | 34 + src/indent_xml.cpp | 53 + src/indent_xml.hpp | 50 + src/input/inetcdf4.cpp | 788 + src/input/inetcdf4.hpp | 235 + src/input/nc4_data_input.cpp | 12 + src/input/nc4_data_input.hpp | 28 + src/interface/c/icaxis.cpp | 70 + src/interface/c/iccontext.cpp | 85 + src/interface/c/icdata.cpp | 463 + src/interface/c/icdate.cpp | 56 + src/interface/c/icdomain.cpp | 68 + src/interface/c/icfield.cpp | 81 + src/interface/c/icfile.cpp | 66 + src/interface/c/icgrid.cpp | 66 + src/interface/c/icutil.hpp | 68 + src/interface/c/icvariable.cpp | 71 + src/interface/c/icxml_tree.cpp | 401 + src/interface/c/oasis_cinterface.cpp | 46 + src/interface/c/oasis_cinterface.hpp | 26 + src/interface/c_attr/icaxis_attr.cpp | 269 + src/interface/c_attr/icaxisgroup_attr.cpp | 296 + src/interface/c_attr/iccontext_attr.cpp | 155 + src/interface/c_attr/icdomain_attr.cpp | 895 ++ src/interface/c_attr/icdomaingroup_attr.cpp | 922 ++ src/interface/c_attr/icfield_attr.cpp | 515 + src/interface/c_attr/icfieldgroup_attr.cpp | 542 + src/interface/c_attr/icfile_attr.cpp | 329 + src/interface/c_attr/icfilegroup_attr.cpp | 356 + src/interface/c_attr/icgrid_attr.cpp | 154 + src/interface/c_attr/icgridgroup_attr.cpp | 181 + src/interface/c_attr/icvariable_attr.cpp | 74 + src/interface/c_attr/icvariablegroup_attr.cpp | 101 + src/interface/fortran/axis_interface.f90 | 22 + src/interface/fortran/axisgroup_interface.f90 | 23 + src/interface/fortran/context_interface.f90 | 28 + src/interface/fortran/domain_interface.f90 | 22 + .../fortran/domaingroup_interface.f90 | 22 + src/interface/fortran/field_interface.f90 | 28 + .../fortran/fieldgroup_interface.f90 | 22 + src/interface/fortran/file_interface.f90 | 22 + src/interface/fortran/filegroup_interface.f90 | 22 + src/interface/fortran/grid_interface.f90 | 22 + src/interface/fortran/gridgroup_interface.f90 | 22 + src/interface/fortran/iaxis.F90 | 56 + src/interface/fortran/icontext.F90 | 52 + src/interface/fortran/idata.F90 | 417 + src/interface/fortran/idate.F90 | 58 + src/interface/fortran/idomain.F90 | 55 + src/interface/fortran/ifield.F90 | 79 + src/interface/fortran/ifile.F90 | 59 + src/interface/fortran/igrid.F90 | 60 + src/interface/fortran/ivariable.F90 | 56 + src/interface/fortran/ixios.F90 | 192 + src/interface/fortran/ixml_tree.F90 | 378 + src/interface/fortran/oasis_interface.F90 | 141 + src/interface/fortran/variable_interface.f90 | 22 + .../fortran/variablegroup_interface.f90 | 23 + src/interface/fortran/xios_fortran_prefix.hpp | 7 + .../fortran_attr/axis_interface_attr.f90 | 215 + .../fortran_attr/axisgroup_interface_attr.f90 | 236 + .../fortran_attr/context_interface_attr.f90 | 118 + .../fortran_attr/domain_interface_attr.f90 | 754 + .../domaingroup_interface_attr.f90 | 775 + .../fortran_attr/field_interface_attr.f90 | 415 + .../fieldgroup_interface_attr.f90 | 436 + .../fortran_attr/file_interface_attr.f90 | 259 + .../fortran_attr/filegroup_interface_attr.f90 | 280 + .../fortran_attr/grid_interface_attr.f90 | 122 + .../fortran_attr/gridgroup_interface_attr.f90 | 143 + src/interface/fortran_attr/iaxis_attr.F90 | 380 + .../fortran_attr/iaxisgroup_attr.F90 | 405 + src/interface/fortran_attr/icontext_attr.F90 | 240 + src/interface/fortran_attr/idomain_attr.F90 | 1110 ++ .../fortran_attr/idomaingroup_attr.F90 | 1135 ++ src/interface/fortran_attr/ifield_attr.F90 | 661 + .../fortran_attr/ifieldgroup_attr.F90 | 686 + src/interface/fortran_attr/ifile_attr.F90 | 438 + .../fortran_attr/ifilegroup_attr.F90 | 463 + src/interface/fortran_attr/igrid_attr.F90 | 250 + .../fortran_attr/igridgroup_attr.F90 | 275 + src/interface/fortran_attr/ivariable_attr.F90 | 165 + .../fortran_attr/ivariablegroup_attr.F90 | 190 + .../fortran_attr/variable_interface_attr.f90 | 55 + .../variablegroup_interface_attr.f90 | 76 + src/log.cpp | 7 + src/log.hpp | 54 + src/memory.cpp | 11 + src/memory.hpp | 11 + src/memtrack.cpp | 633 + src/memtrack.hpp | 81 + src/mpi.hpp | 15 + src/node/axis.cpp | 85 + src/node/axis.hpp | 87 + src/node/context.cpp | 559 + src/node/context.hpp | 165 + src/node/domain.cpp | 890 + src/node/domain.hpp | 158 + src/node/field.cpp | 950 ++ src/node/field.hpp | 214 + src/node/field_decl.cpp | 9 + src/node/field_impl.hpp | 177 + src/node/file.cpp | 678 + src/node/file.hpp | 154 + src/node/grid.cpp | 550 + src/node/grid.hpp | 179 + src/node/method.hpp | 99 + src/node/node_enum.hpp | 27 + src/node/node_type.hpp | 12 + src/node/var.hpp | 99 + src/node/variable.cpp | 212 + src/node/variable.hpp | 146 + src/object.cpp | 61 + src/object.hpp | 58 + src/object_factory.cpp | 15 + src/object_factory.hpp | 66 + src/object_factory_decl.cpp | 33 + src/object_factory_impl.hpp | 154 + src/object_template.hpp | 110 + src/object_template_decl.cpp | 29 + src/object_template_impl.hpp | 408 + src/output/nc4_data_output.cpp | 1387 ++ src/output/nc4_data_output.hpp | 101 + src/output/netCdfException.hpp | 34 + src/output/netCdfInterface.cpp | 753 + src/output/netCdfInterface.hpp | 132 + src/output/netCdfInterface_decl.cpp | 30 + src/output/netCdfInterface_impl.hpp | 77 + src/output/netcdf.hpp | 67 + src/output/netcdf_version.hpp | 34 + src/output/onetcdf4.cpp | 522 + src/output/onetcdf4.hpp | 125 + src/output/onetcdf4_decl.cpp | 17 + src/output/onetcdf4_impl.hpp | 60 + src/parameters.cpp | 6 + src/parse_expr/expr_node.cpp | 65 + src/parse_expr/expr_node.hpp | 440 + src/parse_expr/generate_lex_yacc.sh | 2 + src/parse_expr/lex_parser.cpp | 2257 +++ src/parse_expr/lex_parser.hpp | 10 + src/parse_expr/lex_parser.lex | 67 + src/parse_expr/operator_expr.cpp | 6 + src/parse_expr/operator_expr.hpp | 172 + src/parse_expr/simple_node_expr.hpp | 52 + src/parse_expr/yacc_parser.cpp | 1878 +++ src/parse_expr/yacc_parser.hpp | 82 + src/parse_expr/yacc_parser.yacc | 117 + src/server.cpp | 450 + src/server.hpp | 61 + src/test/parse_xml.cpp | 10 + src/test/test.cpp | 155 + src/test/test_client.f90 | 119 + src/test/test_complete.f90 | 272 + src/test/test_cs.f90 | 161 + src/test/test_unstruct_complete.f90 | 227 + src/test/test_xios.cpp | 118 + src/test/test_xios_interface.f90 | 358 + src/test_enum.hpp | 24 + src/timer.cpp | 61 + src/timer.hpp | 35 + src/tracer.cpp | 42 + src/tracer.hpp | 22 + src/type/base_type.hpp | 30 + src/type/enum.hpp | 154 + src/type/enum_impl.hpp | 295 + src/type/enum_ref_impl.hpp | 319 + src/type/message.cpp | 105 + src/type/message.hpp | 39 + src/type/type.hpp | 175 + src/type/type_decl.cpp | 31 + src/type/type_impl.hpp | 249 + src/type/type_ref_impl.hpp | 256 + src/type/type_specialisation.hpp | 317 + src/type/type_util.hpp | 63 + src/wait.f90 | 68 + src/xios_server.f90 | 9 + src/xml_node.cpp | 101 + src/xml_node.hpp | 57 + src/xml_parser.cpp | 109 + src/xml_parser.hpp | 51 + src/xml_parser_decl.cpp | 28 + src/xml_parser_impl.hpp | 50 + src/xmlioserver.hpp | 14 + src/xmlioserver_spl.hpp | 61 + tools/archive/FCM.tar.gz | Bin 0 -> 1806028 bytes tools/archive/blitz.tar.gz | Bin 0 -> 220214 bytes tools/archive/boost.tar.gz | Bin 0 -> 1285034 bytes tools/archive/rapidxml.tar.gz | Bin 0 -> 23977 bytes 528 files changed, 154823 insertions(+) create mode 100644 Doxyfile create mode 100644 Licence.txt create mode 100644 Licence_CeCILL_V2-en.txt create mode 100644 Licence_CeCILL_V2-fr.txt create mode 100644 arch/arch-BG_FERMI.env create mode 100644 arch/arch-BG_FERMI.fcm create mode 100644 arch/arch-BG_FERMI.path create mode 100644 arch/arch-BG_TURING.env create mode 100644 arch/arch-BG_TURING.fcm create mode 100644 arch/arch-BG_TURING.path create mode 100644 arch/arch-GCC_LINUX.env create mode 100644 arch/arch-GCC_LINUX.fcm create mode 100644 arch/arch-GCC_LINUX.path create mode 100644 arch/arch-GCC_MACOSX.env create mode 100644 arch/arch-GCC_MACOSX.fcm create mode 100644 arch/arch-GCC_MACOSX.path create mode 100644 arch/arch-PW6_VARGAS.env create mode 100644 arch/arch-PW6_VARGAS.fcm create mode 100644 arch/arch-PW6_VARGAS.path create mode 100644 arch/arch-X64_ADA.env create mode 100644 arch/arch-X64_ADA.fcm create mode 100644 arch/arch-X64_ADA.path create mode 100644 arch/arch-X64_CURIE.env create mode 100644 arch/arch-X64_CURIE.fcm create mode 100644 arch/arch-X64_CURIE.path create mode 100644 arch/arch-X64_CURIE_GCC.env create mode 100644 arch/arch-X64_CURIE_GCC.fcm create mode 100644 arch/arch-X64_CURIE_GCC.path create mode 100644 arch/arch-X64_CURIE_PGI.env create mode 100644 arch/arch-X64_CURIE_PGI.fcm create mode 100644 arch/arch-X64_CURIE_PGI.path create mode 100644 arch/arch-X64_CURIE_VAMPIR.env create mode 100644 arch/arch-X64_CURIE_VAMPIR.fcm create mode 100644 arch/arch-X64_CURIE_VAMPIR.path create mode 100644 arch/arch-X64_HORUS.env create mode 100644 arch/arch-X64_HORUS.fcm create mode 100644 arch/arch-X64_HORUS.path create mode 100644 arch/arch-X64_JADE.env create mode 100644 arch/arch-X64_JADE.fcm create mode 100644 arch/arch-X64_JADE.path create mode 100644 arch/arch-X64_TITANE.env create mode 100644 arch/arch-X64_TITANE.fcm create mode 100644 arch/arch-X64_TITANE.path create mode 100644 arch/arch-X64_TITANE_VAMPIR.env create mode 100644 arch/arch-X64_TITANE_VAMPIR.fcm create mode 100644 arch/arch-X64_TITANE_VAMPIR.path create mode 100644 arch/arch-XE6_LYNX.env create mode 100644 arch/arch-XE6_LYNX.fcm create mode 100644 arch/arch-XE6_LYNX.path create mode 100644 arch/arch-ifort_LSCE.fcm create mode 100644 arch/arch-ifort_LSCE.path create mode 100644 bld.cfg create mode 100755 doc/XIOS_reference_guide.pdf create mode 100644 doc/reference_xml.pdf create mode 100644 extern/src_netcdf4/attr.c create mode 100644 extern/src_netcdf4/cache.c create mode 100644 extern/src_netcdf4/cdf3.c create mode 100644 extern/src_netcdf4/ceconstraints.h create mode 100644 extern/src_netcdf4/common34.c create mode 100644 extern/src_netcdf4/config.h create mode 100644 extern/src_netcdf4/constraints3.c create mode 100644 extern/src_netcdf4/constraints3.h create mode 100644 extern/src_netcdf4/dapalign.c create mode 100644 extern/src_netcdf4/dapalign.h create mode 100644 extern/src_netcdf4/dapattr3.c create mode 100644 extern/src_netcdf4/dapcvt.c create mode 100644 extern/src_netcdf4/dapdebug.c create mode 100644 extern/src_netcdf4/dapdebug.h create mode 100644 extern/src_netcdf4/dapdump.c create mode 100644 extern/src_netcdf4/dapdump.h create mode 100644 extern/src_netcdf4/daplex.c create mode 100644 extern/src_netcdf4/dapnc.h create mode 100644 extern/src_netcdf4/dapodom.c create mode 100644 extern/src_netcdf4/dapodom.h create mode 100644 extern/src_netcdf4/dapparse.c create mode 100644 extern/src_netcdf4/dapparselex.h create mode 100644 extern/src_netcdf4/daptab.c create mode 100644 extern/src_netcdf4/daptab.h create mode 100644 extern/src_netcdf4/daputil.c create mode 100644 extern/src_netcdf4/daputil.h create mode 100644 extern/src_netcdf4/datt.c create mode 100644 extern/src_netcdf4/dattget.c create mode 100644 extern/src_netcdf4/dattinq.c create mode 100644 extern/src_netcdf4/dattput.c create mode 100644 extern/src_netcdf4/dceconstraints.c create mode 100644 extern/src_netcdf4/dceconstraints.h create mode 100644 extern/src_netcdf4/dcelex.c create mode 100644 extern/src_netcdf4/dceparse.c create mode 100644 extern/src_netcdf4/dceparselex.h create mode 100644 extern/src_netcdf4/dcetab.c create mode 100644 extern/src_netcdf4/dcetab.h create mode 100644 extern/src_netcdf4/dcompound.c create mode 100644 extern/src_netcdf4/dcopy.c create mode 100644 extern/src_netcdf4/ddim.c create mode 100644 extern/src_netcdf4/ddispatch.c create mode 100644 extern/src_netcdf4/denum.c create mode 100644 extern/src_netcdf4/derror.c create mode 100644 extern/src_netcdf4/dfile.c create mode 100644 extern/src_netcdf4/dgroup.c create mode 100644 extern/src_netcdf4/dim.c create mode 100644 extern/src_netcdf4/dnclog.c create mode 100644 extern/src_netcdf4/dopaque.c create mode 100644 extern/src_netcdf4/dparallel.c create mode 100644 extern/src_netcdf4/dstring.c create mode 100644 extern/src_netcdf4/dsubstrate.c create mode 100644 extern/src_netcdf4/dtype.c create mode 100644 extern/src_netcdf4/dutf8proc.c create mode 100644 extern/src_netcdf4/dv2i.c create mode 100644 extern/src_netcdf4/dvar.c create mode 100644 extern/src_netcdf4/dvarget.c create mode 100644 extern/src_netcdf4/dvarinq.c create mode 100644 extern/src_netcdf4/dvarput.c create mode 100644 extern/src_netcdf4/dvlen.c create mode 100644 extern/src_netcdf4/err_macros.h create mode 100644 extern/src_netcdf4/error4.c create mode 100644 extern/src_netcdf4/fbits.h create mode 100644 extern/src_netcdf4/getvara.h create mode 100644 extern/src_netcdf4/getvara3.c create mode 100644 extern/src_netcdf4/lookup3.c create mode 100644 extern/src_netcdf4/memio.c create mode 100644 extern/src_netcdf4/mmapio.c create mode 100644 extern/src_netcdf4/nc.c create mode 100644 extern/src_netcdf4/nc.h create mode 100644 extern/src_netcdf4/nc3dispatch.c create mode 100644 extern/src_netcdf4/nc3dispatch.h create mode 100644 extern/src_netcdf4/nc4attr.c create mode 100644 extern/src_netcdf4/nc4dim.c create mode 100644 extern/src_netcdf4/nc4dispatch.c create mode 100644 extern/src_netcdf4/nc4dispatch.h create mode 100644 extern/src_netcdf4/nc4file.c create mode 100644 extern/src_netcdf4/nc4grp.c create mode 100644 extern/src_netcdf4/nc4hdf.c create mode 100644 extern/src_netcdf4/nc4internal.c create mode 100644 extern/src_netcdf4/nc4internal.h create mode 100644 extern/src_netcdf4/nc4type.c create mode 100644 extern/src_netcdf4/nc4var.c create mode 100644 extern/src_netcdf4/nc_logging.h create mode 100644 extern/src_netcdf4/nc_tests.h create mode 100644 extern/src_netcdf4/nc_uri.c create mode 100644 extern/src_netcdf4/nc_uri.h create mode 100644 extern/src_netcdf4/ncaux.c create mode 100644 extern/src_netcdf4/ncaux.h create mode 100644 extern/src_netcdf4/ncbytes.c create mode 100644 extern/src_netcdf4/ncbytes.h create mode 100644 extern/src_netcdf4/nccommon.h create mode 100644 extern/src_netcdf4/ncconfigure.h create mode 100644 extern/src_netcdf4/ncd3dispatch.c create mode 100644 extern/src_netcdf4/ncd3dispatch.h create mode 100644 extern/src_netcdf4/ncdap3.c create mode 100644 extern/src_netcdf4/ncdap3.h create mode 100644 extern/src_netcdf4/ncdap3a.c create mode 100644 extern/src_netcdf4/ncdaperr.c create mode 100644 extern/src_netcdf4/ncdimscale.h create mode 100644 extern/src_netcdf4/ncdispatch.h create mode 100644 extern/src_netcdf4/ncfunc.c create mode 100644 extern/src_netcdf4/nchashmap.c create mode 100644 extern/src_netcdf4/nchashmap.h create mode 100644 extern/src_netcdf4/ncio.c create mode 100644 extern/src_netcdf4/ncio.h create mode 100644 extern/src_netcdf4/nclist.c create mode 100644 extern/src_netcdf4/nclist.h create mode 100644 extern/src_netcdf4/nclistmgr.c create mode 100644 extern/src_netcdf4/nclog.h create mode 100644 extern/src_netcdf4/nctime.c create mode 100644 extern/src_netcdf4/nctime.h create mode 100644 extern/src_netcdf4/ncx.c create mode 100644 extern/src_netcdf4/ncx.h create mode 100644 extern/src_netcdf4/netcdf.h create mode 100644 extern/src_netcdf4/netcdf_f.h create mode 100644 extern/src_netcdf4/netcdf_par.h create mode 100644 extern/src_netcdf4/oc.c create mode 100644 extern/src_netcdf4/oc.h create mode 100644 extern/src_netcdf4/ocbytes.c create mode 100644 extern/src_netcdf4/ocbytes.h create mode 100644 extern/src_netcdf4/occlientparams.c create mode 100644 extern/src_netcdf4/occlientparams.h create mode 100644 extern/src_netcdf4/occonstraints.h create mode 100644 extern/src_netcdf4/occontent.c create mode 100644 extern/src_netcdf4/occontent.h create mode 100644 extern/src_netcdf4/occurlfunctions.c create mode 100644 extern/src_netcdf4/occurlfunctions.h create mode 100644 extern/src_netcdf4/ocdata.h create mode 100644 extern/src_netcdf4/ocdatatypes.h create mode 100644 extern/src_netcdf4/ocdebug.c create mode 100644 extern/src_netcdf4/ocdebug.h create mode 100644 extern/src_netcdf4/ocdrno.c create mode 100644 extern/src_netcdf4/ocdrno.h create mode 100644 extern/src_netcdf4/ocdump.c create mode 100644 extern/src_netcdf4/ocdump.h create mode 100644 extern/src_netcdf4/ochttp.c create mode 100644 extern/src_netcdf4/ochttp.h create mode 100644 extern/src_netcdf4/ocinternal.c create mode 100644 extern/src_netcdf4/ocinternal.h create mode 100644 extern/src_netcdf4/oclist.c create mode 100644 extern/src_netcdf4/oclist.h create mode 100644 extern/src_netcdf4/oclog.c create mode 100644 extern/src_netcdf4/oclog.h create mode 100644 extern/src_netcdf4/ocnode.c create mode 100644 extern/src_netcdf4/ocnode.h create mode 100644 extern/src_netcdf4/ocrc.c create mode 100644 extern/src_netcdf4/ocrc.h create mode 100644 extern/src_netcdf4/ocread.c create mode 100644 extern/src_netcdf4/ocread.h create mode 100644 extern/src_netcdf4/ocuri.c create mode 100644 extern/src_netcdf4/ocuri.h create mode 100644 extern/src_netcdf4/ocutil.c create mode 100644 extern/src_netcdf4/ocutil.h create mode 100644 extern/src_netcdf4/onstack.h create mode 100644 extern/src_netcdf4/posixio.c create mode 100644 extern/src_netcdf4/pstdint.h create mode 100644 extern/src_netcdf4/putget.c create mode 100644 extern/src_netcdf4/rnd.h create mode 100644 extern/src_netcdf4/stub.c create mode 100644 extern/src_netcdf4/utf8proc.h create mode 100644 extern/src_netcdf4/utf8proc_data.h create mode 100644 extern/src_netcdf4/v1hpg.c create mode 100644 extern/src_netcdf4/var.c create mode 100644 extern/src_netcdf4/xxdr.c create mode 100644 extern/src_netcdf4/xxdr.h create mode 100644 header_licence create mode 100644 inputs/COMPLETE/context_atmosphere.xml create mode 100644 inputs/COMPLETE/context_surface.xml create mode 100644 inputs/COMPLETE/iodef.xml create mode 100644 inputs/iodef.xml create mode 100755 make_xios create mode 100644 src/array.hpp create mode 100644 src/array_mac.hpp create mode 100644 src/array_new.hpp create mode 100644 src/attribute.cpp create mode 100644 src/attribute.hpp create mode 100644 src/attribute_array.hpp create mode 100644 src/attribute_array_decl.cpp create mode 100644 src/attribute_array_impl.hpp create mode 100644 src/attribute_enum.hpp create mode 100644 src/attribute_enum_impl.hpp create mode 100644 src/attribute_map.cpp create mode 100644 src/attribute_map.hpp create mode 100644 src/attribute_template.hpp create mode 100644 src/attribute_template_decl.cpp create mode 100644 src/attribute_template_impl.hpp create mode 100644 src/attribute_template_specialisation.hpp create mode 100644 src/buffer.cpp create mode 100644 src/buffer.hpp create mode 100644 src/buffer_client.cpp create mode 100644 src/buffer_client.hpp create mode 100644 src/buffer_decl.cpp create mode 100644 src/buffer_impl.hpp create mode 100644 src/buffer_in.cpp create mode 100644 src/buffer_in.hpp create mode 100644 src/buffer_in_decl.cpp create mode 100644 src/buffer_in_impl.hpp create mode 100644 src/buffer_out.cpp create mode 100644 src/buffer_out.hpp create mode 100644 src/buffer_out_decl.cpp create mode 100644 src/buffer_out_impl.hpp create mode 100644 src/buffer_server.cpp create mode 100644 src/buffer_server.hpp create mode 100644 src/calendar.cpp create mode 100644 src/calendar.hpp create mode 100644 src/calendar_util.cpp create mode 100644 src/calendar_util.hpp create mode 100644 src/client.cpp create mode 100644 src/client.hpp create mode 100644 src/config/axis_attribute.conf create mode 100644 src/config/calendar_type.conf create mode 100644 src/config/context_attribute.conf create mode 100644 src/config/domain_attribute.conf create mode 100644 src/config/field_attribute.conf create mode 100644 src/config/file_attribute.conf create mode 100644 src/config/functor_type.conf create mode 100644 src/config/grid_attribute.conf create mode 100644 src/config/node_type.conf create mode 100644 src/config/properties.conf create mode 100644 src/config/var_attribute.conf create mode 100644 src/configure.cpp create mode 100644 src/configure.hpp create mode 100644 src/context_client.cpp create mode 100644 src/context_client.hpp create mode 100644 src/context_server.cpp create mode 100644 src/context_server.hpp create mode 100644 src/cxios.cpp create mode 100644 src/cxios.hpp create mode 100644 src/cxios_decl.cpp create mode 100644 src/cxios_impl.hpp create mode 100644 src/data_output.cpp create mode 100644 src/data_output.hpp create mode 100644 src/date.cpp create mode 100644 src/date.hpp create mode 100644 src/date/allleap.cpp create mode 100644 src/date/allleap.hpp create mode 100644 src/date/calendar_type.hpp create mode 100644 src/date/d360.cpp create mode 100644 src/date/d360.hpp create mode 100644 src/date/gregorian.cpp create mode 100644 src/date/gregorian.hpp create mode 100644 src/date/julian.cpp create mode 100644 src/date/julian.hpp create mode 100644 src/date/noleap.cpp create mode 100644 src/date/noleap.hpp create mode 100644 src/declare_attribute.hpp create mode 100644 src/declare_group.hpp create mode 100644 src/duration.cpp create mode 100644 src/duration.hpp create mode 100644 src/event_client.cpp create mode 100644 src/event_client.hpp create mode 100644 src/event_scheduler.cpp create mode 100644 src/event_scheduler.hpp create mode 100644 src/event_server.cpp create mode 100644 src/event_server.hpp create mode 100644 src/exception.cpp create mode 100644 src/exception.hpp create mode 100644 src/functor.cpp create mode 100644 src/functor.hpp create mode 100644 src/functor/accumulate.cpp create mode 100644 src/functor/accumulate.hpp create mode 100644 src/functor/average.cpp create mode 100644 src/functor/average.hpp create mode 100644 src/functor/functor_type.hpp create mode 100644 src/functor/instant.cpp create mode 100644 src/functor/instant.hpp create mode 100644 src/functor/maximum.cpp create mode 100644 src/functor/maximum.hpp create mode 100644 src/functor/minimum.cpp create mode 100644 src/functor/minimum.hpp create mode 100644 src/functor/once.cpp create mode 100644 src/functor/once.hpp create mode 100644 src/generate_fortran_interface.cpp create mode 100644 src/generate_interface.hpp create mode 100644 src/generate_interface_decl.cpp create mode 100644 src/generate_interface_impl.hpp create mode 100644 src/globalScopeData.hpp create mode 100644 src/group_factory.cpp create mode 100644 src/group_factory.hpp create mode 100644 src/group_factory_decl.cpp create mode 100644 src/group_factory_impl.hpp create mode 100644 src/group_parser.hpp create mode 100644 src/group_template.hpp create mode 100644 src/group_template_decl.cpp create mode 100644 src/group_template_impl.hpp create mode 100644 src/indent.cpp create mode 100644 src/indent.hpp create mode 100644 src/indent_xml.cpp create mode 100644 src/indent_xml.hpp create mode 100644 src/input/inetcdf4.cpp create mode 100644 src/input/inetcdf4.hpp create mode 100644 src/input/nc4_data_input.cpp create mode 100644 src/input/nc4_data_input.hpp create mode 100644 src/interface/c/icaxis.cpp create mode 100644 src/interface/c/iccontext.cpp create mode 100644 src/interface/c/icdata.cpp create mode 100644 src/interface/c/icdate.cpp create mode 100644 src/interface/c/icdomain.cpp create mode 100644 src/interface/c/icfield.cpp create mode 100644 src/interface/c/icfile.cpp create mode 100644 src/interface/c/icgrid.cpp create mode 100644 src/interface/c/icutil.hpp create mode 100644 src/interface/c/icvariable.cpp create mode 100644 src/interface/c/icxml_tree.cpp create mode 100644 src/interface/c/oasis_cinterface.cpp create mode 100644 src/interface/c/oasis_cinterface.hpp create mode 100644 src/interface/c_attr/icaxis_attr.cpp create mode 100644 src/interface/c_attr/icaxisgroup_attr.cpp create mode 100644 src/interface/c_attr/iccontext_attr.cpp create mode 100644 src/interface/c_attr/icdomain_attr.cpp create mode 100644 src/interface/c_attr/icdomaingroup_attr.cpp create mode 100644 src/interface/c_attr/icfield_attr.cpp create mode 100644 src/interface/c_attr/icfieldgroup_attr.cpp create mode 100644 src/interface/c_attr/icfile_attr.cpp create mode 100644 src/interface/c_attr/icfilegroup_attr.cpp create mode 100644 src/interface/c_attr/icgrid_attr.cpp create mode 100644 src/interface/c_attr/icgridgroup_attr.cpp create mode 100644 src/interface/c_attr/icvariable_attr.cpp create mode 100644 src/interface/c_attr/icvariablegroup_attr.cpp create mode 100644 src/interface/fortran/axis_interface.f90 create mode 100644 src/interface/fortran/axisgroup_interface.f90 create mode 100644 src/interface/fortran/context_interface.f90 create mode 100644 src/interface/fortran/domain_interface.f90 create mode 100644 src/interface/fortran/domaingroup_interface.f90 create mode 100644 src/interface/fortran/field_interface.f90 create mode 100644 src/interface/fortran/fieldgroup_interface.f90 create mode 100644 src/interface/fortran/file_interface.f90 create mode 100644 src/interface/fortran/filegroup_interface.f90 create mode 100644 src/interface/fortran/grid_interface.f90 create mode 100644 src/interface/fortran/gridgroup_interface.f90 create mode 100644 src/interface/fortran/iaxis.F90 create mode 100644 src/interface/fortran/icontext.F90 create mode 100644 src/interface/fortran/idata.F90 create mode 100644 src/interface/fortran/idate.F90 create mode 100644 src/interface/fortran/idomain.F90 create mode 100644 src/interface/fortran/ifield.F90 create mode 100644 src/interface/fortran/ifile.F90 create mode 100644 src/interface/fortran/igrid.F90 create mode 100644 src/interface/fortran/ivariable.F90 create mode 100644 src/interface/fortran/ixios.F90 create mode 100644 src/interface/fortran/ixml_tree.F90 create mode 100644 src/interface/fortran/oasis_interface.F90 create mode 100644 src/interface/fortran/variable_interface.f90 create mode 100644 src/interface/fortran/variablegroup_interface.f90 create mode 100644 src/interface/fortran/xios_fortran_prefix.hpp create mode 100644 src/interface/fortran_attr/axis_interface_attr.f90 create mode 100644 src/interface/fortran_attr/axisgroup_interface_attr.f90 create mode 100644 src/interface/fortran_attr/context_interface_attr.f90 create mode 100644 src/interface/fortran_attr/domain_interface_attr.f90 create mode 100644 src/interface/fortran_attr/domaingroup_interface_attr.f90 create mode 100644 src/interface/fortran_attr/field_interface_attr.f90 create mode 100644 src/interface/fortran_attr/fieldgroup_interface_attr.f90 create mode 100644 src/interface/fortran_attr/file_interface_attr.f90 create mode 100644 src/interface/fortran_attr/filegroup_interface_attr.f90 create mode 100644 src/interface/fortran_attr/grid_interface_attr.f90 create mode 100644 src/interface/fortran_attr/gridgroup_interface_attr.f90 create mode 100644 src/interface/fortran_attr/iaxis_attr.F90 create mode 100644 src/interface/fortran_attr/iaxisgroup_attr.F90 create mode 100644 src/interface/fortran_attr/icontext_attr.F90 create mode 100644 src/interface/fortran_attr/idomain_attr.F90 create mode 100644 src/interface/fortran_attr/idomaingroup_attr.F90 create mode 100644 src/interface/fortran_attr/ifield_attr.F90 create mode 100644 src/interface/fortran_attr/ifieldgroup_attr.F90 create mode 100644 src/interface/fortran_attr/ifile_attr.F90 create mode 100644 src/interface/fortran_attr/ifilegroup_attr.F90 create mode 100644 src/interface/fortran_attr/igrid_attr.F90 create mode 100644 src/interface/fortran_attr/igridgroup_attr.F90 create mode 100644 src/interface/fortran_attr/ivariable_attr.F90 create mode 100644 src/interface/fortran_attr/ivariablegroup_attr.F90 create mode 100644 src/interface/fortran_attr/variable_interface_attr.f90 create mode 100644 src/interface/fortran_attr/variablegroup_interface_attr.f90 create mode 100644 src/log.cpp create mode 100644 src/log.hpp create mode 100644 src/memory.cpp create mode 100644 src/memory.hpp create mode 100644 src/memtrack.cpp create mode 100644 src/memtrack.hpp create mode 100644 src/mpi.hpp create mode 100644 src/node/axis.cpp create mode 100644 src/node/axis.hpp create mode 100644 src/node/context.cpp create mode 100644 src/node/context.hpp create mode 100644 src/node/domain.cpp create mode 100644 src/node/domain.hpp create mode 100644 src/node/field.cpp create mode 100644 src/node/field.hpp create mode 100644 src/node/field_decl.cpp create mode 100644 src/node/field_impl.hpp create mode 100644 src/node/file.cpp create mode 100644 src/node/file.hpp create mode 100644 src/node/grid.cpp create mode 100644 src/node/grid.hpp create mode 100644 src/node/method.hpp create mode 100644 src/node/node_enum.hpp create mode 100644 src/node/node_type.hpp create mode 100644 src/node/var.hpp create mode 100644 src/node/variable.cpp create mode 100644 src/node/variable.hpp create mode 100644 src/object.cpp create mode 100644 src/object.hpp create mode 100644 src/object_factory.cpp create mode 100644 src/object_factory.hpp create mode 100644 src/object_factory_decl.cpp create mode 100644 src/object_factory_impl.hpp create mode 100644 src/object_template.hpp create mode 100644 src/object_template_decl.cpp create mode 100644 src/object_template_impl.hpp create mode 100644 src/output/nc4_data_output.cpp create mode 100644 src/output/nc4_data_output.hpp create mode 100644 src/output/netCdfException.hpp create mode 100644 src/output/netCdfInterface.cpp create mode 100644 src/output/netCdfInterface.hpp create mode 100644 src/output/netCdfInterface_decl.cpp create mode 100644 src/output/netCdfInterface_impl.hpp create mode 100644 src/output/netcdf.hpp create mode 100644 src/output/netcdf_version.hpp create mode 100644 src/output/onetcdf4.cpp create mode 100644 src/output/onetcdf4.hpp create mode 100644 src/output/onetcdf4_decl.cpp create mode 100644 src/output/onetcdf4_impl.hpp create mode 100644 src/parameters.cpp create mode 100644 src/parse_expr/expr_node.cpp create mode 100644 src/parse_expr/expr_node.hpp create mode 100755 src/parse_expr/generate_lex_yacc.sh create mode 100644 src/parse_expr/lex_parser.cpp create mode 100644 src/parse_expr/lex_parser.hpp create mode 100644 src/parse_expr/lex_parser.lex create mode 100644 src/parse_expr/operator_expr.cpp create mode 100644 src/parse_expr/operator_expr.hpp create mode 100644 src/parse_expr/simple_node_expr.hpp create mode 100644 src/parse_expr/yacc_parser.cpp create mode 100644 src/parse_expr/yacc_parser.hpp create mode 100644 src/parse_expr/yacc_parser.yacc create mode 100644 src/server.cpp create mode 100644 src/server.hpp create mode 100644 src/test/parse_xml.cpp create mode 100644 src/test/test.cpp create mode 100644 src/test/test_client.f90 create mode 100644 src/test/test_complete.f90 create mode 100644 src/test/test_cs.f90 create mode 100644 src/test/test_unstruct_complete.f90 create mode 100644 src/test/test_xios.cpp create mode 100644 src/test/test_xios_interface.f90 create mode 100644 src/test_enum.hpp create mode 100644 src/timer.cpp create mode 100644 src/timer.hpp create mode 100644 src/tracer.cpp create mode 100644 src/tracer.hpp create mode 100644 src/type/base_type.hpp create mode 100644 src/type/enum.hpp create mode 100644 src/type/enum_impl.hpp create mode 100644 src/type/enum_ref_impl.hpp create mode 100644 src/type/message.cpp create mode 100644 src/type/message.hpp create mode 100644 src/type/type.hpp create mode 100644 src/type/type_decl.cpp create mode 100644 src/type/type_impl.hpp create mode 100644 src/type/type_ref_impl.hpp create mode 100644 src/type/type_specialisation.hpp create mode 100644 src/type/type_util.hpp create mode 100644 src/wait.f90 create mode 100644 src/xios_server.f90 create mode 100644 src/xml_node.cpp create mode 100644 src/xml_node.hpp create mode 100644 src/xml_parser.cpp create mode 100644 src/xml_parser.hpp create mode 100644 src/xml_parser_decl.cpp create mode 100644 src/xml_parser_impl.hpp create mode 100644 src/xmlioserver.hpp create mode 100644 src/xmlioserver_spl.hpp create mode 100644 tools/archive/FCM.tar.gz create mode 100644 tools/archive/blitz.tar.gz create mode 100644 tools/archive/boost.tar.gz create mode 100644 tools/archive/rapidxml.tar.gz diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..dca7b38 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,1725 @@ +# Doxyfile 1.7.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = XIOS + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Xml I/O Server" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = French + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.cpp \ + *.hpp \ + *.conf + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is adviced to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# If the HTML_TIMESTAMP tag is set to YES then the generated HTML +# documentation will contain the timesstamp. + +HTML_TIMESTAMP = YES + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 224 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 63 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 152 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = YES + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/Licence.txt b/Licence.txt new file mode 100644 index 0000000..36b9a11 --- /dev/null +++ b/Licence.txt @@ -0,0 +1,1428 @@ + + + ------------------ XIOS Licence --------------- + + + +XIOS is under CeCILL_V2 licence. See "Licence_CeCILL_V2-en.txt" file for an english +version of the licence and "Licence_CeCILL_V2-fr.txt" for a french version. + +All files in the src directory are submitted to the Cecill Licence. + + + +XIOS use internally some other packages that are submitted to other free licence : + + +- boost C++ library : http://www.boost.org + ---> Boost software licence : http://www.boost.org/users/license.html + + +- blitz++ : http://blitz.sourceforge.net/ + ---> GNU LESSER GENERAL PUBLIC LICENSE V3 : https://www.gnu.org/licenses/lgpl.html + + +- RapidXML : http://rapidxml.sourceforge.net/ + ---> Boost software licence : http://www.boost.org/users/license.html + + + - FCM : http://www.metoffice.gov.uk/research/collaboration/fcm + ---> GNU GENERAL PUBLIC LICENSE V3 : https://www.gnu.org/licenses/lgpl.html + + + +--------------------------------------------------------------------------- + + Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +---------------------------------------------------------------------------- + + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + + + + +------------------------------------------------------------------------ + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +----------------------------------------------------------------------------- + + + + +CeCILL FREE SOFTWARE LICENSE AGREEMENT + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to + users, + * secondly, the election of a governing law, French law, with which + it is conformant, both as regards the law of torts and + intellectual property law, and the protection that it offers to + both authors and holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical +and industrial research establishment, having its principal place of +business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of these rights is conditional upon certain obligations +for users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software as regards their requirements in conditions +enabling the security of their systems and/or data to be ensured and, +more generally, to use and operate it in the same conditions of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 hereinafter for the whole term of the +protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical + medium; + * (ii) the first time the Licensee exercises any of the rights + granted hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +hereinabove, and the Licensee hereby acknowledges that it has read and +understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or + all medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission + or storage operation as regards the Software, that it is entitled + to carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows future Licensees unhindered access to +the full Source Code of the Software by indicating how to access it, it +being understood that the additional cost of acquiring the Source Code +shall not exceed the cost of transferring the data. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the resulting Modified Software +become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the object code of the Modified +Software is redistributed, the Licensee allows future Licensees +unhindered access to the full source code of the Modified Software by +indicating how to access it, it being understood that the additional +cost of acquiring the source code shall not exceed the cost of +transferring the data. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH THE GNU GPL + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL in the Modified or unmodified Software, +and distribute that entire code under the terms of the same version of +the GNU GPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +and distribute that entire code under the terms of the same version of +the GNU GPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2. + + + 6.2 OVER THE CONTRIBUTIONS + +The Licensee who develops a Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +The Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies + of the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights of the Holder and/or Contributors on the +Software and to take, where applicable, vis-à-vis its staff, any and all +measures required to ensure respect of said intellectual property rights +of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 and, in particular, without any warranty +as to its commercial value, its secured, safe, innovative or relevant +nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +assistance for its defense. Such technical and legal assistance shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + + +Version 2.0 dated 2006-09-05. + + + + + diff --git a/Licence_CeCILL_V2-en.txt b/Licence_CeCILL_V2-en.txt new file mode 100644 index 0000000..fcc8df2 --- /dev/null +++ b/Licence_CeCILL_V2-en.txt @@ -0,0 +1,506 @@ + +CeCILL FREE SOFTWARE LICENSE AGREEMENT + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to + users, + * secondly, the election of a governing law, French law, with which + it is conformant, both as regards the law of torts and + intellectual property law, and the protection that it offers to + both authors and holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical +and industrial research establishment, having its principal place of +business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of these rights is conditional upon certain obligations +for users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software as regards their requirements in conditions +enabling the security of their systems and/or data to be ensured and, +more generally, to use and operate it in the same conditions of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 hereinafter for the whole term of the +protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical + medium; + * (ii) the first time the Licensee exercises any of the rights + granted hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +hereinabove, and the Licensee hereby acknowledges that it has read and +understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or + all medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission + or storage operation as regards the Software, that it is entitled + to carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows future Licensees unhindered access to +the full Source Code of the Software by indicating how to access it, it +being understood that the additional cost of acquiring the Source Code +shall not exceed the cost of transferring the data. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the resulting Modified Software +become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the object code of the Modified +Software is redistributed, the Licensee allows future Licensees +unhindered access to the full source code of the Modified Software by +indicating how to access it, it being understood that the additional +cost of acquiring the source code shall not exceed the cost of +transferring the data. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH THE GNU GPL + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL in the Modified or unmodified Software, +and distribute that entire code under the terms of the same version of +the GNU GPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +and distribute that entire code under the terms of the same version of +the GNU GPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2. + + + 6.2 OVER THE CONTRIBUTIONS + +The Licensee who develops a Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +The Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies + of the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights of the Holder and/or Contributors on the +Software and to take, where applicable, vis-à-vis its staff, any and all +measures required to ensure respect of said intellectual property rights +of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 and, in particular, without any warranty +as to its commercial value, its secured, safe, innovative or relevant +nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +assistance for its defense. Such technical and legal assistance shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + + +Version 2.0 dated 2006-09-05. diff --git a/Licence_CeCILL_V2-fr.txt b/Licence_CeCILL_V2-fr.txt new file mode 100644 index 0000000..1613fca --- /dev/null +++ b/Licence_CeCILL_V2-fr.txt @@ -0,0 +1,512 @@ + +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL + + + Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation +entre ses auteurs afin que le respect de deux grands principes préside à +sa rédaction: + + * d'une part, le respect des principes de diffusion des logiciels + libres: accès au code source, droits étendus conférés aux + utilisateurs, + * d'autre part, la désignation d'un droit applicable, le droit + français, auquel elle est conforme, tant au regard du droit de la + responsabilité civile que du droit de la propriété intellectuelle + et de la protection qu'il offre aux auteurs et titulaires des + droits patrimoniaux sur un logiciel. + +Les auteurs de la licence CeCILL (pour Ce[a] C[nrs] I[nria] L[ogiciel] +L[ibre]) sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de +recherche à caractère scientifique, technique et industriel, dont le +siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement +public à caractère scientifique et technologique, dont le siège est +situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, établissement public à caractère scientifique et technologique, +dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 +Le Chesnay cedex. + + + Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de +conférer aux utilisateurs la liberté de modification et de +redistribution du logiciel régi par cette licence dans le cadre d'un +modèle de diffusion en logiciel libre. + +L'exercice de ces libertés est assorti de certains devoirs à la charge +des utilisateurs afin de préserver ce statut au cours des +redistributions ultérieures. + +L'accessibilité au code source et les droits de copie, de modification +et de redistribution qui en découlent ont pour contrepartie de n'offrir +aux utilisateurs qu'une garantie limitée et de ne faire peser sur +l'auteur du logiciel, le titulaire des droits patrimoniaux et les +concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques +associés au chargement, à l'utilisation, à la modification et/ou au +développement et à la reproduction du logiciel par l'utilisateur étant +donné sa spécificité de logiciel libre, qui peut le rendre complexe à +manipuler et qui le réserve donc à des développeurs ou des +professionnels avertis possédant des connaissances informatiques +approfondies. Les utilisateurs sont donc invités à charger et tester +l'adéquation du logiciel à leurs besoins dans des conditions permettant +d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus +généralement, à l'utiliser et l'exploiter dans les mêmes conditions de +sécurité. Ce contrat peut être reproduit et diffusé librement, sous +réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le +titulaire des droits patrimoniaux décide de soumettre l'exploitation aux +dispositions qu'il contient. + + + Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une +lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions +postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code +Source et le cas échéant sa documentation, dans leur état au moment de +l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et +éventuellement de Code Objet et le cas échéant sa documentation, dans +leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une +Contribution. + +Code Source: désigne l'ensemble des instructions et des lignes de +programme du Logiciel et auquel l'accès est nécessaire en vue de +modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du +Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur +sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le +Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale +distribuant le Logiciel sous le Contrat. + +Contribution: désigne l'ensemble des modifications, corrections, +traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans +le Logiciel par tout Contributeur, ainsi que tout Module Interne. + +Module: désigne un ensemble de fichiers sources y compris leur +documentation qui permet de réaliser des fonctionnalités ou services +supplémentaires à ceux fournis par le Logiciel. + +Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce +Module et le Logiciel s'exécutent dans des espaces d'adressage +différents, l'un appelant l'autre au moment de leur exécution. + +Module Interne: désigne tout Module lié au Logiciel de telle sorte +qu'ils s'exécutent dans le même espace d'adressage. + +GNU GPL: désigne la GNU General Public License dans sa version 2 ou +toute version ultérieure, telle que publiée par Free Software Foundation +Inc. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + + + Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une +licence non exclusive, cessible et mondiale du Logiciel telle que +définie ci-après à l'article 5 pour toute la durée de protection des droits +portant sur ce Logiciel. + + + Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée +acquise du fait du premier des faits suivants: + + * (i) le chargement du Logiciel par tout moyen notamment par + téléchargement à partir d'un serveur distant ou par chargement à + partir d'un support physique; + * (ii) le premier exercice par le Licencié de l'un quelconque des + droits concédés par le Contrat. + +3.2 Un exemplaire du Contrat, contenant notamment un avertissement +relatif aux spécificités du Logiciel, à la restriction de garantie et à +la limitation à un usage par des utilisateurs expérimentés a été mis à +disposition du Licencié préalablement à son acceptation telle que +définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris +connaissance. + + + Article 4 - ENTREE EN VIGUEUR ET DUREE + + + 4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié +telle que définie en 3.1. + + + 4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de +protection des droits patrimoniaux portant sur le Logiciel. + + + Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur +le Logiciel pour toutes destinations et pour la durée du Contrat dans +les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou +plusieurs brevets d'invention protégeant tout ou partie des +fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas +opposer les éventuels droits conférés par ces brevets aux Licenciés +successifs qui utiliseraient, exploiteraient ou modifieraient le +Logiciel. En cas de cession de ces brevets, le Concédant s'engage à +faire reprendre les obligations du présent alinéa aux cessionnaires. + + + 5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant +aux domaines d'application, étant ci-après précisé que cela comporte: + + 1. la reproduction permanente ou provisoire du Logiciel en tout ou + partie par tout moyen et sous toute forme. + + 2. le chargement, l'affichage, l'exécution, ou le stockage du + Logiciel sur tout support. + + 3. la possibilité d'en observer, d'en étudier, ou d'en tester le + fonctionnement afin de déterminer les idées et principes qui sont + à la base de n'importe quel élément de ce Logiciel; et ceci, + lorsque le Licencié effectue toute opération de chargement, + d'affichage, d'exécution, de transmission ou de stockage du + Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + + + 5.2 DROIT D'APPORTER DES CONTRIBUTIONS + +Le droit d'apporter des Contributions comporte le droit de traduire, +d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel +et le droit de reproduire le logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous +réserve de mentionner, de façon explicite, son nom en tant qu'auteur de +cette Contribution et la date de création de celle-ci. + + + 5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de +transmettre et de communiquer le Logiciel au public sur tout support et +par tout moyen ainsi que le droit de mettre sur le marché à titre +onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou +non, à des tiers dans les conditions ci-après détaillées. + + + 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, +sous forme de Code Source ou de Code Objet, à condition que cette +distribution respecte les dispositions du Contrat dans leur totalité et +soit accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, +le Licencié permette aux futurs Licenciés d'accéder facilement au Code +Source complet du Logiciel en indiquant les modalités d'accès, étant +entendu que le coût additionnel d'acquisition du Code Source ne devra +pas excéder le simple coût de transfert des données. + + + 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution au Logiciel, les conditions +de distribution du Logiciel Modifié en résultant sont alors soumises à +l'intégralité des dispositions du Contrat. + +Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de +code source ou de code objet, à condition que cette distribution +respecte les dispositions du Contrat dans leur totalité et soit +accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le code objet du Logiciel Modifié est +redistribué, le Licencié permette aux futurs Licenciés d'accéder +facilement au code source complet du Logiciel Modifié en indiquant les +modalités d'accès, étant entendu que le coût additionnel d'acquisition +du code source ne devra pas excéder le simple coût de transfert des données. + + + 5.3.3 DISTRIBUTION DES MODULES EXTERNES + +Lorsque le Licencié a développé un Module Externe les conditions du +Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué +sous un contrat de licence différent. + + + 5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL + +Le Licencié peut inclure un code soumis aux dispositions d'une des +versions de la licence GNU GPL dans le Logiciel modifié ou non et +distribuer l'ensemble sous les conditions de la même version de la +licence GNU GPL. + +Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis +aux dispositions d'une des versions de la licence GNU GPL et distribuer +l'ensemble sous les conditions de la même version de la licence GNU GPL. + + + Article 6 - PROPRIETE INTELLECTUELLE + + + 6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel +Initial. Toute utilisation du Logiciel Initial est soumise au respect +des conditions dans lesquelles le Titulaire a choisi de diffuser son +oeuvre et nul autre n'a la faculté de modifier les conditions de +diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi +par le Contrat et ce, pour la durée visée à l'article 4.2. + + + 6.2 SUR LES CONTRIBUTIONS + +Le Licencié qui a développé une Contribution est titulaire sur celle-ci +des droits de propriété intellectuelle dans les conditions définies par +la législation applicable. + + + 6.3 SUR LES MODULES EXTERNES + +Le Licencié qui a développé un Module Externe est titulaire sur celui-ci +des droits de propriété intellectuelle dans les conditions définies par +la législation applicable et reste libre du choix du contrat régissant +sa diffusion. + + + 6.4 DISPOSITIONS COMMUNES + +Le Licencié s'engage expressément: + + 1. à ne pas supprimer ou modifier de quelque manière que ce soit les + mentions de propriété intellectuelle apposées sur le Logiciel; + + 2. à reproduire à l'identique lesdites mentions de propriété + intellectuelle sur les copies du Logiciel modifié ou non. + +Le Licencié s'engage à ne pas porter atteinte, directement ou +indirectement, aux droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs sur le Logiciel et à prendre, le cas échéant, à +l'égard de son personnel toutes les mesures nécessaires pour assurer le +respect des dits droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs. + + + Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de +prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les +termes et conditions d'une telle assistance technique et/ou d'une telle +maintenance seront alors déterminés dans un acte séparé. Ces actes de +maintenance et/ou assistance technique n'engageront que la seule +responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule +responsabilité, à ses licenciés une garantie, qui n'engagera que lui, +lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, +dans les conditions qu'il souhaite. Cette garantie et les modalités +financières de son application feront l'objet d'un acte séparé entre le +Concédant et le Licencié. + + + Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la +faculté, sous réserve de prouver la faute du Concédant concerné, de +solliciter la réparation du préjudice direct qu'il subirait du fait du +Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en +application du Contrat et ne saurait être engagée en raison notamment: +(i) des dommages dus à l'inexécution, totale ou partielle, de ses +obligations par le Licencié, (ii) des dommages directs ou indirects +découlant de l'utilisation ou des performances du Logiciel subis par le +Licencié et (iii) plus généralement d'un quelconque dommage indirect. En +particulier, les Parties conviennent expressément que tout préjudice +financier ou commercial (par exemple perte de données, perte de +bénéfices, perte d'exploitation, perte de clientèle ou de commandes, +manque à gagner, trouble commercial quelconque) ou toute action dirigée +contre le Licencié par un tiers, constitue un dommage indirect et +n'ouvre pas droit à réparation par le Concédant. + + + Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances +scientifiques et techniques au moment de la mise en circulation du +Logiciel ne permet pas d'en tester et d'en vérifier toutes les +utilisations ni de détecter l'existence d'éventuels défauts. L'attention +du Licencié a été attirée sur ce point sur les risques associés au +chargement, à l'utilisation, la modification et/ou au développement et à +la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous +moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et +de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder +l'ensemble des droits attachés au Logiciel (comprenant notamment les +droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le +Concédant sans autre garantie, expresse ou tacite, que celle prévue à +l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, +son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt +d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible +avec l'équipement du Licencié et sa configuration logicielle ni qu'il +remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le +Logiciel ne porte pas atteinte à un quelconque droit de propriété +intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout +autre droit de propriété. Ainsi, le Concédant exclut toute garantie au +profit du Licencié contre les actions en contrefaçon qui pourraient être +diligentées au titre de l'utilisation, de la modification, et de la +redistribution du Logiciel. Néanmoins, si de telles actions sont +exercées contre le Licencié, le Concédant lui apportera son aide +technique et juridique pour sa défense. Cette aide technique et +juridique est déterminée au cas par cas entre le Concédant concerné et +le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage +toute responsabilité quant à l'utilisation de la dénomination du +Logiciel par le Licencié. Aucune garantie n'est apportée quant à +l'existence de droits antérieurs sur le nom du Logiciel et sur +l'existence d'une marque. + + + Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa +charge par le Contrat, le Concédant pourra résilier de plein droit le +Contrat trente (30) jours après notification adressée au Licencié et +restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à +utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les +licences qu'il aura concédées antérieurement à la résiliation du Contrat +resteront valides sous réserve qu'elles aient été effectuées en +conformité avec le Contrat. + + + Article 11 - DISPOSITIONS DIVERSES + + + 11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance +d'exécution du Contrat qui serait dû à un cas de force majeure, un cas +fortuit ou une cause extérieure, telle que, notamment, le mauvais +fonctionnement ou les interruptions du réseau électrique ou de +télécommunication, la paralysie du réseau liée à une attaque +informatique, l'intervention des autorités gouvernementales, les +catastrophes naturelles, les dégâts des eaux, les tremblements de terre, +le feu, les explosions, les grèves et les conflits sociaux, l'état de +guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou +plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du +Contrat, ne pourra en aucun cas impliquer renonciation par la Partie +intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite +ou orale, entre les Parties sur le même objet et constitue l'accord +entier entre les Parties sur cet objet. Aucune addition ou modification +aux termes du Contrat n'aura d'effet à l'égard des Parties à moins +d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat +s'avèrerait contraire à une loi ou à un texte applicable, existants ou +futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les +amendements nécessaires pour se conformer à cette loi ou à ce texte. +Toutes les autres dispositions resteront en vigueur. De même, la +nullité, pour quelque raison que ce soit, d'une des dispositions du +Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + + + 11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces +deux versions faisant également foi. + + + Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de +ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé +et ne peut être modifié que par les auteurs de la licence, lesquels se +réservent le droit de publier périodiquement des mises à jour ou de +nouvelles versions du Contrat, qui posséderont chacune un numéro +distinct. Ces versions ultérieures seront susceptibles de prendre en +compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra +faire l'objet d'une diffusion ultérieure que sous la même version du +Contrat ou une version postérieure, sous réserve des dispositions de +l'article 5.3.4. + + + Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent +de tenter de régler à l'amiable les différends ou litiges qui +viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter +de leur survenance et sauf situation relevant d'une procédure d'urgence, +les différends ou litiges seront portés par la Partie la plus diligente +devant les Tribunaux compétents de Paris. + + +Version 2.0 du 2006-09-05. diff --git a/arch/arch-BG_FERMI.env b/arch/arch-BG_FERMI.env new file mode 100644 index 0000000..8d5c784 --- /dev/null +++ b/arch/arch-BG_FERMI.env @@ -0,0 +1,8 @@ +module purge +module load profile/advanced +module load bgq-xl/1.0 +module load netcdf/4.1.3_par--bgq-xl--1.0 +module load hdf5/1.8.9_par--bgq-xl--1.0 +module load szip/2.1--bgq-xl--1.0 +module load zlib/1.2.7--bgq-gnu--4.4.6 +module load mass diff --git a/arch/arch-BG_FERMI.fcm b/arch/arch-BG_FERMI.fcm new file mode 100644 index 0000000..e055a4c --- /dev/null +++ b/arch/arch-BG_FERMI.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpixlc_r +%FCOMPILER mpixlf90_r +%LINKER mpixlf90_r + +%BASE_CFLAGS +%PROD_CFLAGS -O3 -qarch=qp -qtune=qp +%DEV_CFLAGS +%DEBUG_CFLAGS + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 -qarch=qp -qtune=qp +%DEV_FFLAGS +%DEBUG_FFLAGS + +%BASE_INC -D__NONE__ +%BASE_LD -L/opt/ibmcmp/vacpp/bg/12.1/bglib64 -libmc++ + +%CPP mpixlc -EP +%FPP cpp -P +%MAKE make diff --git a/arch/arch-BG_FERMI.path b/arch/arch-BG_FERMI.path new file mode 100644 index 0000000..97f9f83 --- /dev/null +++ b/arch/arch-BG_FERMI.path @@ -0,0 +1,19 @@ +NETCDF_INCDIR="-I $NETCDF_INC" +NETCDF_LIBDIR="-L $NETCDF_LIB" +NETCDF_LIB="-lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I$HDF5_INC" +HDF5_LIBDIR="-L$HDF5_LIB -L$SZIP_LIB -L$ZLIB_LIB" +HDF5_LIB="-lhdf5_hl -lhdf5 -lsz -lz" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" + +#only for MEMTRACK debuging : developper only +ADDR2LINE_LIBDIR="-L${WORKDIR}/ADDR2LINE_LIB" +ADDR2LINE_LIB="-laddr2line" diff --git a/arch/arch-BG_TURING.env b/arch/arch-BG_TURING.env new file mode 100644 index 0000000..cbf37e8 --- /dev/null +++ b/arch/arch-BG_TURING.env @@ -0,0 +1,10 @@ +module load compilerwrappers/no +module load netcdf/mpi/4.2.1 +module load hdf5/mpi/1.8.9 + +export NETCDF_INC=/bglocal/cn/pub/NetCDF/4.2.1/mpi/include +export NETCDF_LIB=/bglocal/cn/pub/NetCDF/4.2.1/mpi/lib + +export HDF5_INC=/bglocal/cn/pub/HDF5/1.8.9/par/include +export HDF5_LIB=/bglocal/cn/pub/HDF5/1.8.9/par/lib +export ZLIB=/bglocal/cn/pub/zlib/1.2.8/lib diff --git a/arch/arch-BG_TURING.fcm b/arch/arch-BG_TURING.fcm new file mode 100644 index 0000000..e055a4c --- /dev/null +++ b/arch/arch-BG_TURING.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpixlc_r +%FCOMPILER mpixlf90_r +%LINKER mpixlf90_r + +%BASE_CFLAGS +%PROD_CFLAGS -O3 -qarch=qp -qtune=qp +%DEV_CFLAGS +%DEBUG_CFLAGS + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 -qarch=qp -qtune=qp +%DEV_FFLAGS +%DEBUG_FFLAGS + +%BASE_INC -D__NONE__ +%BASE_LD -L/opt/ibmcmp/vacpp/bg/12.1/bglib64 -libmc++ + +%CPP mpixlc -EP +%FPP cpp -P +%MAKE make diff --git a/arch/arch-BG_TURING.path b/arch/arch-BG_TURING.path new file mode 100644 index 0000000..21535e2 --- /dev/null +++ b/arch/arch-BG_TURING.path @@ -0,0 +1,19 @@ +NETCDF_INCDIR="-I $NETCDF_INC" +NETCDF_LIBDIR="-L $NETCDF_LIB" +NETCDF_LIB="-lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I$HDF5_INC" +HDF5_LIBDIR="-L$HDF5_LIB -L$ZLIB" +HDF5_LIB="-lhdf5_hl -lhdf5 -lz" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" + +#only for MEMTRACK debuging : developper only +ADDR2LINE_LIBDIR="-L${WORKDIR}/ADDR2LINE_LIB" +ADDR2LINE_LIB="-laddr2line" diff --git a/arch/arch-GCC_LINUX.env b/arch/arch-GCC_LINUX.env new file mode 100644 index 0000000..a065dbf --- /dev/null +++ b/arch/arch-GCC_LINUX.env @@ -0,0 +1,6 @@ +export HDF5_INC_DIR=$HOME/hdf5/include +export HDF5_LIB_DIR=$HOME/hdf5/lib + +export NETCDF_INC_DIR=$HOME/netcdf4/include +export NETCDF_LIB_DIR=$HOME/netcdf4/lib + diff --git a/arch/arch-GCC_LINUX.fcm b/arch/arch-GCC_LINUX.fcm new file mode 100644 index 0000000..0a4316d --- /dev/null +++ b/arch/arch-GCC_LINUX.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpicc +%FCOMPILER mpif90 +%LINKER mpif90 + +%BASE_CFLAGS -ansi -w +%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 +%DEBUG_CFLAGS -g + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-GCC_LINUX.path b/arch/arch-GCC_LINUX.path new file mode 100644 index 0000000..65c1176 --- /dev/null +++ b/arch/arch-GCC_LINUX.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdff -lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I $HDF5_INC_DIR" +HDF5_LIBDIR="-L $HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-GCC_MACOSX.env b/arch/arch-GCC_MACOSX.env new file mode 100644 index 0000000..a5aba07 --- /dev/null +++ b/arch/arch-GCC_MACOSX.env @@ -0,0 +1,14 @@ +# Environment to compile XIOS on Mac OS X +# +# Tested successfully with : +# Mac OS X 10.7.4 +# Prerequisite softwares installed with MacPorts : +# gfortran : 4.6.0 +# openmpi : 1.6.3_0 variant +gcc45 +# netcdf : 4.2.1 variant : +dap+netcdf4+openmpi (includes hdf5) +# +# Olivier Marti - olivier.marti(ad)lsce.ipsl.fr +# +export NETCDF_DIR=/opt/local +export NETCDF_INC_DIR=${NETCDF_DIR}/include +export NETCDF_LIB_DIR=${NETCDF_DIR}/lib diff --git a/arch/arch-GCC_MACOSX.fcm b/arch/arch-GCC_MACOSX.fcm new file mode 100644 index 0000000..8e061a6 --- /dev/null +++ b/arch/arch-GCC_MACOSX.fcm @@ -0,0 +1,25 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpiCC +%FCOMPILER mpif90 +%LINKER mpif90 + +%BASE_CFLAGS -w +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g +%DEBUG_CFLAGS -g -O2 + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP /opt/local/bin/cpp-mp-4.5 +%FPP /opt/local/bin/cpp-mp-4.5 -P +%MAKE gmake + diff --git a/arch/arch-GCC_MACOSX.path b/arch/arch-GCC_MACOSX.path new file mode 100644 index 0000000..c873de8 --- /dev/null +++ b/arch/arch-GCC_MACOSX.path @@ -0,0 +1,11 @@ +NETCDF_INCDIR="-I${NETCDF_INC_DIR}" +NETCDF_LIBDIR="-L${NETCDF_LIB_DIR}" +NETCDF_LIB="-lnetcdff -lnetcdf" + +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-PW6_VARGAS.env b/arch/arch-PW6_VARGAS.env new file mode 100644 index 0000000..513f1db --- /dev/null +++ b/arch/arch-PW6_VARGAS.env @@ -0,0 +1,7 @@ +module unload netcdf +module unload hdf5 +module unload phdf5 +module load phdf5/1.8.7 +module load netcdf/4.1.3-par +module unload c++ +module load c++/12.1.0.0 diff --git a/arch/arch-PW6_VARGAS.fcm b/arch/arch-PW6_VARGAS.fcm new file mode 100644 index 0000000..71c17b5 --- /dev/null +++ b/arch/arch-PW6_VARGAS.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpCC_r +%FCOMPILER mpxlf2003_r +%LINKER mpCC_r + +%BASE_CFLAGS -qmkshrobj -qrtti +%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g +%DEBUG_CFLAGS -g -O0 -qfullpath + +%BASE_FFLAGS -qmkshrobj +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g +%DEBUG_FFLAGS -g -O0 -qfullpath + +%BASE_INC -D__NONE__ +%BASE_LD -lxlf90 + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-PW6_VARGAS.path b/arch/arch-PW6_VARGAS.path new file mode 100644 index 0000000..4567642 --- /dev/null +++ b/arch/arch-PW6_VARGAS.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="" +NETCDF_LIBDIR="" +NETCDF_LIB="" + +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_ADA.env b/arch/arch-X64_ADA.env new file mode 100644 index 0000000..e2a31cf --- /dev/null +++ b/arch/arch-X64_ADA.env @@ -0,0 +1,4 @@ +module unload netcdf +module unload hdf5 +#module load netcdf/mpi/4.1.3 +#module load hdf5/mpi/1.8.9 diff --git a/arch/arch-X64_ADA.fcm b/arch/arch-X64_ADA.fcm new file mode 100644 index 0000000..5eacae8 --- /dev/null +++ b/arch/arch-X64_ADA.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpiicc +%FCOMPILER mpiifort +%LINKER mpiifort -nofor-main + +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ -Wl,-rpath=/smplocal/pub/NetCDF/4.1.3/mpi/lib:/smplocal/pub/HDF5/1.8.9/par/lib + +%CPP mpiicc -EP +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_ADA.path b/arch/arch-X64_ADA.path new file mode 100644 index 0000000..0a5ce51 --- /dev/null +++ b/arch/arch-X64_ADA.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I/smplocal/pub/NetCDF/4.1.3/mpi/include" +NETCDF_LIBDIR="-L/smplocal/pub/NetCDF/4.1.3/mpi/lib" +NETCDF_LIB="-lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I/smplocal/pub/HDF5/1.8.9/par/include" +HDF5_LIBDIR="-L/smplocal/pub/HDF5/1.8.9/par/lib" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_CURIE.env b/arch/arch-X64_CURIE.env new file mode 100644 index 0000000..3a47f66 --- /dev/null +++ b/arch/arch-X64_CURIE.env @@ -0,0 +1,4 @@ +module unload netcdf +module unload hdf5 +module load hdf5/1.8.9_parallel +module load netcdf/4.2_hdf5_parallel diff --git a/arch/arch-X64_CURIE.fcm b/arch/arch-X64_CURIE.fcm new file mode 100644 index 0000000..2b40e61 --- /dev/null +++ b/arch/arch-X64_CURIE.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpicc +%FCOMPILER mpif90 +%LINKER mpif90 -nofor-main + +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP mpicc -EP +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_CURIE.path b/arch/arch-X64_CURIE.path new file mode 100644 index 0000000..c4b7d7c --- /dev/null +++ b/arch/arch-X64_CURIE.path @@ -0,0 +1,19 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I$HDF5_INC_DIR" +HDF5_LIBDIR="-L$HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" + +#only for MEMTRACK debuging : developper only +ADDR2LINE_LIBDIR="-L${WORKDIR}/ADDR2LINE_LIB" +ADDR2LINE_LIB="-laddr2line" diff --git a/arch/arch-X64_CURIE_GCC.env b/arch/arch-X64_CURIE_GCC.env new file mode 100644 index 0000000..eda4d81 --- /dev/null +++ b/arch/arch-X64_CURIE_GCC.env @@ -0,0 +1,8 @@ +module unload netcdf +module unload hdf5 +module load netcdf/4.2_hdf5_parallel +module load gnu/4.6.3 +export OMPI_CC=gcc +export OMPI_CXX=g++ +export OMPI_F77=gfortran +export OMPI_FC=gfortran diff --git a/arch/arch-X64_CURIE_GCC.fcm b/arch/arch-X64_CURIE_GCC.fcm new file mode 100644 index 0000000..d047ac5 --- /dev/null +++ b/arch/arch-X64_CURIE_GCC.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpicc +%FCOMPILER mpif90 +%LINKER mpif90 + +%BASE_CFLAGS -w +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 +%DEBUG_CFLAGS -g + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_CURIE_GCC.path b/arch/arch-X64_CURIE_GCC.path new file mode 100644 index 0000000..5626a28 --- /dev/null +++ b/arch/arch-X64_CURIE_GCC.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdff -lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_CURIE_PGI.env b/arch/arch-X64_CURIE_PGI.env new file mode 100644 index 0000000..4187b0a --- /dev/null +++ b/arch/arch-X64_CURIE_PGI.env @@ -0,0 +1,13 @@ +module unload netcdf +module unload hdf5 +module load netcdf/4.2_hdf5_parallel +#module unload intel +module unload pgi +module unload gnu +module load gnu/4.6.3 +module load pgi/12.6 + +export OMPI_CC=pgcc +export OMPI_CXX=pgcpp +export OMPI_F77=pgf77 +export OMPI_FC=pgf95 diff --git a/arch/arch-X64_CURIE_PGI.fcm b/arch/arch-X64_CURIE_PGI.fcm new file mode 100644 index 0000000..831450a --- /dev/null +++ b/arch/arch-X64_CURIE_PGI.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpicxx -noswitcherror +%FCOMPILER mpif90 -noswitcherror +%LINKER mpif90 -noswitcherror + +%BASE_CFLAGS -D__NONE__ +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 +%DEBUG_CFLAGS -g + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -pgcpplibs + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_CURIE_PGI.path b/arch/arch-X64_CURIE_PGI.path new file mode 100644 index 0000000..5626a28 --- /dev/null +++ b/arch/arch-X64_CURIE_PGI.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdff -lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_CURIE_VAMPIR.env b/arch/arch-X64_CURIE_VAMPIR.env new file mode 100644 index 0000000..327e39e --- /dev/null +++ b/arch/arch-X64_CURIE_VAMPIR.env @@ -0,0 +1,6 @@ +module unload netcdf +module unload hdf5 +module unload vampir +module load vampir/7.5 +module load hdf5/1.8.9_parallel +module load netcdf/4.2_hdf5_parallel diff --git a/arch/arch-X64_CURIE_VAMPIR.fcm b/arch/arch-X64_CURIE_VAMPIR.fcm new file mode 100644 index 0000000..e40091c --- /dev/null +++ b/arch/arch-X64_CURIE_VAMPIR.fcm @@ -0,0 +1,23 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER vtcc -vt:cc mpicc -vt:inst manual -DVTRACE +%FCOMPILER vtf90 -vt:f90 mpif90 -vt:inst manual -DVTRACE +%LINKER vtf90 -vt:f90 mpif90 -vt:inst manual -nofor-main -DVTRACE +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_CURIE_VAMPIR.path b/arch/arch-X64_CURIE_VAMPIR.path new file mode 100644 index 0000000..e9b9a0e --- /dev/null +++ b/arch/arch-X64_CURIE_VAMPIR.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L$NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I$HDF5_INC_DIR" +HDF5_LIBDIR="-L$HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_HORUS.env b/arch/arch-X64_HORUS.env new file mode 100644 index 0000000..a065dbf --- /dev/null +++ b/arch/arch-X64_HORUS.env @@ -0,0 +1,6 @@ +export HDF5_INC_DIR=$HOME/hdf5/include +export HDF5_LIB_DIR=$HOME/hdf5/lib + +export NETCDF_INC_DIR=$HOME/netcdf4/include +export NETCDF_LIB_DIR=$HOME/netcdf4/lib + diff --git a/arch/arch-X64_HORUS.fcm b/arch/arch-X64_HORUS.fcm new file mode 100644 index 0000000..cbfbc97 --- /dev/null +++ b/arch/arch-X64_HORUS.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpicc +%FCOMPILER mpif90 +%LINKER mpif90 + +%BASE_CFLAGS -w +%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 +%DEBUG_CFLAGS -g + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_HORUS.path b/arch/arch-X64_HORUS.path new file mode 100644 index 0000000..65c1176 --- /dev/null +++ b/arch/arch-X64_HORUS.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdff -lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I $HDF5_INC_DIR" +HDF5_LIBDIR="-L $HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_JADE.env b/arch/arch-X64_JADE.env new file mode 100644 index 0000000..06c9557 --- /dev/null +++ b/arch/arch-X64_JADE.env @@ -0,0 +1,12 @@ +module unload hdf5 +module unload zlib +module unload pnetcdf +module unload netcdf + +module load hdf5/1.8.9 +module load pnetcdf/1.3.0 +module load zlib/1.2.5 +module load netcdf_C/4.2.1.1 + +export NETCDF_INC_DIR="/opt/software/SGI/netcdf/C/4.2.1.1/include" +export NETCDF_LIB_DIR="/opt/software/SGI/netcdf/C/4.2.1.1/lib" diff --git a/arch/arch-X64_JADE.fcm b/arch/arch-X64_JADE.fcm new file mode 100644 index 0000000..00927ad --- /dev/null +++ b/arch/arch-X64_JADE.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER icc +%FCOMPILER ifort +%LINKER ifort + +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ -lifcore -lintlc -lmpi + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_JADE.path b/arch/arch-X64_JADE.path new file mode 100644 index 0000000..26ec954 --- /dev/null +++ b/arch/arch-X64_JADE.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="" +NETCDF_LIB="-lnetcdf -lpnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_TITANE.env b/arch/arch-X64_TITANE.env new file mode 100644 index 0000000..260ce7e --- /dev/null +++ b/arch/arch-X64_TITANE.env @@ -0,0 +1,4 @@ +module unload netcdf +module unload hdf5 +module load netcdf/4.2 +module load hdf5/1.8.8 diff --git a/arch/arch-X64_TITANE.fcm b/arch/arch-X64_TITANE.fcm new file mode 100644 index 0000000..97038f7 --- /dev/null +++ b/arch/arch-X64_TITANE.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpicc +%FCOMPILER mpif90 +%LINKER mpif90 -nofor-main + +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D __NONE__ +%BASE_LD -lstdc++ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_TITANE.path b/arch/arch-X64_TITANE.path new file mode 100644 index 0000000..fc522ec --- /dev/null +++ b/arch/arch-X64_TITANE.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdff -lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I $HDF5_INC_DIR" +HDF5_LIBDIR="-L $HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-X64_TITANE_VAMPIR.env b/arch/arch-X64_TITANE_VAMPIR.env new file mode 100644 index 0000000..260ce7e --- /dev/null +++ b/arch/arch-X64_TITANE_VAMPIR.env @@ -0,0 +1,4 @@ +module unload netcdf +module unload hdf5 +module load netcdf/4.2 +module load hdf5/1.8.8 diff --git a/arch/arch-X64_TITANE_VAMPIR.fcm b/arch/arch-X64_TITANE_VAMPIR.fcm new file mode 100644 index 0000000..abfe1dd --- /dev/null +++ b/arch/arch-X64_TITANE_VAMPIR.fcm @@ -0,0 +1,23 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER vtcc -vt:cc mpicc -vt:inst manual -DVTRACE +%FCOMPILER vtf90 -vt:f90 mpif90 -vt:inst manual -DVTRACE +%LINKER vtf90 -vt:f90 mpif90 -vt:inst manual -nofor-main -DVTRACE +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-X64_TITANE_VAMPIR.path b/arch/arch-X64_TITANE_VAMPIR.path new file mode 100644 index 0000000..fc522ec --- /dev/null +++ b/arch/arch-X64_TITANE_VAMPIR.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdff -lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="-I $HDF5_INC_DIR" +HDF5_LIBDIR="-L $HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-XE6_LYNX.env b/arch/arch-XE6_LYNX.env new file mode 100644 index 0000000..8790aeb --- /dev/null +++ b/arch/arch-XE6_LYNX.env @@ -0,0 +1,4 @@ +export HDF5_INC_DIR=$WORKDIR/hdf5/include +export HDF5_LIB_DIR=${CRAY_HDF5_DIR}/hdf5-parallel-cce/lib +export NETCDF_INC_DIR=${CRAY_NETCDF_DIR}/netcdf-hdf5parallel-cce/include +export NETCDF_LIB_DIR=${CRAY_NETCDF_DIR}/netcdf-hdf5parallel-cce/lib diff --git a/arch/arch-XE6_LYNX.fcm b/arch/arch-XE6_LYNX.fcm new file mode 100644 index 0000000..b1094c7 --- /dev/null +++ b/arch/arch-XE6_LYNX.fcm @@ -0,0 +1,24 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER CC +%FCOMPILER ftn +%LINKER CC + +%BASE_CFLAGS -DMPICH_SKIP_MPICXX -h msglevel_4 +%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -O2 +%DEBUG_CFLAGS -g + +%BASE_FFLAGS -em -m 4 +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -D__NONE__ + +%CPP cpp +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-XE6_LYNX.path b/arch/arch-XE6_LYNX.path new file mode 100644 index 0000000..fa5642c --- /dev/null +++ b/arch/arch-XE6_LYNX.path @@ -0,0 +1,15 @@ +NETCDF_INCDIR="-I $NETCDF_INC_DIR" +NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_LIB="-lnetcdf" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +#HDF5_INCDIR="-I $HDF5_INC_DIR" +HDF5_LIBDIR="-L $HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lz -lcurl" + +OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" diff --git a/arch/arch-ifort_LSCE.fcm b/arch/arch-ifort_LSCE.fcm new file mode 100644 index 0000000..d146074 --- /dev/null +++ b/arch/arch-ifort_LSCE.fcm @@ -0,0 +1,20 @@ +%CCOMPILER mpicc +%FCOMPILER mpif90 +%LINKER mpif90 -nofor-main + +%BASE_CFLAGS +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ + +%CPP mpicc -EP +%FPP cpp -P +%MAKE gmake diff --git a/arch/arch-ifort_LSCE.path b/arch/arch-ifort_LSCE.path new file mode 100644 index 0000000..6357d40 --- /dev/null +++ b/arch/arch-ifort_LSCE.path @@ -0,0 +1,6 @@ +NETCDF_INCDIR="-I /usr/local/install/netcdf-4.3.2p/include" +NETCDF_LIBDIR="-L/usr/local/install/netcdf-4.3.2p/lib" +NETCDF_LIB="-lnetcdf" +HDF5_INCDIR="-I /usr/local/install/hdf5-1.8.9p/include" +HDF5_LIBDIR="-L/usr/local/install/hdf5-1.8.9p/lib" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" diff --git a/bld.cfg b/bld.cfg new file mode 100644 index 0000000..bbe9373 --- /dev/null +++ b/bld.cfg @@ -0,0 +1,58 @@ +# ----------------------- FCM extract configuration file ----------------------- +cfg::type bld +cfg::version 1.0 + + +# ------------------------------------------------------------------------------ +# Build information +# ------------------------------------------------------------------------------ + +inc arch.fcm +inc config.fcm + +%CFLAGS %BASE_CFLAGS %COMPIL_CFLAGS +%FFLAGS %BASE_FFLAGS %COMPIL_FFLAGS +%LD_FLAGS %ARCH_LD %BASE_LD + + +dest::root $PWD + +bld::infile_ext::cpp C::SOURCE +bld::infile_ext::conf CPP::INCLUDE +bld::infile_ext::hpp CPP::INCLUDE + + +search_src true +src::zzz . +src::date $PWD/extern/boost/src/date_time +src::blitz $PWD/extern/blitz/src +src::netcdf $PWD/extern/netcdf4 +bld::lib xios +bld::target libxios.a +#bld::target generate_fortran_interface.exe +bld::target xios_server.exe test_client.exe parse_xml.exe test_complete.exe test_xios_interface.exe +bld::exe_dep + +bld::tool::cc %CCOMPILER +bld::tool::fc %FCOMPILER +bld::tool::fpp %FPP +bld::tool::cpp %CPP +bld::tool::cppflags %CBASE_INC -I${PWD}/extern/src_netcdf -I${PWD}/extern/boost/include -I${PWD}/extern/rapidxml/include -I${PWD}/extern/blitz/include +bld::tool::fppflags %BASE_INC -I${PWD}/extern/boost/include -I${PWD}/extern/rapidxml/include +bld::tool::ld %LINKER +bld::tool::ldflags %LD_FLAGS +bld::tool::cflags %CFLAGS %CBASE_INC -I${PWD}/extern/src_netcdf -I${PWD}/extern/boost/include -I${PWD}/extern/rapidxml/include -I${PWD}/extern/blitz/include +bld::tool::fflags %FFLAGS %FBASE_INC +bld::tool::cppkeys %CPP_KEY +bld::tool::fppkeys %CPP_KEY +bld::tool::make %MAKE + +# Pre-process code before analysing dependencies +bld::pp false +bld::pp::interface/fortran true +bld::pp::interface/fortran_attr true +bld::excl_dep use::mod_prism_get_comm +bld::excl_dep use::mod_prism_get_localcomm_proto +bld::excl_dep use::mod_prism_proto +bld::excl_dep use::mod_prism +bld::excl_dep inc::mpif.h diff --git a/doc/XIOS_reference_guide.pdf b/doc/XIOS_reference_guide.pdf new file mode 100755 index 0000000000000000000000000000000000000000..a06dd9cc45e6653e980555f9278664290fcca7cf GIT binary patch literal 197405 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�j?tSL@(JX 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%0A=46;Jm4o>dbhSX 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

I0g^9KNMr$ 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

F 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 S)5q|AkNpP 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 z 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 E2bfeIasU7T literal 0 HcmV?d00001 diff --git a/extern/src_netcdf4/attr.c b/extern/src_netcdf4/attr.c new file mode 100644 index 0000000..10bd63d --- /dev/null +++ b/extern/src_netcdf4/attr.c @@ -0,0 +1,1164 @@ +/* Do not edit this file. It is produced from the corresponding .m4 source */ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: attr.m4,v 2.39 2010/05/26 18:11:08 dmh Exp $ */ + +#include "nc.h" +#include "ncdispatch.h" +#include "nc3dispatch.h" +#include +#include +#include +#include "ncx.h" +#include "fbits.h" +#include "rnd.h" +#include "utf8proc.h" + + +/* + * Free attr + * Formerly +NC_free_attr() + */ +void +free_NC_attr(NC_attr *attrp) +{ + + if(attrp == NULL) + return; + free_NC_string(attrp->name); + free(attrp); +} + + +/* + * How much space will 'nelems' of 'type' take in + * external representation (as the values of an attribute)? + */ +static size_t +ncx_len_NC_attrV(nc_type type, size_t nelems) +{ + switch(type) { + case NC_BYTE: + case NC_CHAR: + return ncx_len_char(nelems); + case NC_SHORT: + return ncx_len_short(nelems); + case NC_INT: + return ncx_len_int(nelems); + case NC_FLOAT: + return ncx_len_float(nelems); + case NC_DOUBLE: + return ncx_len_double(nelems); + default: + assert("ncx_len_NC_attr bad type" == 0); + } + return 0; +} + + +NC_attr * +new_x_NC_attr( + NC_string *strp, + nc_type type, + size_t nelems) +{ + NC_attr *attrp; + const size_t xsz = ncx_len_NC_attrV(type, nelems); + size_t sz = M_RNDUP(sizeof(NC_attr)); + + assert(!(xsz == 0 && nelems != 0)); + + sz += xsz; + + attrp = (NC_attr *) malloc(sz); + if(attrp == NULL ) + return NULL; + + attrp->xsz = xsz; + + attrp->name = strp; + attrp->type = type; + attrp->nelems = nelems; + if(xsz != 0) + attrp->xvalue = (char *)attrp + M_RNDUP(sizeof(NC_attr)); + else + attrp->xvalue = NULL; + + return(attrp); +} + + +/* + * Formerly +NC_new_attr(name,type,count,value) + */ +static NC_attr * +new_NC_attr( + const char *uname, + nc_type type, + size_t nelems) +{ + NC_string *strp; + NC_attr *attrp; + + char *name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NULL; + assert(name != NULL && *name != 0); + + strp = new_NC_string(strlen(name), name); + free(name); + if(strp == NULL) + return NULL; + + attrp = new_x_NC_attr(strp, type, nelems); + if(attrp == NULL) + { + free_NC_string(strp); + return NULL; + } + + return(attrp); +} + + +static NC_attr * +dup_NC_attr(const NC_attr *rattrp) +{ + NC_attr *attrp = new_NC_attr(rattrp->name->cp, + rattrp->type, rattrp->nelems); + if(attrp == NULL) + return NULL; + (void) memcpy(attrp->xvalue, rattrp->xvalue, rattrp->xsz); + return attrp; +} + +/* attrarray */ + +/* + * Free the stuff "in" (referred to by) an NC_attrarray. + * Leaves the array itself allocated. + */ +void +free_NC_attrarrayV0(NC_attrarray *ncap) +{ + assert(ncap != NULL); + + if(ncap->nelems == 0) + return; + + assert(ncap->value != NULL); + + { + NC_attr **app = ncap->value; + NC_attr *const *const end = &app[ncap->nelems]; + for( /*NADA*/; app < end; app++) + { + free_NC_attr(*app); + *app = NULL; + } + } + ncap->nelems = 0; +} + + +/* + * Free NC_attrarray values. + * formerly +NC_free_array() + */ +void +free_NC_attrarrayV(NC_attrarray *ncap) +{ + assert(ncap != NULL); + + if(ncap->nalloc == 0) + return; + + assert(ncap->value != NULL); + + free_NC_attrarrayV0(ncap); + + free(ncap->value); + ncap->value = NULL; + ncap->nalloc = 0; +} + + +int +dup_NC_attrarrayV(NC_attrarray *ncap, const NC_attrarray *ref) +{ + int status = NC_NOERR; + + assert(ref != NULL); + assert(ncap != NULL); + + if(ref->nelems != 0) + { + const size_t sz = ref->nelems * sizeof(NC_attr *); + ncap->value = (NC_attr **) malloc(sz); + if(ncap->value == NULL) + return NC_ENOMEM; + + (void) memset(ncap->value, 0, sz); + ncap->nalloc = ref->nelems; + } + + ncap->nelems = 0; + { + NC_attr **app = ncap->value; + const NC_attr **drpp = (const NC_attr **)ref->value; + NC_attr *const *const end = &app[ref->nelems]; + for( /*NADA*/; app < end; drpp++, app++, ncap->nelems++) + { + *app = dup_NC_attr(*drpp); + if(*app == NULL) + { + status = NC_ENOMEM; + break; + } + } + } + + if(status != NC_NOERR) + { + free_NC_attrarrayV(ncap); + return status; + } + + assert(ncap->nelems == ref->nelems); + + return NC_NOERR; +} + + +/* + * Add a new handle on the end of an array of handles + * Formerly +NC_incr_array(array, tail) + */ +static int +incr_NC_attrarray(NC_attrarray *ncap, NC_attr *newelemp) +{ + NC_attr **vp; + + assert(ncap != NULL); + + if(ncap->nalloc == 0) + { + assert(ncap->nelems == 0); + vp = (NC_attr **) malloc(NC_ARRAY_GROWBY * sizeof(NC_attr *)); + if(vp == NULL) + return NC_ENOMEM; + + ncap->value = vp; + ncap->nalloc = NC_ARRAY_GROWBY; + } + else if(ncap->nelems +1 > ncap->nalloc) + { + vp = (NC_attr **) realloc(ncap->value, + (ncap->nalloc + NC_ARRAY_GROWBY) * sizeof(NC_attr *)); + if(vp == NULL) + return NC_ENOMEM; + + ncap->value = vp; + ncap->nalloc += NC_ARRAY_GROWBY; + } + + if(newelemp != NULL) + { + ncap->value[ncap->nelems] = newelemp; + ncap->nelems++; + } + return NC_NOERR; +} + + +NC_attr * +elem_NC_attrarray(const NC_attrarray *ncap, size_t elem) +{ + assert(ncap != NULL); + /* cast needed for braindead systems with signed size_t */ + if(ncap->nelems == 0 || (unsigned long) elem >= ncap->nelems) + return NULL; + + assert(ncap->value != NULL); + + return ncap->value[elem]; +} + +/* End attarray per se */ + +/* + * Given ncp and varid, return ptr to array of attributes + * else NULL on error + */ +static NC_attrarray * +NC_attrarray0( NC *ncp, int varid) +{ + NC_attrarray *ap; + + if(varid == NC_GLOBAL) /* Global attribute, attach to cdf */ + { + ap = &ncp->attrs; + } + else if(varid >= 0 && (size_t) varid < ncp->vars.nelems) + { + NC_var **vpp; + vpp = (NC_var **)ncp->vars.value; + vpp += varid; + ap = &(*vpp)->attrs; + } else { + ap = NULL; + } + return(ap); +} + + +/* + * Step thru NC_ATTRIBUTE array, seeking match on name. + * return match or NULL if Not Found or out of memory. + */ +NC_attr ** +NC_findattr(const NC_attrarray *ncap, const char *uname) +{ + NC_attr **attrpp; + size_t attrid; + size_t slen; + char *name; + + assert(ncap != NULL); + + if(ncap->nelems == 0) + return NULL; + + attrpp = (NC_attr **) ncap->value; + + /* normalized version of uname */ + name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NULL; /* TODO: need better way to indicate no memory */ + slen = strlen(name); + + for(attrid = 0; attrid < ncap->nelems; attrid++, attrpp++) + { + if(strlen((*attrpp)->name->cp) == slen && + strncmp((*attrpp)->name->cp, name, slen) == 0) + { + free(name); + return(attrpp); /* Normal return */ + } + } + free(name); + return(NULL); +} + + +/* + * Look up by ncid, varid and name, return NULL if not found + */ +static int +NC_lookupattr(int ncid, + int varid, + const char *name, /* attribute name */ + NC_attr **attrpp) /* modified on return */ +{ + int status; + NC *ncp; + NC_attrarray *ncap; + NC_attr **tmp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + ncap = NC_attrarray0(ncp, varid); + if(ncap == NULL) + return NC_ENOTVAR; + + tmp = NC_findattr(ncap, name); + if(tmp == NULL) + return NC_ENOTATT; + + if(attrpp != NULL) + *attrpp = *tmp; + + return ENOERR; +} + +/* Public */ + +int +NC3_inq_attname(int ncid, int varid, int attnum, char *name) +{ + int status; + NC *ncp; + NC_attrarray *ncap; + NC_attr *attrp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + ncap = NC_attrarray0(ncp, varid); + if(ncap == NULL) + return NC_ENOTVAR; + + attrp = elem_NC_attrarray(ncap, (size_t)attnum); + if(attrp == NULL) + return NC_ENOTATT; + + (void) strncpy(name, attrp->name->cp, attrp->name->nchars); + name[attrp->name->nchars] = 0; + + return NC_NOERR; +} + + +int +NC3_inq_attid(int ncid, int varid, const char *name, int *attnump) +{ + int status; + NC *ncp; + NC_attrarray *ncap; + NC_attr **attrpp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + ncap = NC_attrarray0(ncp, varid); + if(ncap == NULL) + return NC_ENOTVAR; + + + attrpp = NC_findattr(ncap, name); + if(attrpp == NULL) + return NC_ENOTATT; + + if(attnump != NULL) + *attnump = (int)(attrpp - ncap->value); + + return NC_NOERR; +} + +int +NC3_inq_att(int ncid, + int varid, + const char *name, /* input, attribute name */ + nc_type *datatypep, + size_t *lenp) +{ + int status; + NC_attr *attrp; + + status = NC_lookupattr(ncid, varid, name, &attrp); + if(status != NC_NOERR) + return status; + + if(datatypep != NULL) + *datatypep = attrp->type; + if(lenp != NULL) + *lenp = attrp->nelems; + + return NC_NOERR; +} + + +int +NC3_rename_att( int ncid, int varid, const char *name, const char *unewname) +{ + int status; + NC *ncp; + NC_attrarray *ncap; + NC_attr **tmp; + NC_attr *attrp; + NC_string *newStr, *old; + char *newname; /* normalized version */ + + /* sortof inline clone of NC_lookupattr() */ + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + return NC_EPERM; + + ncap = NC_attrarray0(ncp, varid); + if(ncap == NULL) + return NC_ENOTVAR; + + status = NC_check_name(unewname); + if(status != NC_NOERR) + return status; + + tmp = NC_findattr(ncap, name); + if(tmp == NULL) + return NC_ENOTATT; + attrp = *tmp; + /* end inline clone NC_lookupattr() */ + + if(NC_findattr(ncap, unewname) != NULL) + { + /* name in use */ + return NC_ENAMEINUSE; + } + + old = attrp->name; + newname = (char *)utf8proc_NFC((const unsigned char *)unewname); + if(newname == NULL) + return NC_EBADNAME; + if(NC_indef(ncp)) + { + newStr = new_NC_string(strlen(newname), newname); + free(newname); + if( newStr == NULL) + return NC_ENOMEM; + attrp->name = newStr; + free_NC_string(old); + return NC_NOERR; + } + /* else */ + status = set_NC_string(old, newname); + free(newname); + if( status != NC_NOERR) + return status; + + set_NC_hdirty(ncp); + + if(NC_doHsync(ncp)) + { + status = NC_sync(ncp); + if(status != NC_NOERR) + return status; + } + + return NC_NOERR; +} + +int +NC3_del_att(int ncid, int varid, const char *uname) +{ + int status; + NC *ncp; + NC_attrarray *ncap; + NC_attr **attrpp; + NC_attr *old = NULL; + int attrid; + size_t slen; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(!NC_indef(ncp)) + return NC_ENOTINDEFINE; + + ncap = NC_attrarray0(ncp, varid); + if(ncap == NULL) + return NC_ENOTVAR; + + { + char *name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NC_ENOMEM; + + /* sortof inline NC_findattr() */ + slen = strlen(name); + + attrpp = (NC_attr **) ncap->value; + for(attrid = 0; (size_t) attrid < ncap->nelems; attrid++, attrpp++) + { + if( slen == (*attrpp)->name->nchars && + strncmp(name, (*attrpp)->name->cp, slen) == 0) + { + old = *attrpp; + break; + } + } + free(name); + } + if( (size_t) attrid == ncap->nelems ) + return NC_ENOTATT; + /* end inline NC_findattr() */ + + /* shuffle down */ + for(attrid++; (size_t) attrid < ncap->nelems; attrid++) + { + *attrpp = *(attrpp + 1); + attrpp++; + } + *attrpp = NULL; + /* decrement count */ + ncap->nelems--; + + free_NC_attr(old); + + return NC_NOERR; +} + + +static int +ncx_pad_putn_Iuchar(void **xpp, size_t nelems, const uchar *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_uchar(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_uchar(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_uchar(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_uchar(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_uchar(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Iuchar invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Iuchar(const void **xpp, size_t nelems, uchar *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_uchar(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_uchar(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_uchar(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_uchar(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_uchar(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Iuchar invalid type" == 0); + } + return NC_EBADTYPE; +} + + +static int +ncx_pad_putn_Ischar(void **xpp, size_t nelems, const schar *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_schar(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_schar(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_schar(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_schar(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_schar(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Ischar invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Ischar(const void **xpp, size_t nelems, schar *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_schar(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_schar(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_schar(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_schar(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_schar(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Ischar invalid type" == 0); + } + return NC_EBADTYPE; +} + + +static int +ncx_pad_putn_Ishort(void **xpp, size_t nelems, const short *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_short(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_short(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_short(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_short(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_short(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Ishort invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Ishort(const void **xpp, size_t nelems, short *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_short(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_short(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_short(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_short(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_short(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Ishort invalid type" == 0); + } + return NC_EBADTYPE; +} + + +static int +ncx_pad_putn_Iint(void **xpp, size_t nelems, const int *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_int(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_int(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_int(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_int(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_int(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Iint invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Iint(const void **xpp, size_t nelems, int *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_int(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_int(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_int(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_int(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_int(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Iint invalid type" == 0); + } + return NC_EBADTYPE; +} + + +static int +ncx_pad_putn_Ifloat(void **xpp, size_t nelems, const float *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_float(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_float(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_float(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_float(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_float(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Ifloat invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Ifloat(const void **xpp, size_t nelems, float *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_float(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_float(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_float(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_float(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_float(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Ifloat invalid type" == 0); + } + return NC_EBADTYPE; +} + + +static int +ncx_pad_putn_Idouble(void **xpp, size_t nelems, const double *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_double(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_double(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_double(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_double(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_double(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Idouble invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Idouble(const void **xpp, size_t nelems, double *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_double(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_double(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_double(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_double(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_double(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Idouble invalid type" == 0); + } + return NC_EBADTYPE; +} + + +#ifdef IGNORE +static int +ncx_pad_putn_Ilong(void **xpp, size_t nelems, const long *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_long(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_long(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_long(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_long(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_long(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Ilong invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Ilong(const void **xpp, size_t nelems, long *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_long(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_long(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_long(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_long(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_long(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Ilong invalid type" == 0); + } + return NC_EBADTYPE; +} + +#endif + +static int +ncx_pad_putn_Ilonglong(void **xpp, size_t nelems, const longlong *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_putn_schar_longlong(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_putn_short_longlong(xpp, nelems, tp); + case NC_INT: + return ncx_putn_int_longlong(xpp, nelems, tp); + case NC_FLOAT: + return ncx_putn_float_longlong(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_putn_double_longlong(xpp, nelems, tp); + default: + assert("ncx_pad_putn_Ilonglong invalid type" == 0); + } + return NC_EBADTYPE; +} + +static int +ncx_pad_getn_Ilonglong(const void **xpp, size_t nelems, longlong *tp, nc_type type) +{ + switch(type) { + case NC_CHAR: + return NC_ECHAR; + case NC_BYTE: + return ncx_pad_getn_schar_longlong(xpp, nelems, tp); + case NC_SHORT: + return ncx_pad_getn_short_longlong(xpp, nelems, tp); + case NC_INT: + return ncx_getn_int_longlong(xpp, nelems, tp); + case NC_FLOAT: + return ncx_getn_float_longlong(xpp, nelems, tp); + case NC_DOUBLE: + return ncx_getn_double_longlong(xpp, nelems, tp); + default: + assert("ncx_pad_getn_Ilonglong invalid type" == 0); + } + return NC_EBADTYPE; +} + + + +/* Common dispatcher for put cases */ +static int +dispatchput(void **xpp, size_t nelems, const void* tp, + nc_type atype, nc_type memtype) +{ + switch (memtype) { + case NC_CHAR: + return ncx_pad_putn_text(xpp,nelems, (char *)tp); + case NC_BYTE: + return ncx_pad_putn_Ischar(xpp, nelems, (schar*)tp, atype); + case NC_SHORT: + return ncx_pad_putn_Ishort(xpp, nelems, (short*)tp, atype); + case NC_INT: + return ncx_pad_putn_Iint(xpp, nelems, (int*)tp, atype); + case NC_FLOAT: + return ncx_pad_putn_Ifloat(xpp, nelems, (float*)tp, atype); + case NC_DOUBLE: + return ncx_pad_putn_Idouble(xpp, nelems, (double*)tp, atype); + case NC_UBYTE: /*Synthetic*/ + return ncx_pad_putn_Iuchar(xpp,nelems, (uchar *)tp, atype); + case NC_INT64: + return ncx_pad_putn_Ilonglong(xpp, nelems, (longlong*)tp, atype); + case NC_NAT: + return NC_EBADTYPE; + default: + break; + } + return NC_EBADTYPE; +} + +int +NC3_put_att( + int ncid, + int varid, + const char *name, + nc_type type, + size_t nelems, + const void *value, + nc_type memtype) +{ + int status; + NC *ncp; + NC_attrarray *ncap; + NC_attr **attrpp; + NC_attr *old = NULL; + NC_attr *attrp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + return NC_EPERM; + + ncap = NC_attrarray0(ncp, varid); + if(ncap == NULL) + return NC_ENOTVAR; + + status = nc_cktype(type); + if(status != NC_NOERR) + return status; + + if(memtype == NC_NAT) memtype = type; + + if(memtype != NC_CHAR && type == NC_CHAR) + return NC_ECHAR; + if(memtype == NC_CHAR && type != NC_CHAR) + return NC_ECHAR; + + /* cast needed for braindead systems with signed size_t */ + if((unsigned long) nelems > X_INT_MAX) /* backward compat */ + return NC_EINVAL; /* Invalid nelems */ + + if(nelems != 0 && value == NULL) + return NC_EINVAL; /* Null arg */ + + attrpp = NC_findattr(ncap, name); + + /* 4 cases: exists X indef */ + + if(attrpp != NULL) { /* name in use */ + if(!NC_indef(ncp)) { + const size_t xsz = ncx_len_NC_attrV(type, nelems); + attrp = *attrpp; /* convenience */ + + if(xsz > attrp->xsz) return NC_ENOTINDEFINE; + /* else, we can reuse existing without redef */ + + attrp->xsz = xsz; + attrp->type = type; + attrp->nelems = nelems; + + if(nelems != 0) { + void *xp = attrp->xvalue; + status = dispatchput(&xp, nelems, (const void*)value, type, memtype); + } + + set_NC_hdirty(ncp); + + if(NC_doHsync(ncp)) { + const int lstatus = NC_sync(ncp); + /* + * N.B.: potentially overrides NC_ERANGE + * set by ncx_pad_putn_I$1 + */ + if(lstatus != ENOERR) return lstatus; + } + + return status; + } + /* else, redefine using existing array slot */ + old = *attrpp; + } else { + if(!NC_indef(ncp)) return NC_ENOTINDEFINE; + + if(ncap->nelems >= NC_MAX_ATTRS) return NC_EMAXATTS; + } + + status = NC_check_name(name); + if(status != NC_NOERR) return status; + + attrp = new_NC_attr(name, type, nelems); + if(attrp == NULL) return NC_ENOMEM; + + if(nelems != 0) { + void *xp = attrp->xvalue; + status = dispatchput(&xp, nelems, (const void*)value, type, memtype); + } + + if(attrpp != NULL) { + assert(old != NULL); + *attrpp = attrp; + free_NC_attr(old); + } else { + const int lstatus = incr_NC_attrarray(ncap, attrp); + /* + * N.B.: potentially overrides NC_ERANGE + * set by ncx_pad_putn_I$1 + */ + if(lstatus != NC_NOERR) { + free_NC_attr(attrp); + return lstatus; + } + } + return status; +} + +int +NC3_get_att( + int ncid, + int varid, + const char *name, + void *value, + nc_type memtype) +{ + int status; + NC_attr *attrp; + const void *xp; + + status = NC_lookupattr(ncid, varid, name, &attrp); + if(status != NC_NOERR) return status; + + if(attrp->nelems == 0) return NC_NOERR; + + if(memtype == NC_NAT) memtype = attrp->type; + + if(memtype != NC_CHAR && attrp->type == NC_CHAR) + return NC_ECHAR; + if(memtype == NC_CHAR && attrp->type != NC_CHAR) + return NC_ECHAR; + + xp = attrp->xvalue; + switch (memtype) { + case NC_CHAR: + return ncx_pad_getn_text(&xp, attrp->nelems , (char *)value); + case NC_BYTE: + return ncx_pad_getn_Ischar(&xp,attrp->nelems,(schar*)value,attrp->type); + case NC_SHORT: + return ncx_pad_getn_Ishort(&xp,attrp->nelems,(short*)value,attrp->type); + case NC_INT: + return ncx_pad_getn_Iint(&xp,attrp->nelems,(int*)value,attrp->type); + case NC_FLOAT: + return ncx_pad_getn_Ifloat(&xp,attrp->nelems,(float*)value,attrp->type); + case NC_DOUBLE: + return ncx_pad_getn_Idouble(&xp,attrp->nelems,(double*)value,attrp->type); + case NC_INT64: + return ncx_pad_getn_Ilonglong(&xp,attrp->nelems,(longlong*)value,attrp->type); + case NC_UBYTE: /* Synthetic */ + return ncx_pad_getn_Iuchar(&xp, attrp->nelems , (uchar *)value, attrp->type); + case NC_NAT: + return NC_EBADTYPE; + default: + break; + } + status = NC_EBADTYPE; + return status; +} + diff --git a/extern/src_netcdf4/cache.c b/extern/src_netcdf4/cache.c new file mode 100644 index 0000000..8fca3c3 --- /dev/null +++ b/extern/src_netcdf4/cache.c @@ -0,0 +1,369 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header$ + *********************************************************************/ +#include "ncdap3.h" +#include "dapodom.h" +#include "dapdump.h" + +static int iscacheableconstraint(DCEconstraint* con); + +/* Return 1 if we can reuse cached data to address + the current get_vara request; return 0 otherwise. + Target is in the constrained tree space. + Currently, if the target matches a cache that is not + a whole variable, then match is false. +*/ +int +iscached(NCDAPCOMMON* nccomm, CDFnode* target, NCcachenode** cachenodep) +{ + int i,j,found,index; + NCcache* cache; + NCcachenode* cachenode; + + found = 0; + if(target == NULL) goto done; + + /* Match the target variable against the prefetch, if any */ + /* Note that prefetches are always whole variable */ + cache = nccomm->cdf.cache; + cachenode = cache->prefetch; + if(cachenode!= NULL) { + for(found=0,i=0;ivars);i++) { + CDFnode* var = (CDFnode*)nclistget(cachenode->vars,i); + if(var == target) { + if(cachenodep) *cachenodep = cachenode; + found=1; + goto done; + } + } + } + + /*search other cache nodes starting at latest first */ + index = 0; + for(i=nclistlength(cache->nodes)-1;i>=0;i--) { + cachenode = (NCcachenode*)nclistget(cache->nodes,i); + /* We currently do not try to match constraints; + If the cachenode is constrained by more than + simple wholevariable projections, then skip it. + */ + if(!cachenode->wholevariable) continue; + for(found=0,j=0;jvars);j++) { + CDFnode* var = (CDFnode*)nclistget(cachenode->vars,j); + if(var == target) {found=1;index=i;break;} + } + if(found) break; + } + + if(found) { + ASSERT((cachenode != NULL)); + if(nclistlength(cache->nodes) > 1) { + /* Manage the cache nodes as LRU */ + nclistremove(cache->nodes,index); + nclistpush(cache->nodes,(ncelem)cachenode); + } + if(cachenodep) *cachenodep = cachenode; + } + +done: +#ifdef DEBUG +fprintf(stderr,"iscached: search: %s\n",makecdfpathstring3(target,".")); +if(found) + fprintf(stderr,"iscached: found: %s\n",dumpcachenode(cachenode)); +else + fprintf(stderr,"iscached: notfound\n"); +#endif + return found; +} + +/* Compute the set of prefetched data. + Notes: + 1. Even if caching is off, we will + still prefetch the small variables. + 2. All prefetches are whole variable fetches. + 3. If the data set is unconstrainable, we + will prefetch the whole thing +*/ +NCerror +prefetchdata3(NCDAPCOMMON* nccomm) +{ + int i,j; + NCerror ncstat = NC_NOERR; + NClist* allvars = nccomm->cdf.varnodes; + DCEconstraint* urlconstraint = nccomm->oc.dapconstraint; + NClist* vars = nclistnew(); + NCcachenode* cache = NULL; + DCEconstraint* newconstraint = NULL; + int isnc4 = FLAGSET(nccomm->controls,NCF_NC4); + + + if(FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE)) { + /* If we cannot constrain and caching is enabled, + then pull in everything */ + if(FLAGSET(nccomm->controls,NCF_CACHE)) { + for(i=0;icdf.cache->prefetch = NULL; + goto done; + } + } else { /* can do constraints */ + /* pull in those variables of sufficiently small size */ + for(i=0;inctype == NC_Sequence || dapinsequence(var)) continue; + } + + /* Compute the # of elements in the variable */ + for(j=0;jarray.dimset0);j++) { + CDFnode* dim = (CDFnode*)nclistget(var->array.dimset0,j); + nelems *= dim->dim.declsize; + } +if(SHOWFETCH) { +nclog(NCLOGDBG,"prefetch: %s=%lu",var->ncfullname,(unsigned long)nelems); +} + if(nelems <= nccomm->cdf.smallsizelimit) { + nclistpush(vars,(ncelem)var); +if(SHOWFETCH) { +nclog(NCLOGDBG,"prefetch: %s",var->ncfullname); +} + } + } + } + + /* If there are no vars, then do nothing */ + if(nclistlength(vars) == 0) { + nccomm->cdf.cache->prefetch = NULL; + goto done; + } + + /* Create a single constraint consisting of the projections for the variables; + each projection is whole variable. The selections are passed on as is. + */ + + newconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); + newconstraint->projections = nclistnew(); + newconstraint->selections = dceclonelist(urlconstraint->selections); + + for(i=0;iprojections,(ncelem)varprojection); + } +if(SHOWFETCH) { +char* s = dumpprojections(newconstraint->projections); +LOG1(NCLOGNOTE,"prefetch.final: %s",s); +nullfree(s); +} + ncstat = buildcachenode34(nccomm,newconstraint,vars,&cache,!isnc4); + newconstraint = NULL; /* buildcachenode34 takes control of newconstraint */ + if(ncstat) goto done; + cache->wholevariable = 1; /* All prefetches are whole variable */ + /* Make cache node be the prefetch node */ + nccomm->cdf.cache->prefetch = cache; +if(SHOWFETCH) { +LOG0(NCLOGNOTE,"prefetch.complete"); +} + +if(SHOWFETCH) { +char* s = NULL; +/* Log the set of prefetch variables */ +NCbytes* buf = ncbytesnew(); +ncbytescat(buf,"prefetch.vars: "); +for(i=0;ioc.conn; + OCobject ocroot = OCNULL; + CDFnode* dxdroot = NULL; + NCcachenode* cachenode = NULL; + char* ce = NULL; + + ce = buildconstraintstring3(constraint); + + ocstat = dap_fetch(nccomm,conn,ce,OCDATADDS,&ocroot); + nullfree(ce); + if(ocstat) {THROWCHK(ocerrtoncerr(ocstat)); goto done;} + + ncstat = buildcdftree34(nccomm,ocroot,OCDATA,&dxdroot); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* regrid */ + if(!FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE)) { + ncstat = regrid3(dxdroot,nccomm->cdf.ddsroot,constraint->projections); + if(ncstat) {THROWCHK(ncstat); goto done;} + } + + /* create the cache node */ + cachenode = createnccachenode(); + cachenode->prefetch = isprefetch; + cachenode->vars = nclistclone(varlist); + cachenode->datadds = dxdroot; + /* Give the constraint over to the cachenode */ + cachenode->constraint = constraint; + constraint = NULL; + cachenode->wholevariable = iscacheableconstraint(cachenode->constraint); + + /* save the root content*/ + cachenode->ocroot = ocroot; + cachenode->content = oc_data_new(conn); + ocstat = oc_data_root(conn,ocroot,cachenode->content); + if(ocstat) {THROWCHK(ocerrtoncerr(ocstat)); goto done;} + + /* capture the packet size */ + ocstat = oc_raw_xdrsize(conn,ocroot,&cachenode->xdrsize); + if(ocstat) {THROWCHK(ocerrtoncerr(ocstat)); goto done;} + +#ifdef DEBUG +fprintf(stderr,"buildcachenode: new cache node: %s\n", + dumpcachenode(cachenode)); +#endif + /* Insert into the cache. If not caching, then + remove any previous cache node + */ + if(!isprefetch) { + NCcache* cache = nccomm->cdf.cache; + if(cache->nodes == NULL) cache->nodes = nclistnew(); + /* remove cache nodes to get below the max cache size */ + while(cache->cachesize + cachenode->xdrsize > cache->cachelimit + && nclistlength(cache->nodes) > 0) { + NCcachenode* node = (NCcachenode*)nclistremove(cache->nodes,0); +#ifdef DEBUG +fprintf(stderr,"buildcachenode: purge cache node: %s\n", + dumpcachenode(cachenode)); +#endif + cache->cachesize -= node->xdrsize; + freenccachenode(nccomm,node); + } + /* Remove cache nodes to get below the max cache count */ + /* If not caching, then cachecount should be 0 */ + while(nclistlength(cache->nodes) > cache->cachecount) { + NCcachenode* node = (NCcachenode*)nclistremove(cache->nodes,0); +#ifdef DEBUG +fprintf(stderr,"buildcachenode: count purge cache node: %s\n", + dumpcachenode(node)); +#endif + cache->cachesize -= node->xdrsize; + freenccachenode(nccomm,node); + } + nclistpush(nccomm->cdf.cache->nodes,(ncelem)cachenode); + cache->cachesize += cachenode->xdrsize; + } + +#ifdef DEBUG +fprintf(stderr,"buildcachenode: %s\n",dumpcachenode(cachenode)); +#endif + +done: + if(constraint != NULL) dcefree((DCEnode*)constraint); + if(cachep) *cachep = cachenode; + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + if(ncstat) { + freecdfroot34(dxdroot); + freenccachenode(nccomm,cachenode); + } + return THROW(ncstat); +} + +NCcachenode* +createnccachenode(void) +{ + NCcachenode* mem = (NCcachenode*)calloc(1,sizeof(NCcachenode)); + return mem; +} + +void +freenccachenode(NCDAPCOMMON* nccomm, NCcachenode* node) +{ + if(node == NULL) return; + oc_data_free(nccomm->oc.conn,node->content); + dcefree((DCEnode*)node->constraint); + freecdfroot34(node->datadds); + nclistfree(node->vars); + nullfree(node); +} + +void +freenccache(NCDAPCOMMON* nccomm, NCcache* cache) +{ + int i; + if(cache == NULL) return; + freenccachenode(nccomm,cache->prefetch); + for(i=0;inodes);i++) { + freenccachenode(nccomm,(NCcachenode*)nclistget(cache->nodes,i)); + } + nclistfree(cache->nodes); + nullfree(cache); +} + +NCcache* +createnccache(void) +{ + NCcache* c = (NCcache*)calloc(1,sizeof(NCcache)); + c->cachelimit = DFALTCACHELIMIT; + c->cachesize = 0; + c->nodes = nclistnew(); + c->cachecount = DFALTCACHECOUNT; + return c; +} + +static int +iscacheableprojection(DCEprojection* proj) +{ + int i,cacheable; + if(proj->discrim != CES_VAR) return 0; + cacheable = 1; /* assume so */ + for(i=0;ivar->segments);i++) { + DCEsegment* segment = (DCEsegment*)nclistget(proj->var->segments,i); + if(!iswholesegment(segment)) {cacheable = 0; break;} + } + return cacheable; +} + +static int +iscacheableconstraint(DCEconstraint* con) +{ + int i; + if(con == NULL) return 1; + if(con->selections != NULL && nclistlength(con->selections) > 0) + return 0; /* cant deal with selections */ + for(i=0;iprojections);i++) { + if(!iscacheableprojection((DCEprojection*)nclistget(con->projections,i))) + return 0; + } + return 1; +} diff --git a/extern/src_netcdf4/cdf3.c b/extern/src_netcdf4/cdf3.c new file mode 100644 index 0000000..acb3c89 --- /dev/null +++ b/extern/src_netcdf4/cdf3.c @@ -0,0 +1,770 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/cdf3.c,v 1.33 2009/12/03 03:42:37 dmh Exp $ + *********************************************************************/ + +#include "ncdap3.h" +#include "daputil.h" +#include "dapdump.h" + +CDFnode* v4node = NULL; + +/* Forward*/ +static NCerror sequencecheck3r(CDFnode* node, NClist* vars, CDFnode* topseq); +static NCerror regrid3r(CDFnode*, CDFnode*, NClist*); +static NCerror testregrid3(CDFnode* node, CDFnode* template, NClist*); +static CDFnode* makenewgrid3(CDFnode* node, CDFnode* template); +static NCerror regridinsert(CDFnode* newgrid, CDFnode* node); +static NCerror regridremove(CDFnode* newgrid, CDFnode* node); +static NCerror mapnodes3r(CDFnode*, CDFnode*, int depth); +static NCerror mapfcn(CDFnode* dstnode, CDFnode* srcnode); +static NCerror definedimsetplus3(NCDAPCOMMON* nccomm, CDFnode* node); +static NCerror definedimsetall3(NCDAPCOMMON* nccomm, CDFnode* node); + +/* Accumulate useful node sets */ +NCerror +computecdfnodesets3(NCDAPCOMMON* nccomm) +{ + unsigned int i; + NClist* varnodes = nclistnew(); + NClist* allnodes = nccomm->cdf.ddsroot->tree->nodes; + + if(nccomm->cdf.seqnodes == NULL) nccomm->cdf.seqnodes = nclistnew(); + if(nccomm->cdf.gridnodes == NULL) nccomm->cdf.gridnodes = nclistnew(); + nclistclear(nccomm->cdf.seqnodes); + nclistclear(nccomm->cdf.gridnodes); + + computevarnodes3(nccomm,allnodes,varnodes); + nclistfree(nccomm->cdf.varnodes); + nccomm->cdf.varnodes = varnodes; + + /* Now compute other sets of interest */ + for(i=0;ivisible) continue; + switch (node->nctype) { + case NC_Sequence: + nclistpush(nccomm->cdf.seqnodes,(ncelem)node); + break; + case NC_Grid: + nclistpush(nccomm->cdf.gridnodes,(ncelem)node); + break; + default: break; + } + } + return NC_NOERR; +} + +NCerror +computevarnodes3(NCDAPCOMMON* nccomm, NClist* allnodes, NClist* varnodes) +{ + unsigned int i,len; + NClist* allvarnodes = nclistnew(); + for(i=0;iocname)) { + char* newname = dap_repairname(node->ocname); + nullfree(node->ocname); + node->ocname = newname; + } + if(!node->visible) continue; + if(node->nctype == NC_Primitive) + nclistpush(allvarnodes,(ncelem)node); + } + /* Further process the variable nodes to get the final set */ + /* Use toplevel vars first */ + len = nclistlength(allvarnodes); + for(i=0;icontrols,NCF_NCDAP)) + nclistpush(varnodes,(ncelem)node); + nclistset(allvarnodes,i,(ncelem)NULL); + } + } + /*... then all others */ + for(i=0;icdf.gridnodes; + + for(i=0;itree->nodes);i++) { + CDFnode* node = (CDFnode*)nclistget(root->tree->nodes,i); + node->elided = 0; + if(node->nctype == NC_Grid || node->nctype == NC_Dataset) + node->elided = 1; + } + + /* ensure all variables have an initial full name defined */ + for(i=0;incfullname); + var->ncfullname = makecdfpathstring3(var,nccomm->cdf.separator); +#ifdef DEBUG2 +fprintf(stderr,"var names: %s %s %s\n", + var->ocname,var->ncbasename,var->ncfullname); +#endif + } + + /* unify all variables with same fullname and dimensions + basevar fields says: "for duplicate grid variables"; + when does this happen? + */ + if(FLAGSET(nccomm->controls,NCF_NC3)) { + for(i=0;iarray.basevar != NULL) + continue; /* already processed */ + if(strcmp(var->ncfullname,testnode->ncfullname) != 0) + match = 0; + else if(nclistlength(testnode->array.dimsetall) + != nclistlength(var->array.dimsetall)) + match = 0; + else for(d=0;darray.dimsetall);d++) { + CDFnode* vdim = (CDFnode*)nclistget(var->array.dimsetall,d); + CDFnode* tdim = (CDFnode*)nclistget(testnode->array.dimsetall,d); + if(vdim->dim.declsize != tdim->dim.declsize) { + match = 0; + break; + } + } + if(match) { + testnode->array.basevar = var; +fprintf(stderr,"basevar invoked: %s\n",var->ncfullname); + } + } + } + } + + /* Finally, verify unique names */ + for(i=0;iarray.basevar != NULL) continue; + for(j=0;jarray.basevar != NULL) continue; + if(strcmp(var1->ncfullname,var2->ncfullname)==0) { + PANIC1("duplicate var names: %s",var1->ncfullname); + } + } + } + return NC_NOERR; +} + + +/* locate and connect usable sequences and vars. +A sequence is usable iff: +1. it has a path from one of its subnodes to a leaf and that + path does not contain a sequence. +2. No parent container has dimensions. +*/ + +NCerror +sequencecheck3(NCDAPCOMMON* nccomm) +{ + (void)sequencecheck3r(nccomm->cdf.ddsroot,nccomm->cdf.varnodes,NULL); + return NC_NOERR; +} + + +static NCerror +sequencecheck3r(CDFnode* node, NClist* vars, CDFnode* topseq) +{ + unsigned int i; + NCerror err = NC_NOERR; + int ok = 0; + if(topseq == NULL && nclistlength(node->array.dimset0) > 0) { + err = NC_EINVAL; /* This container has dimensions, so no sequence within it + can be usable */ + } else if(node->nctype == NC_Sequence) { + /* Recursively walk the path for each subnode of this sequence node + looking for a path without any sequence */ + for(i=0;isubnodes);i++) { + CDFnode* sub = (CDFnode*)nclistget(node->subnodes,i); + err = sequencecheck3r(sub,vars,node); + if(err == NC_NOERR) ok = 1; /* there is at least 1 usable var below */ + } + if(topseq == NULL && ok == 1) { + /* this sequence is usable because it has scalar container + (by construction) and has a path to a leaf without an intermediate + sequence. */ + err = NC_NOERR; + node->usesequence = 1; + } else { + /* this sequence is unusable because it has no path + to a leaf without an intermediate sequence. */ + node->usesequence = 0; + err = NC_EINVAL; + } + } else if(nclistcontains(vars,(ncelem)node)) { + /* If we reach a leaf, then topseq is usable, so save it */ + node->array.sequence = topseq; + } else { /* Some kind of non-sequence container node with no dimensions */ + /* recursively compute usability */ + for(i=0;isubnodes);i++) { + CDFnode* sub = (CDFnode*)nclistget(node->subnodes,i); + err = sequencecheck3r(sub,vars,topseq); + if(err == NC_NOERR) ok = 1; + } + err = (ok?NC_NOERR:NC_EINVAL); + } + return err; +} + +/* +OPeNDAP is in the process of changing servers so that +partial grids are converted to structures. However, not all +servers do this: some elide the grid altogether, which can +lead to ambiguities. Handle this last case by attempting to +convert the elided case to look like the newer structure +case. [for some reason, this code has been difficult to get +right; I have rewritten 6 times and it probably is still not +right.] + +Input is +(1) the root of the dds that needs to be re-gridded +(2) the full datadds tree that defines where the grids are. +(3) the projections that were used to produce (1) from (2). +*/ + +NCerror +regrid3(CDFnode* ddsroot, CDFnode* template, NClist* projections) +{ + NCerror ncstat = NC_NOERR; + NClist* newgrids = nclistnew(); + + /* The current regrid assumes that the ddsroot tree + has missing grids compared to the template. + It is also assumed that order of the nodes + in the ddsroot is the same as in the template. + */ + if(ddsroot->tree->regridded) return NC_NOERR; + +#ifdef DEBUG +fprintf(stderr,"regrid: ddsroot=%s\n",dumptree(ddsroot)); +fprintf(stderr,"regrid: template=%s\n",dumptree(template)); +#endif + + +#ifdef PROJECTED + /* turn off the projection tag for all nodes */ + unprojected3(template->tree->nodes); + /* Set the projection flag for all paths of all nodes + that are referenced in the projections that produced ddsroot. + This includes containers and subnodes. If there are no + projections then mark all nodes + */ + projectall3(template->tree->nodes); +#endif + + if(simplenodematch34(ddsroot,template)) { + ncstat = regrid3r(ddsroot,template,newgrids); + ddsroot->tree->regridded = 1; + } else + ncstat = NC_EINVAL; + nclistfree(newgrids); + return ncstat; +} + +#ifdef PROJECTED +static void +unprojected3(NClist* nodes) +{ + int i; + for(i=0;iprojected = 0; + } +} + +static void +projectall3(NClist* nodes) +{ + int i; + for(i=0;iprojected = 1; + } +} + +static void +projection3r(CDFnode* node) +{ + int i; + NClist* path = nclistnew(); + collectnodepath3(node,path,!WITHDATASET); + for(i=0;iprojected == 0) +fprintf(stderr,"projection: %s\n",makesimplepathstring3(pathnode)); +#endif + pathnode->projected = 1; + } + /* Now tag everything below me */ + for(i=0;isubnodes);i++) { + CDFnode* subnode = (CDFnode*)nclistget(node->subnodes,i); + projection3r(subnode); + } + nclistfree(path); +} +#endif /*PROJECTED*/ + +/* +Add in virtual structure nodes so that +old style constrainted DDS and DATADDS +look like the new style with structures. +*/ +static NCerror +regrid3r(CDFnode* node, CDFnode* template, NClist* gridnodes) +{ + unsigned int inode, itemp; + NCerror ncstat = NC_NOERR; + + /* Try to match node's subnodes to a subset of the + template subnodes + */ +#ifdef DEBUG +fprintf(stderr,"regrid: matched: %s -> %s\n", +node->ocname,template->ocname); +#endif + for(inode=0;inodesubnodes);inode++) { + CDFnode* subnode = (CDFnode*)nclistget(node->subnodes,inode); + int match = 0; + for(itemp=0;itempsubnodes);itemp++) { + CDFnode* subtemp = (CDFnode*)nclistget(template->subnodes,itemp); + if( +#ifdef PROJECTED + subtemp->projected && +#endif + simplenodematch34(subnode,subtemp)) { + ncstat = regrid3r(subnode,subtemp,gridnodes); + if(ncstat != NC_NOERR) return THROW(ncstat); + match = 1; +#ifdef PROJECTED + subtemp->projected = 0; /*make sure we dont reuse this node*/ +#endif + break; + } + } + if(!match) { /* subnode has no match */ + /* ok, see if we can regrid */ + for(itemp=0;itempsubnodes);itemp++) { + CDFnode* subtemp = (CDFnode*)nclistget(template->subnodes,itemp); +#ifdef DEBUG +fprintf(stderr,"regrid: inside: %s.%s :: %s.%s\n", +node->ocname,subnode->ocname, +template->ocname,subtemp->ocname); +#endif + if(subtemp->nctype != NC_Grid) + continue; +#ifdef PROJECTED + if(!subtemp->projected) continue; +#endif + ncstat = testregrid3(subnode,subtemp,gridnodes); + if(ncstat == NC_NOERR) {match=1; break;} + } + if(!match) {/* really no match */ + ncstat = THROW(NC_EDDS); /* no match */ + } + } + } + return THROW(ncstat); +} + +/* See if this node can match a subnode of the template + as a grid, and if so, then rebuild the node graph. +*/ +static NCerror +testregrid3(CDFnode* node, CDFnode* template, NClist* gridnodes) +{ + int i,match; + NCerror ncstat = NC_NOERR; + ASSERT((template->nctype == NC_Grid)); + { /* try to match inside the grid */ + for(match=0,i=0;isubnodes);i++) { + CDFnode* gridelem = (CDFnode*)nclistget(template->subnodes,i); + if(!simplenodematch34(gridelem,node)) + continue; + ncstat = regrid3r(node,gridelem,gridnodes); + if(ncstat == NC_NOERR) { + /* create new grid node if not already created */ + CDFnode* newgrid = NULL; + match = 1; + for(i=0;itemplate == template) break; + newgrid = NULL; + } + if(newgrid == NULL) { + newgrid = makenewgrid3(node,template); + if(newgrid == NULL) {ncstat = NC_ENOMEM; goto done;} + /* Insert the grid into node's parent */ + regridinsert(newgrid,node); + nclistpush(gridnodes,(ncelem)newgrid); + nclistpush(node->root->tree->nodes,(ncelem)newgrid); + } + regridremove(newgrid, node); + node->container = newgrid; + nclistpush(newgrid->subnodes,(ncelem)node); + break; /* done with node */ + } + } + } + if(!match) ncstat = NC_EDDS; +done: + return ncstat; +} + + +static CDFnode* +makenewgrid3(CDFnode* node, CDFnode* template) +{ + CDFnode* newgrid; + newgrid = (CDFnode*)calloc(1,sizeof(CDFnode)); + if(newgrid == NULL) return NULL; + memset((void*)newgrid,0,sizeof(CDFnode)); + newgrid->virtual = 1; + newgrid->ocname = nulldup(template->ocname); + newgrid->ncbasename = nulldup(template->ncbasename); + newgrid->nctype = NC_Grid; + newgrid->subnodes = nclistnew(); + newgrid->container = node->container; + newgrid->template = template; + return newgrid; +} + +static NCerror +regridinsert(CDFnode* newgrid, CDFnode* node) +{ + int i; + CDFnode* parent; + /* Locate the index of the node in its current parent */ + parent = node->container; + for(i=0;isubnodes);i++) { + CDFnode* subnode = (CDFnode*)nclistget(parent->subnodes,i); + if(subnode == node) { + /* Insert the grid right before this node */ + nclistinsert(parent->subnodes,i,(ncelem)newgrid); + return NC_NOERR; + } + } + PANIC("regridinsert failure"); + return NC_EINVAL; +} + +static NCerror +regridremove(CDFnode* newgrid, CDFnode* node) +{ + int i; + CDFnode* parent; + /* Locate the index of the node in its current parent and remove */ + parent = node->container; + for(i=0;isubnodes);i++) { + CDFnode* subnode = (CDFnode*)nclistget(parent->subnodes,i); + if(subnode == node) { + nclistremove(parent->subnodes,i); + return NC_NOERR; + } + } + PANIC("regridremove failure"); + return NC_EINVAL; +} + +/** + +Make the constrained dds nodes (root) +point to the corresponding unconstrained +dds nodes (fullroot). + */ + +NCerror +mapnodes3(CDFnode* root, CDFnode* fullroot) +{ + NCerror ncstat = NC_NOERR; + ASSERT(root != NULL && fullroot != NULL); + if(!simplenodematch34(root,fullroot)) + {THROWCHK(ncstat=NC_EINVAL); goto done;} + /* clear out old associations*/ + unmap3(root); + ncstat = mapnodes3r(root,fullroot,0); +done: + return ncstat; +} + +static NCerror +mapnodes3r(CDFnode* connode, CDFnode* fullnode, int depth) +{ + unsigned int i,j; + NCerror ncstat = NC_NOERR; + + ASSERT((simplenodematch34(connode,fullnode))); + +#ifdef DEBUG +{ +char* path1 = makecdfpathstring3(fullnode,"."); +char * path2 = makecdfpathstring3(connode,"."); +fprintf(stderr,"mapnode: %s->%s\n",path1,path2); +nullfree(path1); nullfree(path2); +} +#endif + + /* Map node */ + mapfcn(connode,fullnode); + + /* Try to match connode subnodes against fullnode subnodes */ + ASSERT(nclistlength(connode->subnodes) <= nclistlength(fullnode->subnodes)); + + for(i=0;isubnodes);i++) { + CDFnode* consubnode = (CDFnode*)nclistget(connode->subnodes,i); + /* Search full subnodes for a matching subnode from con */ + for(j=0;jsubnodes);j++) { + CDFnode* fullsubnode = (CDFnode*)nclistget(fullnode->subnodes,j); + if(simplenodematch34(fullsubnode,consubnode)) { + ncstat = mapnodes3r(consubnode,fullsubnode,depth+1); + if(ncstat) goto done; + } + } + } +done: + return THROW(ncstat); +} + + +/* The specific actions of a map are defined + by this function. +*/ +static NCerror +mapfcn(CDFnode* dstnode, CDFnode* srcnode) +{ + /* Mark node as having been mapped */ + dstnode->visible = 1; + dstnode->basenode = srcnode; + return NC_NOERR; +} + +void +unmap3(CDFnode* root) +{ + unsigned int i; + CDFtree* tree = root->tree; + for(i=0;inodes);i++) { + CDFnode* node = (CDFnode*)nclistget(tree->nodes,i); + node->basenode = NULL; + node->visible = 0; + } +} + +/* +Move dimension data from basenodes to nodes +*/ + +NCerror +dimimprint3(NCDAPCOMMON* nccomm) +{ + NCerror ncstat = NC_NOERR; + NClist* allnodes; + int i,j; + CDFnode* basenode; + + allnodes = nccomm->cdf.ddsroot->tree->nodes; + for(i=0;ibasenode; + if(basenode == NULL) continue; + noderank = nclistlength(node->array.dimset0); + baserank = nclistlength(basenode->array.dimset0); + if(noderank == 0) continue; + ASSERT(noderank == baserank); +#ifdef DEBUG +fprintf(stderr,"dimimprint %s/%d -> %s/%d\n", + makecdfpathstring3(basenode,"."), + noderank, + makecdfpathstring3(node,"."), + baserank); +#endif + for(j=0;jarray.dimset0,j); + CDFnode* basedim = (CDFnode*)nclistget(basenode->array.dimset0,j); + dim->dim.declsize0 = basedim->dim.declsize; +#ifdef DEBUG +fprintf(stderr,"dimimprint: %d: %lu -> %lu\n",i,basedim->dim.declsize,dim->dim.declsize0); +#endif + } + } + return ncstat; +} + +static CDFnode* +clonedim(NCDAPCOMMON* nccomm, CDFnode* dim, CDFnode* var) +{ + CDFnode* clone; + clone = makecdfnode34(nccomm,dim->ocname,OC_Dimension, + OCNULL,dim->container); + /* Record its existence */ + nclistpush(dim->container->root->tree->nodes,(ncelem)clone); + clone->dim = dim->dim; /* copy most everything */ + clone->dim.dimflags |= CDFDIMCLONE; + clone->dim.array = var; + return clone; +} + +static NClist* +clonedimset3(NCDAPCOMMON* nccomm, NClist* dimset, CDFnode* var) +{ + NClist* result = nclistnew(); + int i; + for(i=0;iarray.dimsetplus == NULL); + if(node->array.dimset0 == NULL) + dimset = nclistnew(); + else { /* copy the dimset0 into dimset */ + dimset = nclistclone(node->array.dimset0); + } + /* Insert the sequence or string dims */ + if(node->array.stringdim != NULL) { + clone = node->array.stringdim; + nclistpush(dimset,(ncelem)clone); + } + if(node->array.seqdim != NULL) { + clone = node->array.seqdim; + nclistpush(dimset,(ncelem)clone); + } + node->array.dimsetplus = dimset; + return ncstat; +} + +/* Define the dimsetall list for a node */ +static NCerror +definedimsetall3(NCDAPCOMMON* nccomm, CDFnode* node) +{ + int i; + int ncstat = NC_NOERR; + NClist* dimsetall; + + ASSERT(node->array.dimsetall == NULL); + if(node->container != NULL) { + if(node->container->array.dimsetall == NULL) { +#ifdef DEBUG1 +fprintf(stderr,"dimsetall: recurse %s\n",node->container->ocname); +#endif + ncstat = definedimsetall3(nccomm,node->container); + if(ncstat != NC_NOERR) return ncstat; + } + /* We need to clone the parent dimensions because we will be assigning + indices vis-a-vis this variable */ + dimsetall = clonedimset3(nccomm,node->container->array.dimsetall,node); + } else + dimsetall = nclistnew(); + /* concat parentall and dimset;*/ + for(i=0;iarray.dimsetplus);i++) { + CDFnode* clone = (CDFnode*)nclistget(node->array.dimsetplus,i); + nclistpush(dimsetall,(ncelem)clone); + } + node->array.dimsetall = dimsetall; +#ifdef DEBUG1 +fprintf(stderr,"dimsetall: |%s|=%d\n",node->ocname,nclistlength(dimsetall)); +#endif + return ncstat; +} + +/* Define the dimsetplus and dimsetall lists for + all nodes with dimensions +*/ +NCerror +definedimsets3(NCDAPCOMMON* nccomm) +{ + int i; + int ncstat = NC_NOERR; + NClist* allnodes = nccomm->cdf.ddsroot->tree->nodes; + + for(i=0;inctype == NC_Dimension) continue; /* ignore */ + ASSERT((rankednode->array.dimsetplus == NULL)); + ncstat = definedimsetplus3(nccomm,rankednode); + if(ncstat != NC_NOERR) return ncstat; + } + for(i=0;inctype == NC_Dimension) continue; /*ignore*/ + ASSERT((rankednode->array.dimsetall == NULL)); + ASSERT((rankednode->array.dimsetplus != NULL)); + ncstat = definedimsetall3(nccomm,rankednode); + if(ncstat != NC_NOERR) return ncstat; + } + return NC_NOERR; +} + diff --git a/extern/src_netcdf4/ceconstraints.h b/extern/src_netcdf4/ceconstraints.h new file mode 100644 index 0000000..8ec2c0d --- /dev/null +++ b/extern/src_netcdf4/ceconstraints.h @@ -0,0 +1,31 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + *********************************************************************/ +/* $Header$ */ + +#ifndef CECONSTRAINTS_H +#define CECONSTRAINTS_H + +#ifndef NC_MAX_VAR_DIMS +#define NC_MAX_VAR_DIMS 1024 +#endif + +typedef enum CEops { +CEO_NIL=0,CEO_EQ=1,CEO_NEQ=2,CEO_GE=3,CEO_GT=4,CEO_LT=5,CEO_LE=6,CEO_RE=7 +} CEops; + +/* Must match NCCops */ +#define OPSTRINGS {"?","=","!=",">=",">","<=","<","=~"} + +typedef enum CEsort { +CES_NIL=0, +CES_STR=8,CES_INT=9,CES_FLOAT=10, +CES_VAR=11,CES_FCN=12,CES_CONST=13, +CES_SELECT=14, CES_PROJECT=15, +CES_SEGMENT=16, CES_CONSTRAINT=17, +CES_VALUE=18, CES_SLICE=19 +} CEsort; + +#endif /*CECONSTRAINTS_H*/ + diff --git a/extern/src_netcdf4/common34.c b/extern/src_netcdf4/common34.c new file mode 100644 index 0000000..c7159c4 --- /dev/null +++ b/extern/src_netcdf4/common34.c @@ -0,0 +1,924 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/common34.c,v 1.29 2010/05/25 13:53:02 ed Exp $ + *********************************************************************/ + +#include "ncdap3.h" + +#ifdef HAVE_GETRLIMIT +# ifdef HAVE_SYS_RESOURCE_H +# include +# endif +# ifdef HAVE_SYS_RESOURCE_H +# include +# endif +#endif +#include "dapdump.h" + +extern CDFnode* v4node; + +/* Define the set of protocols known to be constrainable */ +static char* constrainableprotocols[] = {"http", "https",NULL}; +static NCerror buildcdftree34r(NCDAPCOMMON*,OCobject,CDFnode*,CDFtree*,CDFnode**); +static void defdimensions(OCobject, CDFnode*, NCDAPCOMMON*, CDFtree*); +static NCerror attachsubset34r(CDFnode*, CDFnode*); +static void free1cdfnode34(CDFnode* node); + +/* Define Procedures that are common to both + libncdap3 and libncdap4 +*/ + +/* Ensure every node has an initial base name defined and fullname */ +/* Exceptions: anonymous dimensions. */ +static NCerror +fix1node34(NCDAPCOMMON* nccomm, CDFnode* node) +{ + if(node->nctype == NC_Dimension && node->ocname == NULL) return NC_NOERR; + ASSERT((node->ocname != NULL)); + nullfree(node->ncbasename); + node->ncbasename = cdflegalname3(node->ocname); + if(node->ncbasename == NULL) return NC_ENOMEM; + nullfree(node->ncfullname); + node->ncfullname = makecdfpathstring3(node,nccomm->cdf.separator); + if(node->ncfullname == NULL) return NC_ENOMEM; + if(node->nctype == NC_Primitive) + node->externaltype = nctypeconvert(nccomm,node->etype); + return NC_NOERR; +} + +NCerror +fixnodes34(NCDAPCOMMON* nccomm, NClist* cdfnodes) +{ + int i; + for(i=0;isubnodes); + array = (CDFnode*)nclistget(grid->subnodes,0); + if(nccomm->controls.flags & (NCF_NC3)) { + /* Rename grid Array: variable, but leave its oc base name alone */ + nullfree(array->ncbasename); + array->ncbasename = nulldup(grid->ncbasename); + if(!array->ncbasename) return NC_ENOMEM; + } + /* validate and modify the grid structure */ + if((glen-1) != nclistlength(array->array.dimset0)) goto invalid; + for(i=1;iarray.dimset0,i-1); + CDFnode* map = (CDFnode*)nclistget(grid->subnodes,i); + CDFnode* mapdim; + /* map must have 1 dimension */ + if(nclistlength(map->array.dimset0) != 1) goto invalid; + /* and the map name must match the ith array dimension */ + if(arraydim->ocname != NULL && map->ocname != NULL + && strcmp(arraydim->ocname,map->ocname) != 0) + goto invalid; + /* and the map name must match its dim name (if any) */ + mapdim = (CDFnode*)nclistget(map->array.dimset0,0); + if(mapdim->ocname != NULL && map->ocname != NULL + && strcmp(mapdim->ocname,map->ocname) != 0) + goto invalid; + /* Add appropriate names for the anonymous dimensions */ + /* Do the map name first, so the array dim may inherit */ + if(mapdim->ocname == NULL) { + nullfree(mapdim->ncbasename); + mapdim->ocname = nulldup(map->ocname); + if(!mapdim->ocname) return NC_ENOMEM; + mapdim->ncbasename = cdflegalname3(mapdim->ocname); + if(!mapdim->ncbasename) return NC_ENOMEM; + } + if(arraydim->ocname == NULL) { + nullfree(arraydim->ncbasename); + arraydim->ocname = nulldup(map->ocname); + if(!arraydim->ocname) return NC_ENOMEM; + arraydim->ncbasename = cdflegalname3(arraydim->ocname); + if(!arraydim->ncbasename) return NC_ENOMEM; + } + if(FLAGSET(nccomm->controls,(NCF_NCDAP|NCF_NC3))) { + char tmp[3*NC_MAX_NAME]; + /* Add the grid name to the basename of the map */ + snprintf(tmp,sizeof(tmp),"%s%s%s",map->container->ncbasename, + nccomm->cdf.separator, + map->ncbasename); + nullfree(map->ncbasename); + map->ncbasename = nulldup(tmp); + if(!map->ncbasename) return NC_ENOMEM; + } + } + return NC_NOERR; +invalid: + return NC_EINVAL; /* mal-formed grid */ +} + +/** + * Given an anonymous dimension, compute the + * effective 0-based index wrt to the specified var. + * The result should mimic the libnc-dap indices. + */ + +static void +computedimindexanon3(CDFnode* dim, CDFnode* var) +{ + int i; + NClist* dimset = var->array.dimsetall; + for(i=0;idim.index1=i+1; + return; + } + } +} + +/* Replace dims in a list with their corresponding basedim */ +static void +replacedims(NClist* dims) +{ + int i; + for(i=0;idim.basedim; + if(basedim == NULL) continue; + nclistset(dims,i,(ncelem)basedim); + } +} + +/** + Two dimensions are equivalent if + 1. they have the same size + 2. neither are anonymous + 3. they ave the same names. + */ +static int +equivalentdim(CDFnode* basedim, CDFnode* dupdim) +{ + if(dupdim->dim.declsize != basedim->dim.declsize) return 0; + if(basedim->ocname == NULL && dupdim->ocname == NULL) return 0; + if(basedim->ocname == NULL || dupdim->ocname == NULL) return 0; + if(strcmp(dupdim->ocname,basedim->ocname) != 0) return 0; + return 1; +} + +/* + Provide short and/or unified names for dimensions. + This must mimic lib-ncdap, which is difficult. +*/ +NCerror +computecdfdimnames34(NCDAPCOMMON* nccomm) +{ + int i,j; + char tmp[NC_MAX_NAME*2]; + NClist* conflicts = nclistnew(); + NClist* varnodes = nccomm->cdf.varnodes; + NClist* alldims; + NClist* basedims; + + /* Collect all dimension nodes from dimsetall lists */ + + alldims = getalldims34(nccomm,0); + + /* Assign an index to all anonymous dimensions + vis-a-vis its containing variable + */ + for(i=0;iarray.dimsetall);j++) { + CDFnode* dim = (CDFnode*)nclistget(var->array.dimsetall,j); + if(dim->ocname != NULL) continue; /* not anonymous */ + computedimindexanon3(dim,var); + } + } + + /* Unify dimensions by defining one dimension as the "base" + dimension, and make all "equivalent" dimensions point to the + base dimension. + 1. Equivalent means: same size and both have identical non-null names. + 2. Dims with same name but different sizes will be handled separately + */ + for(i=0;idim.basedim != NULL) continue; /* already processed*/ + for(j=i+1;jdim.basedim != NULL) continue; /* already processed */ + if(!equivalentdim(basedim,dupdim)) + continue; + dupdim->dim.basedim = basedim; /* equate */ +#ifdef DEBUG1 +fprintf(stderr,"assign: %s/%s -> %s/%s\n", +basedim->dim.array->ocname,basedim->ocname, +dupdim->dim.array->ocname,dupdim->ocname +); +#endif + } + } + + /* Next case: same name and different sizes*/ + /* => rename second dim */ + + for(i=0;idim.basedim != NULL) continue; + /* Collect all conflicting dimensions */ + nclistclear(conflicts); + for(j=i+1;jdim.basedim != NULL) continue; + if(dim->ocname == NULL && basedim->ocname == NULL) continue; + if(dim->ocname == NULL || basedim->ocname == NULL) continue; + if(strcmp(dim->ocname,basedim->ocname)!=0) continue; + if(dim->dim.declsize == basedim->dim.declsize) continue; +#ifdef DEBUG2 +fprintf(stderr,"conflict: %s[%lu] %s[%lu]\n", + basedim->ncfullname,(unsigned long)basedim->dim.declsize, + dim->ncfullname,(unsigned long)dim->dim.declsize); +#endif + nclistpush(conflicts,(ncelem)dim); + } + /* Give all the conflicting dimensions an index */ + for(j=0;jdim.index1 = j+1; + } + } + nclistfree(conflicts); + + /* Replace all non-base dimensions with their base dimension */ + for(i=0;iarray.dimsetall); + replacedims(node->array.dimsetplus); + replacedims(node->array.dimset0); + } + + /* Collect list of all basedims */ + basedims = nclistnew(); + for(i=0;idim.basedim == NULL) { + if(!nclistcontains(basedims,(ncelem)dim)) { + nclistpush(basedims,(ncelem)dim); + } + } + } + + nccomm->cdf.dimnodes = basedims; + + /* cleanup */ + nclistfree(alldims); + + /* Assign ncbasenames and ncfullnames to base dimensions */ + for(i=0;idim.array; + if(dim->dim.basedim != NULL) PANIC1("nonbase basedim: %s\n",dim->ocname); + /* stringdim names are already assigned */ + if(dim->ocname == NULL) { /* anonymous: use the index to compute the name */ + snprintf(tmp,sizeof(tmp),"%s_%d", + var->ncfullname,dim->dim.index1-1); + nullfree(dim->ncbasename); + dim->ncbasename = cdflegalname3(tmp); + nullfree(dim->ncfullname); + dim->ncfullname = nulldup(dim->ncbasename); + } else { /* !anonymous; use index1 if defined */ + char* legalname = cdflegalname3(dim->ocname); + nullfree(dim->ncbasename); + if(dim->dim.index1 > 0) {/* need to fix conflicting names (see above) */ + char sindex[64]; + snprintf(sindex,sizeof(sindex),"_%d",dim->dim.index1); + dim->ncbasename = (char*)malloc(strlen(sindex)+strlen(legalname)+1); + if(dim->ncbasename == NULL) return NC_ENOMEM; + strcpy(dim->ncbasename,legalname); + strcat(dim->ncbasename,sindex); + nullfree(legalname); + } else {/* standard case */ + dim->ncbasename = legalname; + } + nullfree(dim->ncfullname); + dim->ncfullname = nulldup(dim->ncbasename); + } + } + + /* Verify unique and defined names for dimensions*/ + for(i=0;idim.basedim != NULL) PANIC1("nonbase basedim: %s\n",dim1->ncbasename); + if(dim1->ncbasename == NULL || dim1->ncfullname == NULL) + PANIC1("missing dim names: %s",dim1->ocname); + /* search backward so we can delete duplicates */ + for(j=nclistlength(basedims)-1;j>i;j--) { + CDFnode* dim2 = (CDFnode*)nclistget(basedims,j); + if(strcmp(dim1->ncfullname,dim2->ncfullname)==0) { + /* complain and suppress one of them */ + fprintf(stderr,"duplicate dim names: %s[%lu] %s[%lu]\n", + dim1->ncfullname,(unsigned long)dim1->dim.declsize, + dim2->ncfullname,(unsigned long)dim2->dim.declsize); + nclistremove(basedims,j); + } + } + } + +#ifdef DEBUG +for(i=0;incfullname,(long)dim->dim.declsize); + } +#endif + + return NC_NOERR; +} + +NCerror +makegetvar34(NCDAPCOMMON* nccomm, CDFnode* var, void* data, nc_type dsttype, Getvara** getvarp) +{ + Getvara* getvar; + NCerror ncstat = NC_NOERR; + + getvar = (Getvara*)calloc(1,sizeof(Getvara)); + MEMCHECK(getvar,NC_ENOMEM); + if(getvarp) *getvarp = getvar; + + getvar->target = var; + getvar->memory = data; + getvar->dsttype = dsttype; + getvar->target = var; + if(ncstat) nullfree(getvar); + return ncstat; +} + +int +constrainable34(NC_URI* durl) +{ + char** protocol = constrainableprotocols; + for(;*protocol;protocol++) { + if(strcmp(durl->protocol,*protocol)==0) + return 1; + } + return 0; +} + +CDFnode* +makecdfnode34(NCDAPCOMMON* nccomm, char* name, OCtype octype, + /*optional*/ OCobject ocnode, CDFnode* container) +{ + CDFnode* node; + assert(nccomm != NULL); + node = (CDFnode*)calloc(1,sizeof(CDFnode)); + if(node == NULL) return (CDFnode*)NULL; + + node->ocname = NULL; + if(name) { + size_t len = strlen(name); + if(len >= NC_MAX_NAME) len = NC_MAX_NAME-1; + node->ocname = (char*)malloc(len+1); + if(node->ocname == NULL) return NULL; + memcpy(node->ocname,name,len); + node->ocname[len] = '\0'; + } + node->nctype = octypetonc(octype); + node->ocnode = ocnode; + node->subnodes = nclistnew(); + node->container = container; + if(ocnode != OCNULL) { + oc_inq_primtype(nccomm->oc.conn,ocnode,&octype); + node->etype = octypetonc(octype); + } + return node; +} + +/* Given an OCnode tree, mimic it as a CDFnode tree; + Add DAS attributes if DAS is available. Accumulate set + of all nodes in preorder. +*/ +NCerror +buildcdftree34(NCDAPCOMMON* nccomm, OCobject ocroot, OCdxd occlass, CDFnode** cdfrootp) +{ + CDFnode* root = NULL; + CDFtree* tree = (CDFtree*)calloc(1,sizeof(CDFtree)); + NCerror err = NC_NOERR; + tree->ocroot = ocroot; + tree->nodes = nclistnew(); + tree->occlass = occlass; + tree->owner = nccomm; + + err = buildcdftree34r(nccomm,ocroot,NULL,tree,&root); + if(!err) { + if(occlass != OCDAS) + fixnodes34(nccomm,tree->nodes); + if(cdfrootp) *cdfrootp = root; + } + return err; +} + +static NCerror +buildcdftree34r(NCDAPCOMMON* nccomm, OCobject ocnode, CDFnode* container, + CDFtree* tree, CDFnode** cdfnodep) +{ + unsigned int i,ocrank,ocnsubnodes; + OCtype octype; + char* ocname = NULL; + NCerror ncerr = NC_NOERR; + CDFnode* cdfnode; + + oc_inq_class(nccomm->oc.conn,ocnode,&octype); + oc_inq_name(nccomm->oc.conn,ocnode,&ocname); + oc_inq_rank(nccomm->oc.conn,ocnode,&ocrank); + oc_inq_nsubnodes(nccomm->oc.conn,ocnode,&ocnsubnodes); + + switch (octype) { + case OC_Dataset: + case OC_Grid: + case OC_Structure: + case OC_Sequence: + case OC_Primitive: + cdfnode = makecdfnode34(nccomm,ocname,octype,ocnode,container); + nclistpush(tree->nodes,(ncelem)cdfnode); + if(tree->root == NULL) { + tree->root = cdfnode; + cdfnode->tree = tree; + } + break; + + case OC_Dimension: + default: PANIC1("buildcdftree: unexpect OC node type: %d",(int)octype); + + } + /* cross link */ + cdfnode->root = tree->root; + + if(ocrank > 0) defdimensions(ocnode,cdfnode,nccomm,tree); + for(i=0;ioc.conn,ocnode,i,&ocsubnode); + ncerr = buildcdftree34r(nccomm,ocsubnode,cdfnode,tree,&subnode); + if(ncerr) return ncerr; + nclistpush(cdfnode->subnodes,(ncelem)subnode); + } + nullfree(ocname); + if(cdfnodep) *cdfnodep = cdfnode; + return ncerr; +} + +static void +defdimensions(OCobject ocnode, CDFnode* cdfnode, NCDAPCOMMON* nccomm, CDFtree* tree) +{ + unsigned int i,ocrank; + + oc_inq_rank(nccomm->oc.conn,ocnode,&ocrank); + assert(ocrank > 0); + for(i=0;ioc.conn,ocnode,i,&ocdim); + oc_inq_dim(nccomm->oc.conn,ocdim,&declsize,&ocname); + + cdfdim = makecdfnode34(nccomm,ocname,OC_Dimension, + ocdim,cdfnode->container); + nullfree(ocname); + nclistpush(tree->nodes,(ncelem)cdfdim); + /* Initially, constrained and unconstrained are same */ + cdfdim->dim.declsize = declsize; + cdfdim->dim.array = cdfnode; + if(cdfnode->array.dimset0 == NULL) + cdfnode->array.dimset0 = nclistnew(); + nclistpush(cdfnode->array.dimset0,(ncelem)cdfdim); + } +} + +/* Note: this routine only applies some common + client parameters, other routines may apply + specific ones. +*/ + +NCerror +applyclientparams34(NCDAPCOMMON* nccomm) +{ + int i,len; + int dfaltstrlen = DEFAULTSTRINGLENGTH; + int dfaltseqlim = DEFAULTSEQLIMIT; + const char* value; + char tmpname[NC_MAX_NAME+32]; + char* pathstr; + OCconnection conn = nccomm->oc.conn; + unsigned long limit; + + ASSERT(nccomm->oc.url != NULL); + + nccomm->cdf.cache->cachelimit = DFALTCACHELIMIT; + value = oc_clientparam_get(conn,"cachelimit"); + limit = getlimitnumber(value); + if(limit > 0) nccomm->cdf.cache->cachelimit = limit; + + nccomm->cdf.fetchlimit = DFALTFETCHLIMIT; + value = oc_clientparam_get(conn,"fetchlimit"); + limit = getlimitnumber(value); + if(limit > 0) nccomm->cdf.fetchlimit = limit; + + nccomm->cdf.smallsizelimit = DFALTSMALLLIMIT; + value = oc_clientparam_get(conn,"smallsizelimit"); + limit = getlimitnumber(value); + if(limit > 0) nccomm->cdf.smallsizelimit = limit; + + nccomm->cdf.cache->cachecount = DFALTCACHECOUNT; +#ifdef HAVE_GETRLIMIT + { struct rlimit rl; + if(getrlimit(RLIMIT_NOFILE, &rl) >= 0) { + nccomm->cdf.cache->cachecount = (size_t)(rl.rlim_cur / 2); + } + } +#endif + value = oc_clientparam_get(conn,"cachecount"); + limit = getlimitnumber(value); + if(limit > 0) nccomm->cdf.cache->cachecount = limit; + /* Ignore limit if not caching */ + if(!FLAGSET(nccomm->controls,NCF_CACHE)) + nccomm->cdf.cache->cachecount = 0; + + if(oc_clientparam_get(conn,"nolimit") != NULL) + dfaltseqlim = 0; + value = oc_clientparam_get(conn,"limit"); + if(value != NULL && strlen(value) != 0) { + if(sscanf(value,"%d",&len) && len > 0) dfaltseqlim = len; + } + nccomm->cdf.defaultsequencelimit = dfaltseqlim; + + /* allow embedded _ */ + value = oc_clientparam_get(conn,"stringlength"); + if(value != NULL && strlen(value) != 0) { + if(sscanf(value,"%d",&len) && len > 0) dfaltstrlen = len; + } + nccomm->cdf.defaultstringlength = dfaltstrlen; + + /* String dimension limits apply to variables */ + for(i=0;icdf.varnodes);i++) { + CDFnode* var = (CDFnode*)nclistget(nccomm->cdf.varnodes,i); + /* Define the client param stringlength for this variable*/ + var->maxstringlength = 0; /* => use global dfalt */ + strcpy(tmpname,"stringlength_"); + pathstr = makeocpathstring3(conn,var->ocnode,"."); + strcat(tmpname,pathstr); + nullfree(pathstr); + value = oc_clientparam_get(conn,tmpname); + if(value != NULL && strlen(value) != 0) { + if(sscanf(value,"%d",&len) && len > 0) var->maxstringlength = len; + } + } + /* Sequence limits apply to sequences */ + for(i=0;icdf.ddsroot->tree->nodes);i++) { + CDFnode* var = (CDFnode*)nclistget(nccomm->cdf.ddsroot->tree->nodes,i); + if(var->nctype != NC_Sequence) continue; + var->sequencelimit = dfaltseqlim; + strcpy(tmpname,"nolimit_"); + pathstr = makeocpathstring3(conn,var->ocnode,"."); + strcat(tmpname,pathstr); + if(oc_clientparam_get(conn,tmpname) != NULL) + var->sequencelimit = 0; + strcpy(tmpname,"limit_"); + strcat(tmpname,pathstr); + value = oc_clientparam_get(conn,tmpname); + if(value != NULL && strlen(value) != 0) { + if(sscanf(value,"%d",&len) && len > 0) + var->sequencelimit = len; + } + nullfree(pathstr); + } + + /* test for the appropriate fetch flags */ + value = oc_clientparam_get(conn,"fetch"); + if(value != NULL && strlen(value) > 0) { + if(value[0] == 'd' || value[0] == 'D') { + SETFLAG(nccomm->controls,NCF_ONDISK); + } + } + + /* test for the force-whole-var flag */ + value = oc_clientparam_get(conn,"wholevar"); + if(value != NULL) { + SETFLAG(nccomm->controls,NCF_WHOLEVAR); + } + + return NC_NOERR; +} + +void +freecdfroot34(CDFnode* root) +{ + int i; + CDFtree* tree; + NCDAPCOMMON* nccomm; + if(root == NULL) return; + tree = root->tree; + ASSERT((tree != NULL)); + /* Explicitly FREE the ocroot */ + nccomm = tree->owner; + oc_root_free(nccomm->oc.conn,tree->ocroot); + tree->ocroot = OCNULL; + for(i=0;inodes);i++) { + CDFnode* node = (CDFnode*)nclistget(tree->nodes,i); + free1cdfnode34(node); + } + nclistfree(tree->nodes); + nullfree(tree); +} + +/* Free up a single node, but not any + nodes it points to. +*/ +static void +free1cdfnode34(CDFnode* node) +{ + unsigned int j,k; + if(node == NULL) return; + nullfree(node->ocname); + nullfree(node->ncbasename); + nullfree(node->ncfullname); + if(node->attributes != NULL) { + for(j=0;jattributes);j++) { + NCattribute* att = (NCattribute*)nclistget(node->attributes,j); + nullfree(att->name); + for(k=0;kvalues);k++) + nullfree((char*)nclistget(att->values,k)); + nclistfree(att->values); + nullfree(att); + } + } + nullfree(node->dodsspecial.dimname); + nclistfree(node->subnodes); + nclistfree(node->attributes); + nclistfree(node->array.dimsetplus); + nclistfree(node->array.dimsetall); + nclistfree(node->array.dimset0); + + /* Clean up the ncdap4 fields also */ + nullfree(node->typename); + nullfree(node->vlenname); + nullfree(node); +} + +/* Return true if node and node1 appear to refer to the same thing; + takes grid->structure changes into account. +*/ +int +nodematch34(CDFnode* node1, CDFnode* node2) +{ + return simplenodematch34(node1,node2); +} + +int +simplenodematch34(CDFnode* node1, CDFnode* node2) +{ + if(node1 == NULL) return (node2==NULL); + if(node2 == NULL) return 0; + if(node1->nctype != node2->nctype) { + /* Check for Grid->Structure match */ + if((node1->nctype == NC_Structure && node2->nctype == NC_Grid) + || (node2->nctype == NC_Structure && node1->nctype == NC_Grid)){ + if(node1->ocname == NULL || node2->ocname == NULL + || strcmp(node1->ocname,node2->ocname) !=0) return 0; + } else return 0; + } + /* Add hack to address the screwed up Columbia server */ + if(node1->nctype == NC_Dataset) return 1; + if(node1->nctype == NC_Primitive + && node1->etype != node2->etype) return 0; + if(node1->ocname != NULL && node2->ocname != NULL + && strcmp(node1->ocname,node2->ocname)!=0) return 0; + if(nclistlength(node1->array.dimset0) + != nclistlength(node2->array.dimset0)) return 0; + return 1; +} + +/* +Given DDS node, locate the node +in a DATADDS that matches the DDS node. +Return NULL if no node found +*/ + +void +unattach34(CDFnode* root) +{ + unsigned int i; + CDFtree* xtree = root->tree; + for(i=0;inodes);i++) { + CDFnode* xnode = (CDFnode*)nclistget(xtree->nodes,i); + /* break bi-directional link */ + xnode->attachment = NULL; + } +} + +static void +setattach(CDFnode* target, CDFnode* template) +{ + target->attachment = template; + template->attachment = target; + /* Transfer important information */ + target->externaltype = template->externaltype; + target->maxstringlength = template->maxstringlength; + target->sequencelimit = template->sequencelimit; + target->ncid = template->ncid; + /* also transfer libncdap4 info */ + target->typeid = template->typeid; + target->typesize = template->typesize; +} + +static NCerror +attachdims34(CDFnode* xnode, CDFnode* template) +{ + unsigned int i; + for(i=0;iarray.dimsetall);i++) { + CDFnode* xdim = (CDFnode*)nclistget(xnode->array.dimsetall,i); + CDFnode* tdim = (CDFnode*)nclistget(template->array.dimsetall,i); + setattach(xdim,tdim); +#ifdef DEBUG2 +fprintf(stderr,"attachdim: %s->%s\n",xdim->ocname,tdim->ocname); +#endif + } + return NC_NOERR; +} + +/* +Match a DATADDS node to a DDS node. +It is assumed that both trees have been regridded if necessary. +*/ + +static NCerror +attach34r(CDFnode* xnode, NClist* templatepath, int depth) +{ + unsigned int i,plen,lastnode,gridable; + NCerror ncstat = NC_NOERR; + CDFnode* templatepathnode; + CDFnode* templatepathnext; + + plen = nclistlength(templatepath); + if(depth >= plen) {THROWCHK(ncstat=NC_EINVAL); goto done;} + + lastnode = (depth == (plen-1)); + templatepathnode = (CDFnode*)nclistget(templatepath,depth); + ASSERT((simplenodematch34(xnode,templatepathnode))); + setattach(xnode,templatepathnode); +#ifdef DEBUG2 +fprintf(stderr,"attachnode: %s->%s\n",xnode->ocname,templatepathnode->ocname); +#endif + + if(lastnode) goto done; /* We have the match and are done */ + + if(nclistlength(xnode->array.dimsetall) > 0) { + attachdims34(xnode,templatepathnode); + } + + ASSERT((!lastnode)); + templatepathnext = (CDFnode*)nclistget(templatepath,depth+1); + + gridable = (templatepathnext->nctype == NC_Grid && depth+2 < plen); + + /* Try to find an xnode subnode that matches templatepathnext */ + for(i=0;isubnodes);i++) { + CDFnode* xsubnode = (CDFnode*)nclistget(xnode->subnodes,i); + if(simplenodematch34(xsubnode,templatepathnext)) { + ncstat = attach34r(xsubnode,templatepath,depth+1); + if(ncstat) goto done; + } else if(gridable && xsubnode->nctype == NC_Primitive) { + /* grids may or may not appear in the datadds; + try to match the xnode subnodes against the parts of the grid + */ + CDFnode* templatepathnext2 = (CDFnode*)nclistget(templatepath,depth+2); + if(simplenodematch34(xsubnode,templatepathnext2)) { + ncstat = attach34r(xsubnode,templatepath,depth+2); + if(ncstat) goto done; + } + } + } +done: + return THROW(ncstat); +} + +NCerror +attach34(CDFnode* xroot, CDFnode* template) +{ + NCerror ncstat = NC_NOERR; + NClist* templatepath = nclistnew(); + CDFnode* ddsroot = template->root; + + if(xroot->attachment) unattach34(xroot); + if(ddsroot != NULL && ddsroot->attachment) unattach34(ddsroot); + if(!simplenodematch34(xroot,ddsroot)) + {THROWCHK(ncstat=NC_EINVAL); goto done;} + collectnodepath3(template,templatepath,WITHDATASET); + ncstat = attach34r(xroot,templatepath,0); +done: + nclistfree(templatepath); + return ncstat; +} + +/* +Match nodes in template tree to nodes in target tree; +template tree is typically a structural superset of target tree. +WARNING: Dimensions are not attached +*/ + +NCerror +attachsubset34(CDFnode* target, CDFnode* template) +{ + NCerror ncstat = NC_NOERR; + + if(template == NULL) {THROWCHK(ncstat=NC_NOERR); goto done;} + if(!nodematch34(target,template)) {THROWCHK(ncstat=NC_EINVAL); goto done;} +#ifdef DEBUG2 +fprintf(stderr,"attachsubset: target=%s\n",dumptree(target)); +fprintf(stderr,"attachsubset: template=%s\n",dumptree(template)); +#endif + ncstat = attachsubset34r(target,template); +done: + return ncstat; +} + +static NCerror +attachsubset34r(CDFnode* target, CDFnode* template) +{ + unsigned int i; + NCerror ncstat = NC_NOERR; + int fieldindex; + +#ifdef DEBUG2 +fprintf(stderr,"attachsubsetr: attach: target=%s template=%s\n", + target->ocname,template->ocname); +#endif + + ASSERT((nodematch34(target,template))); + setattach(target,template); + + /* Try to match target subnodes against template subnodes */ + + fieldindex = 0; + for(fieldindex=0,i=0;isubnodes) && fieldindexsubnodes);i++) { + CDFnode* templatesubnode = (CDFnode*)nclistget(template->subnodes,i); + CDFnode* targetsubnode = (CDFnode*)nclistget(target->subnodes,fieldindex); + if(nodematch34(targetsubnode,templatesubnode)) { +#ifdef DEBUG2 +fprintf(stderr,"attachsubsetr: match: %s :: %s\n",targetsubnode->ocname,templatesubnode->ocname); +#endif + ncstat = attachsubset34r(targetsubnode,templatesubnode); + if(ncstat) goto done; + fieldindex++; + } + } +done: + return THROW(ncstat); +} + +static void +getalldims34a(NClist* dimset, NClist* alldims) +{ + int i; + for(i=0;incfullname,(unsigned long)dim->dim.declsize); +#endif + nclistpush(alldims,(ncelem)dim); + } + } +} + +/* Accumulate a set of all the known dimensions + vis-a-vis defined variables +*/ +NClist* +getalldims34(NCDAPCOMMON* nccomm, int visibleonly) +{ + int i; + NClist* alldims = nclistnew(); + NClist* varnodes = nccomm->cdf.varnodes; + + /* get bag of all dimensions */ + for(i=0;ivisible) { + getalldims34a(node->array.dimsetall,alldims); + } + } + return alldims; +} diff --git a/extern/src_netcdf4/config.h b/extern/src_netcdf4/config.h new file mode 100644 index 0000000..83e8a4e --- /dev/null +++ b/extern/src_netcdf4/config.h @@ -0,0 +1,474 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* if true, build RPC Client and Server */ +/* #undef BUILD_RPC */ + +/* default file chunk cache nelems. */ +#define CHUNK_CACHE_NELEMS 1009 + +/* default file chunk cache preemption policy. */ +#define CHUNK_CACHE_PREEMPTION 0.75 + +/* default file chunk cache size in bytes. */ +#define CHUNK_CACHE_SIZE 4194304 + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* num chunks in default per-var chunk cache. */ +#define DEFAULT_CHUNKS_IN_CACHE 10 + +/* default chunk size in bytes */ +#define DEFAULT_CHUNK_SIZE 4194304 + +/* set this only when building a DLL under MinGW */ +/* #undef DLL_EXPORT */ + +/* set this only when building a DLL under MinGW */ +/* #undef DLL_NETCDF */ + +/* if true, build DAP Client */ +#define ENABLE_DAP 1 + +/* if true, enable DAP group names */ +#define ENABLE_DAP_GROUPS 1 + +/* if true, do remote tests */ +#define ENABLE_DAP_REMOTE_TESTS 1 + +/* if true, run extra tests which may not work yet */ +/* #undef EXTRA_TESTS */ + +/* use HDF5 1.6 API */ +#define H5_USE_16_API 1 + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_CTYPE_H 1 + +/* Is CURLOPT_KEYPASSWD defined */ +#define HAVE_CURLOPT_KEYPASSWD 1 + +/* Define to 1 if you have the declaration of `isfinite', and to 0 if you + don't. */ +#define HAVE_DECL_ISFINITE 1 + +/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't. + */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't. + */ +#define HAVE_DECL_ISNAN 1 + +/* Define to 1 if you have the declaration of `signbit', and to 0 if you + don't. */ +#define HAVE_DECL_SIGNBIT 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fsync' function. */ +#define HAVE_FSYNC 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GETOPT_H 1 + +/* Define to 1 if you have the `getpagesize' function. */ +#define HAVE_GETPAGESIZE 1 + +/* Define to 1 if you have the `getrlimit' function. */ +#define HAVE_GETRLIMIT 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `H5Pget_fapl_mpio' function. */ +#define HAVE_H5PGET_FAPL_MPIO 1 + +/* Define to 1 if you have the `H5Pget_fapl_mpiposix' function. */ +#define HAVE_H5PGET_FAPL_MPIPOSIX 1 + +/* Define to 1 if you have the `H5Pset_deflate' function. */ +#define HAVE_H5PSET_DEFLATE 1 + +/* Define to 1 if you have the `H5Z_SZIP' function. */ +/* #undef HAVE_H5Z_SZIP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_HDF5_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `df' library (-ldf). */ +/* #undef HAVE_LIBDF */ + +/* Define to 1 if you have the `m' library (-lm). */ +#define HAVE_LIBM 1 + +/* Define to 1 if you have the `mfhdf' library (-lmfhdf). */ +/* #undef HAVE_LIBMFHDF */ + +/* Define to 1 if you have the `pnetcdf' library (-lpnetcdf). */ +/* #undef HAVE_LIBPNETCDF */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if the system has the type `longlong'. */ +/* #undef HAVE_LONGLONG */ + +/* Define to 1 if the system has the type `long long int'. */ +#define HAVE_LONG_LONG_INT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MFHDF_H */ + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have a working `mmap' system call. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the `MPI_Comm_f2c' function. */ +#define HAVE_MPI_COMM_F2C 1 + +/* Define to 1 if you have the `mremap' function. */ +#define HAVE_MREMAP 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#define HAVE_PTRDIFF_T 1 + +/* Define to 1 if you have the `rand' function. */ +#define HAVE_RAND 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if the system has the type `ssize_t'. */ +#define HAVE_SSIZE_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if stdbool.h conforms to C99. */ +#define HAVE_STDBOOL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strcat' function. */ +#define HAVE_STRCAT 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strcpy' function. */ +#define HAVE_STRCPY 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strlcat' function. */ +/* #undef HAVE_STRLCAT */ + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtod' function. */ +#define HAVE_STRTOD 1 + +/* Define to 1 if you have the `strtoll' function. */ +#define HAVE_STRTOLL 1 + +/* Define to 1 if you have the `strtoull' function. */ +#define HAVE_STRTOULL 1 + +/* Define to 1 if `st_blksize' is member of `struct stat'. */ +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 + +/* Define to 1 if your `struct stat' has `st_blksize'. Deprecated, use + `HAVE_STRUCT_STAT_ST_BLKSIZE' instead. */ +#define HAVE_ST_BLKSIZE 1 + +/* Define to 1 if you have the `sysconf' function. */ +#define HAVE_SYSCONF 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if the system has the type `uchar'. */ +/* #undef HAVE_UCHAR */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the type `unsigned long long int'. */ +#define HAVE_UNSIGNED_LONG_LONG_INT 1 + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* do large file tests */ +/* #undef LARGE_FILE_TESTS */ + +/* If true, turn on logging. */ +/* #undef LOGGING */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* max size of the default per-var chunk cache. */ +#define MAX_DEFAULT_CACHE_SIZE 67108864 + +/* min blocksize for posixio. */ +#define NCIO_MINBLOCKSIZE 256 + +/* no IEEE float on this platform */ +/* #undef NO_IEEE_FLOAT */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* do not build the netCDF version 2 API */ +/* #undef NO_NETCDF_2 */ + +/* no stdlib.h */ +/* #undef NO_STDLIB_H */ + +/* no sys_types.h */ +/* #undef NO_SYS_TYPES_H */ + +/* Name of package */ +#define PACKAGE "netcdf" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "support-netcdf@unidata.ucar.edu" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "netCDF" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "netCDF 4.2.1.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "netcdf" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "4.2.1.1" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `float', as computed by sizeof. */ +#define SIZEOF_FLOAT 4 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of `off_t', as computed by sizeof. */ +#define SIZEOF_OFF_T 8 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 8 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Place to put very large netCDF test files. */ +#define TEMP_LARGE "." + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* if true, build CDMREMOTE Client */ +/* #undef USE_CDMREMOTE */ + +/* if true, build DAP Client */ +#define USE_DAP 1 + +/* if true, include NC_DISKLESS code */ +#define USE_DISKLESS 1 + +/* set this to use extreme numbers in tests */ +#define USE_EXTREME_NUMBERS 1 + +/* if true, use ffio instead of posixio */ +/* #undef USE_FFIO */ + +/* if true, include experimental fsync code */ +#define USE_FSYNC 1 + +/* if true, use HDF4 too */ +/* #undef USE_HDF4 */ + +/* If true, use use wget to fetch some sample HDF4 data, and then test against + it. */ +/* #undef USE_HDF4_FILE_TESTS */ + +/* if true, use mmap for in-memory files */ +/* #undef USE_MMAP */ + +/* if true, build netCDF-4 */ +#define USE_NETCDF4 1 + +/* if true, parallel netCDF-4 is in use */ +#define USE_PARALLEL 1 + +/* if true, compile in parallel netCDF-4 based on MPI/IO */ +#define USE_PARALLEL_MPIO 1 + +/* if true, compile in parallel netCDF-4 based on MPI/POSIX */ +#define USE_PARALLEL_POSIX 1 + +/* if true, parallel netCDF is used */ +/* #undef USE_PNETCDF */ + +/* if true, compile in szip compression in netCDF-4 variables */ +/* #undef USE_SZIP */ + +/* if true, compile in zlib compression in netCDF-4 variables */ +#define USE_ZLIB 1 + +/* Version number of package */ +#define VERSION "4.2.1.1" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to 1 if type `char' is unsigned and you are not using gcc. */ +#ifndef __CHAR_UNSIGNED__ +/* # undef __CHAR_UNSIGNED__ */ +#endif + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +#include "ncconfigure.h" diff --git a/extern/src_netcdf4/constraints3.c b/extern/src_netcdf4/constraints3.c new file mode 100644 index 0000000..f1778a7 --- /dev/null +++ b/extern/src_netcdf4/constraints3.c @@ -0,0 +1,853 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdce3/constraints3.c,v 1.40 2010/05/27 21:34:07 dmh Exp $ + *********************************************************************/ + +#include "ncdap3.h" +#include "dapodom.h" +#include "dapdebug.h" +#include "dapdump.h" +#include "dceparselex.h" + +static void completesegments3(NClist* fullpath, NClist* segments); +static NCerror qualifyprojectionnames3(DCEprojection* proj); +static NCerror qualifyprojectionsizes3(DCEprojection* proj); +static NCerror matchpartialname3(NClist* nodes, NClist* segments, CDFnode** nodep); +static int matchsuffix3(NClist* matchpath, NClist* segments); +static int iscontainer(CDFnode* node); +static DCEprojection* projectify(CDFnode* field, DCEprojection* container); +static int slicematch(NClist* seglist1, NClist* seglist2); + +/* Parse incoming url constraints, if any, + to check for syntactic correctness */ +NCerror +parsedapconstraints(NCDAPCOMMON* dapcomm, char* constraints, + DCEconstraint* dceconstraint) +{ + NCerror ncstat = NC_NOERR; + char* errmsg; + + ASSERT(dceconstraint != NULL); + nclistclear(dceconstraint->projections); + nclistclear(dceconstraint->selections); + + ncstat = dapceparse(constraints,dceconstraint,&errmsg); + if(ncstat) { + nclog(NCLOGWARN,"DCE constraint parse failure: %s",errmsg); + nullfree(errmsg); + nclistclear(dceconstraint->projections); + nclistclear(dceconstraint->selections); + } + return ncstat; +} + +/* Map constraint paths to CDFnode paths in specified tree and fill + in the declsizes. + The difficulty is that suffix paths are legal. +*/ + +NCerror +mapconstraints3(DCEconstraint* constraint, + CDFnode* root) +{ + int i; + NCerror ncstat = NC_NOERR; + NClist* nodes = root->tree->nodes; + NClist* dceprojections = constraint->projections; +#if 0 + NClist* dceselections = constraint->selections; +#endif + + /* Convert the projection paths to leaves in the dds tree */ + for(i=0;idiscrim != CES_VAR) continue; /* ignore functions*/ + ncstat = matchpartialname3(nodes,proj->var->segments, + (CDFnode**)&proj->var->annotation); + if(ncstat) goto done; + } + +#ifdef DEBUG +fprintf(stderr,"mapconstraint.projections: %s\n", + dumpprojections(dceprojections)); +#endif + +done: + return THROW(ncstat); +} + + +/* Fill in: + 1. projection segments + 2. projection segment slices declsize + 3. selection path +*/ +NCerror +qualifyconstraints3(DCEconstraint* constraint) +{ + NCerror ncstat = NC_NOERR; + int i; +#ifdef DEBUG +fprintf(stderr,"qualifyconstraints.before: %s\n", + dumpconstraint(constraint)); +#endif + if(constraint != NULL) { + for(i=0;iprojections);i++) { + DCEprojection* p = (DCEprojection*)nclistget(constraint->projections,i); + ncstat = qualifyprojectionnames3(p); + ncstat = qualifyprojectionsizes3(p); + } + } +#ifdef DEBUG +fprintf(stderr,"qualifyconstraints.after: %s\n", + dumpconstraint(constraint)); +#endif + return ncstat; +} + +/* convert all names in projections in paths to be fully qualified + by adding prefix segment objects. +*/ +static NCerror +qualifyprojectionnames3(DCEprojection* proj) +{ + NCerror ncstat = NC_NOERR; + NClist* fullpath = nclistnew(); + + ASSERT((proj->discrim == CES_VAR + && proj->var->annotation != NULL + && ((CDFnode*)proj->var->annotation)->ocnode != OCNULL)); + collectnodepath3((CDFnode*)proj->var->annotation,fullpath,!WITHDATASET); +#ifdef DEBUG +fprintf(stderr,"qualify: %s -> ", + dumpprojection(proj)); +#endif + /* Now add path nodes to create full path */ + completesegments3(fullpath,proj->var->segments); + +#ifdef DEBUG +fprintf(stderr,"%s\n", + dumpprojection(proj)); +#endif + nclistfree(fullpath); + return ncstat; +} + +/* Make sure that the slice declsizes are all defined for this projection */ +static NCerror +qualifyprojectionsizes3(DCEprojection* proj) +{ + int i,j; + ASSERT(proj->discrim == CES_VAR); +#ifdef DEBUG +fprintf(stderr,"qualifyprojectionsizes.before: %s\n", + dumpprojection(proj)); +#endif + for(i=0;ivar->segments);i++) { + DCEsegment* seg = (DCEsegment*)nclistget(proj->var->segments,i); + NClist* dimset = NULL; + CDFnode* cdfnode = (CDFnode*)seg->annotation; + ASSERT(cdfnode != NULL); + dimset = cdfnode->array.dimsetplus; + seg->rank = nclistlength(dimset); + /* For this, we do not want any string dimensions */ + if(cdfnode->array.stringdim != NULL) seg->rank--; + for(j=0;jrank;j++) { + CDFnode* dim = (CDFnode*)nclistget(dimset,j); + if(dim->dim.basedim != NULL) dim = dim->dim.basedim; + ASSERT(dim != null); + if(seg->slicesdefined) + seg->slices[j].declsize = dim->dim.declsize; + else + dcemakewholeslice(seg->slices+j,dim->dim.declsize); + } + seg->slicesdefined = 1; + seg->slicesdeclized = 1; + } +#ifdef DEBUG +fprintf(stderr,"qualifyprojectionsizes.after: %s\n", + dumpprojection(proj)); +#endif + return NC_NOERR; +} + +static void +completesegments3(NClist* fullpath, NClist* segments) +{ + int i,delta; + /* add path nodes to segments to create full path */ + delta = (nclistlength(fullpath) - nclistlength(segments)); + ASSERT((delta >= 0)); + for(i=0;iname = nulldup(node->ocname); + seg->annotation = (void*)node; + seg->rank = nclistlength(node->array.dimset0); + nclistinsert(segments,i,(ncelem)seg); + } + /* Now modify the segments to point to the appropriate node + and fill in the slices. + */ + for(i=delta;iannotation = (void*)node; + } +} + +/* +We are given a set of segments (in path) +representing a partial path for a CDFnode variable. +Our goal is to locate all matching +variables for which the path of that +variable has a suffix matching +the given partial path. +If one node matches exactly, then use that one; +otherwise there had better be exactly one +match else ambiguous. +Additional constraints (4/12/2010): +1. if a segment is dimensioned, then use that info + to distinguish e.g a grid node from a possible + grid array within it of the same name. + Treat sequences as of rank 1. +2. if there are two matches, and one is the grid + and the other is the grid array within that grid, + then choose the grid array. +3. If there are multiple matches choose the one with the + shortest path +4. otherwise complain about ambiguity +*/ + +/** + * Given a path as segments, + * try to locate the CDFnode + * instance (from a given set) + * that corresponds to the path. + * The key difficulty is that the + * path may only be a suffix of the + * complete path. + */ + +static NCerror +matchpartialname3(NClist* nodes, NClist* segments, CDFnode** nodep) +{ + int i,nsegs; + NCerror ncstat = NC_NOERR; + DCEsegment* lastseg = NULL; + NClist* namematches = nclistnew(); + NClist* matches = nclistnew(); + NClist* matchpath = nclistnew(); + + /* Locate all nodes with the same name + as the last element in the segment path + */ + nsegs = nclistlength(segments); + lastseg = (DCEsegment*)nclistget(segments,nsegs-1); + for(i=0;iocname == null) + continue; + /* Path names come from oc space */ + if(strcmp(node->ocname,lastseg->name) != 0) + continue; + /* Only look at selected kinds of nodes */ + if(node->nctype != NC_Sequence + && node->nctype != NC_Structure + && node->nctype != NC_Grid + && node->nctype != NC_Primitive + ) + continue; + nclistpush(namematches,(ncelem)node); + } + if(nclistlength(namematches)==0) { + nclog(NCLOGERR,"No match for projection name: %s",lastseg->name); + ncstat = NC_EDDS; + goto done; + } + + /* Now, collect and compare paths of the matching nodes */ + for(i=0;incfullname,dumpsegments(segments)); +#endif + } + } + /* |matches|==0 => no match; |matches|>1 => ambiguity */ + switch (nclistlength(matches)) { + case 0: + nclog(NCLOGERR,"No match for projection name: %s",lastseg->name); + ncstat = NC_EDDS; + break; + case 1: + if(nodep) + *nodep = (CDFnode*)nclistget(matches,0); + break; + default: { + CDFnode* minnode = NULL; + int minpath = 0; + int nmin = 0; /* to catch multiple ones with same short path */ + /* ok, see if one of the matches has a path that is shorter + then all the others */ + for(i=0;i 1) { + nclog(NCLOGERR,"Ambiguous match for projection name: %s", + lastseg->name); + ncstat = NC_EDDS; + } else if(nodep) + *nodep = minnode; + } break; + } +#ifdef DEBUG +fprintf(stderr,"matchpartialname: choice: %s %s for %s\n", +(nclistlength(matches) > 1?"":"forced"), +(*nodep)->ncfullname,dumpsegments(segments)); +#endif + +done: + return THROW(ncstat); +} + +static int +matchsuffix3(NClist* matchpath, NClist* segments) +{ + int i,j; + int nsegs = nclistlength(segments); + int pathlen = nclistlength(matchpath); + ASSERT(pathlen >= nsegs); + for(i=0;irank; + /* Do the names match (in oc name space) */ + if(strcmp(seg->name,node->ocname) != 0) { + segmatch = 0;/* no match */ + } else + /* Do the ranks match (watch out for sequences) */ + if(rank == 0) /* rank == 9 matches any set of dimensions */ + segmatch = 1; + else if(node->nctype == NC_Sequence) + segmatch = (rank == 1?1:0); + else /*!NC_Sequence*/ + segmatch = (rank == nclistlength(node->array.dimset0)?1:0); + if(!segmatch) pathmatch = 0; + } + if(pathmatch) return 1; + } + return 0; +} + + +/* Convert a DCEprojection instance into a string + that can be used with the url +*/ + +char* +buildprojectionstring3(NClist* projections) +{ + char* pstring; + NCbytes* buf = ncbytesnew(); + dcelisttobuffer(projections,buf,","); + pstring = ncbytesdup(buf); + ncbytesfree(buf); + return pstring; +} + +char* +buildselectionstring3(NClist* selections) +{ + NCbytes* buf = ncbytesnew(); + char* sstring; + dcelisttobuffer(selections,buf,"&"); + sstring = ncbytesdup(buf); + ncbytesfree(buf); + return sstring; +} + +char* +buildconstraintstring3(DCEconstraint* constraints) +{ + NCbytes* buf = ncbytesnew(); + char* result = NULL; + dcetobuffer((DCEnode*)constraints,buf); + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + + +/* Given the arguments to vara + construct a corresponding projection + with any pseudo dimensions removed +*/ +NCerror +buildvaraprojection3(Getvara* getvar, + const size_t* startp, const size_t* countp, const ptrdiff_t* stridep, + DCEprojection** projectionp) +{ + int i,j; + NCerror ncstat = NC_NOERR; + CDFnode* var = getvar->target; + DCEprojection* projection = NULL; + NClist* path = nclistnew(); + NClist* segments = NULL; + int dimindex; + + ncstat = dapvar2projection(var,&projection); +#ifdef DEBUG +fprintf(stderr,"buildvaraprojection: %s\n",dumpprojection(projection)); +#endif + + /* We need to assign the start/count/stride info to each segment; + declsize will have been set + */ + segments = projection->var->segments; + dimindex = 0; + for(i=0;irank;j++) { + DCEslice* slice = &segment->slices[j]; + /* make each slice represent the corresponding + start/count/stride */ + slice->first = startp[dimindex+j]; + slice->stride = stridep[dimindex+j]; + slice->count = countp[dimindex+j]; + slice->length = slice->count * slice->stride; + if(slice->length > slice->declsize) + slice->length = slice->declsize; + slice->stop = (slice->first + slice->length); + if(slice->stop > slice->declsize) + slice->stop = slice->declsize; + } + dimindex += segment->rank; + } +#ifdef DEBUG +fprintf(stderr,"buildvaraprojection.final: %s\n",dumpprojection(projection)); +#endif + +#ifdef DEBUG +fprintf(stderr,"buildvaraprojection3: projection=%s\n", + dumpprojection(projection)); +#endif + + if(projectionp) *projectionp = projection; + + nclistfree(path); + if(ncstat) dcefree((DCEnode*)projection); + return ncstat; +} + +int +iswholeslice(DCEslice* slice, CDFnode* dim) +{ + if(slice->first != 0 || slice->stride != 1) return 0; + if(dim != NULL) { + if(slice->stop != dim->dim.declsize) return 0; + } else if(dim == NULL) { + if(slice->declsize == 0 + || slice->count != slice->declsize) return 0; + } + return 1; +} + +int +iswholesegment(DCEsegment* seg) +{ + int i,whole; + NClist* dimset = NULL; + unsigned int rank; + + if(seg->rank == 0) return 1; + if(!seg->slicesdefined) return 0; + if(seg->annotation == NULL) return 0; + dimset = ((CDFnode*)seg->annotation)->array.dimset0; + rank = nclistlength(dimset); + whole = 1; /* assume so */ + for(i=0;islices[i],dim)) {whole = 0; break;} + } + return whole; +} + +int +iswholeprojection(DCEprojection* proj) +{ + int i,whole; + + ASSERT((proj->discrim == CES_VAR)); + + whole = 1; /* assume so */ + for(i=0;ivar->segments);i++) { + DCEsegment* segment = (DCEsegment*)nclistget(proj->var->segments,i); + if(!iswholesegment(segment)) {whole = 0; break;} + } + return whole; +} + +int +iswholeconstraint(DCEconstraint* con) +{ + int i; + if(con == NULL) return 1; + if(con->projections != NULL) { + for(i=0;iprojections);i++) { + if(!iswholeprojection((DCEprojection*)nclistget(con->projections,i))) + return 0; + } + } + if(con->selections != NULL) + return 0; + return 1; +} + + +/* +Given a set of projections, we need to produce +an expanded, correct, and equivalent set of projections. +The term "correct" means we must fix the following cases: +1. Multiple occurrences of the same leaf variable + with differing projection slices. Fix is to complain. +2. Occurrences of container and one or more of its fields. + Fix is to suppress the container. +The term "expanded" means +1. Expand all occurrences of only a container by + replacing it with all of its fields. +*/ + +NCerror +fixprojections(NClist* list) +{ + int i,j,k; + NCerror ncstat = NC_NOERR; + NClist* tmp = nclistnew(); /* misc. uses */ + +#ifdef DEBUG +fprintf(stderr,"fixprojection: list = %s\n",dumpprojections(list)); +#endif + + if(nclistlength(list) == 0) goto done; + + /* Step 1: remove duplicates and complain about slice mismatches */ + for(i=0;idiscrim != CES_VAR) continue; /* dont try to unify functions */ + for(j=i;jdiscrim != CES_VAR) continue; + if(p1->var->annotation != p2->var->annotation) continue; + /* check for slice mismatches */ + if(!slicematch(p1->var->segments,p2->var->segments)) { + /* complain */ + nclog(NCLOGWARN,"Malformed projection: same variable with different slicing"); + } + /* remove p32 */ + nclistset(list,j,(ncelem)NULL); + dcefree((DCEnode*)p2); + } + } + + /* Step 2: remove containers when a field is also present */ + for(i=0;idiscrim != CES_VAR) continue; /* dont try to unify functions */ + if(!iscontainer((CDFnode*)p1->var->annotation)) + continue; + for(j=i;jdiscrim != CES_VAR) continue; + nclistclear(tmp); + collectnodepath3((CDFnode*)p2->var->annotation,tmp,WITHDATASET); + for(k=0;kvar->annotation) { + nclistset(list,i,(ncelem)NULL); + dcefree((DCEnode*)p1); + goto next; + } + } + } +next: continue; + } + + /* Step 3: expand all containers recursively down to the leaf nodes */ + for(;;) { + nclistclear(tmp); + for(i=0;idiscrim != CES_VAR) + continue; /* dont try to unify functions */ + leaf = (CDFnode*)target->var->annotation; + ASSERT(leaf != NULL); + if(iscontainer(leaf)) {/* capture container */ + if(!nclistcontains(tmp,(ncelem)target)) + nclistpush(tmp,(ncelem)target); + nclistset(list,i,(ncelem)NULL); + } + } + if(nclistlength(tmp) == 0) break; /*done*/ + /* Now explode the containers */ + for(i=0;ivar->annotation; + for(j=0;isubnodes);j++) { + CDFnode* field = (CDFnode*)nclistget(leaf->subnodes,j); + /* Convert field node to a proper constraint */ + DCEprojection* proj = projectify(field,container); + nclistpush(list,(ncelem)proj); + } + /* reclaim the container */ + dcefree((DCEnode*)container); + } + } /*for(;;)*/ + + /* remove all NULL elements */ + for(i=nclistlength(list)-1;i>=0;i--) { + DCEprojection* target = (DCEprojection*)nclistget(list,i); + if(target == NULL) + nclistremove(list,i); + } + +done: +#ifdef DEBUG +fprintf(stderr,"fixprojection: exploded = %s\n",dumpprojections(list)); +#endif + nclistfree(tmp); + return ncstat; +} + +static int +iscontainer(CDFnode* node) +{ + return (node->nctype == NC_Dataset + || node->nctype == NC_Sequence + || node->nctype == NC_Structure + || node->nctype == NC_Grid); +} + +static DCEprojection* +projectify(CDFnode* field, DCEprojection* container) +{ + DCEprojection* proj = (DCEprojection*)dcecreate(CES_PROJECT); + DCEvar* var = (DCEvar*)dcecreate(CES_VAR); + DCEsegment* seg = (DCEsegment*)dcecreate(CES_SEGMENT); + proj->discrim = CES_VAR; + proj->var = var; + var->annotation = (void*)field; + /* Dup the segment list */ + var->segments = dceclonelist(container->var->segments); + seg->rank = 0; + nclistpush(var->segments,(ncelem)seg); + return proj; +} + +static int +slicematch(NClist* seglist1, NClist* seglist2) +{ + int i,j; + if((seglist1 == NULL || seglist2 == NULL) && seglist1 != seglist2) + return 0; + if(nclistlength(seglist1) != nclistlength(seglist2)) + return 0; + for(i=0;irank != seg2->rank) + return 0; + for(j=0;jrank;j++) { + if(seg1->slices[j].first != seg2->slices[j].first + || seg1->slices[j].count != seg2->slices[j].count + || seg1->slices[j].stride != seg2->slices[j].stride) + return 0; + } + } + return 1; +} + +/* Convert a CDFnode var to a projection; include + pseudodimensions; always whole variable. +*/ +int +dapvar2projection(CDFnode* var, DCEprojection** projectionp) +{ + int i,j; + int ncstat = NC_NOERR; + NClist* path = nclistnew(); + NClist* segments; + DCEprojection* projection = NULL; + int dimindex; + + /* Collect the nodes needed to construct the projection segment */ + collectnodepath3(var,path,!WITHDATASET); + + segments = nclistnew(); + dimindex = 0; /* point to next subset of slices */ + nclistsetalloc(segments,nclistlength(path)); + for(i=0;iannotation = (void*)n; + segment->name = nulldup(n->ocname); + /* We need to assign whole slices to each segment */ + localrank = nclistlength(n->array.dimsetplus); + segment->rank = localrank; + dimset = n->array.dimsetplus; + for(j=0;jslices[j]; + dim = (CDFnode*)nclistget(dimset,j); + ASSERT(dim->dim.declsize0 > 0); + dcemakewholeslice(slice,dim->dim.declsize0); + } + segment->slicesdefined = 1; + segment->slicesdeclized = 1; + dimindex += localrank; + nclistpush(segments,(ncelem)segment); + } + + projection = (DCEprojection*)dcecreate(CES_PROJECT); + projection->discrim = CES_VAR; + projection->var = (DCEvar*)dcecreate(CES_VAR); + projection->var->annotation = (void*)var; + projection->var->segments = segments; + +#ifdef DEBUG1 +fprintf(stderr,"dapvar2projection: projection=%s\n", + dumpprojection(projection)); +#endif + + nclistfree(path); + if(ncstat) dcefree((DCEnode*)projection); + else if(projectionp) *projectionp = projection; + return ncstat; +} + +/* +Given a set of projections and a projection +representing a variable (from, say vara or prefetch) +construct a single projection for fetching that variable +with the proper constraints. +*/ +int +daprestrictprojection(NClist* projections, DCEprojection* var, DCEprojection** resultp) +{ + int ncstat = NC_NOERR; + int i; + DCEprojection* result = NULL; +#ifdef DEBUG1 +fprintf(stderr,"restrictprojection.before: constraints=|%s| vara=|%s|\n", + dumpprojections(projections), + dumpprojection(var)); +#endif + + ASSERT(var != NULL); + + /* the projection list will contain at most 1 match for the var by construction */ + for(result=null,i=0;idiscrim != CES_VAR) continue; + if(p1->var->annotation == var->var->annotation) { + result = p1; + break; + } + } + if(result == NULL) { + result = (DCEprojection*)dceclone((DCEnode*)var); /* use only the var projection */ + goto done; + } + result = (DCEprojection*)dceclone((DCEnode*)result); /* so we can modify */ + +#ifdef DEBUG1 +fprintf(stderr,"restrictprojection.choice: |%s|\n",dumpprojection(result)); +#endif + /* We need to merge the projection from the projection list + with the var projection + */ + ncstat = dcemergeprojections(result,var); /* result will be modified */ + +done: + if(resultp) *resultp = result; +#ifdef DEBUG +fprintf(stderr,"restrictprojection.after=|%s|\n", + dumpprojection(result)); +#endif + return ncstat; +} + +/* Shift the slice so it runs from 0..count by step 1 */ +static void +dapshiftslice(DCEslice* slice) +{ + size_t first = slice->first; + size_t stride = slice->stride; + if(first == 0 && stride == 1) return; /* no need to do anything */ + slice->first = 0; + slice->stride = 1; + slice->length = slice->count; + slice->stop = slice->count; +} + +int +dapshiftprojection(DCEprojection* projection) +{ + int ncstat = NC_NOERR; + int i,j; + NClist* segments; + +#ifdef DEBUG1 +fprintf(stderr,"dapshiftprojection.before: %s\n",dumpprojection(projection)); +#endif + + ASSERT(projection->discrim == CES_VAR); + segments = projection->var->segments; + for(i=0;irank;j++) { + DCEslice* slice = seg->slices+j; + dapshiftslice(slice); + } + } + +#ifdef DEBUG1 +fprintf(stderr,"dapshiftprojection.after: %s\n",dumpprojection(projection)); +#endif + + return ncstat; +} diff --git a/extern/src_netcdf4/constraints3.h b/extern/src_netcdf4/constraints3.h new file mode 100644 index 0000000..1c5ac4b --- /dev/null +++ b/extern/src_netcdf4/constraints3.h @@ -0,0 +1,40 @@ + /********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/constraints3.h,v 1.10 2010/04/13 03:36:30 dmh Exp $ + *********************************************************************/ +#ifndef CONSTRAINTS3_H +#define CONSTRAINTS3_H 1 + +extern NCerror parsedapconstraints(NCDAPCOMMON*, char*, DCEconstraint*); +extern NCerror mapconstraints3(DCEconstraint*,CDFnode*); +extern NCerror qualifyconstraints3(DCEconstraint* constraint); + +extern char* simplepathstring(NClist* segments, char* separator); +extern void makesegmentstring3(NClist* segments, NCbytes* buf, char* separator); + +extern int iswholeprojection(DCEprojection*); + +extern void freegetvara(struct Getvara* vara); + +extern NCerror slicemerge3(DCEslice* dst, DCEslice* src); + +extern int iswholeslice(DCEslice*, struct CDFnode* dim); +extern int iswholesegment(DCEsegment*); + +extern int iswholeconstraint(DCEconstraint* con); + +extern char* buildprojectionstring3(NClist* projections); +extern char* buildselectionstring3(NClist* selections); +extern char* buildconstraintstring3(DCEconstraint* constraints); + +extern void makewholesegment3(DCEsegment*,struct CDFnode*); +extern void makewholeslice3(DCEslice* slice, struct CDFnode* dim); + +extern NCerror fixprojections(NClist* list); + +extern int dapvar2projection(CDFnode* var, DCEprojection** projectionp); +extern int daprestrictprojection(NClist* projections, DCEprojection* var, DCEprojection** resultp); +extern int dapshiftprojection(DCEprojection*); + +#endif /*CONSTRAINTS3_H*/ diff --git a/extern/src_netcdf4/dapalign.c b/extern/src_netcdf4/dapalign.c new file mode 100644 index 0000000..61efd2c --- /dev/null +++ b/extern/src_netcdf4/dapalign.c @@ -0,0 +1,332 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapalign.c,v 1.5 2009/09/23 22:26:00 dmh Exp $ + *********************************************************************/ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* +This code is a variantion of the H5detect.c code from HDF5. +Author: D. Heimbigner 10/7/2008 +*/ +#include "config.h" +#ifndef OFFSETTEST +#include "ncdap3.h" +#else +#include +#include +#include +#endif + +#include "dapnc.h" +#include "dapdebug.h" +#include "dapalign.h" + +typedef struct nccalignvlen_t { + size_t len; + void* p; +} nccalignvlen_t; + +#ifdef OFFSETTEST +typedef int nc_type; +#define NC_NAT 0 /* NAT = 'Not A Type' (c.f. NaN) */ +#define NC_BYTE 1 /* signed 1 byte integer */ +#define NC_CHAR 2 /* ISO/ASCII character */ +#define NC_SHORT 3 /* signed 2 byte integer */ +#define NC_INT 4 /* signed 4 byte integer */ +#define NC_FLOAT 5 /* single precision floating point number */ +#define NC_DOUBLE 6 /* double precision floating point number */ +#define NC_UBYTE 7 /* unsigned 1 byte int */ +#define NC_USHORT 8 /* unsigned 2-byte int */ +#define NC_UINT 9 /* unsigned 4-byte int */ +#define NC_INT64 10 /* signed 8-byte int */ +#define NC_UINT64 11 /* unsigned 8-byte int */ +#define NC_STRING 12 /* string */ +#define NC_VLEN 13 +#define NC_OPAQUE 14 +#endif + +/* +The heart of this is the following macro, +which computes the offset of a field x +when preceded by a char field. +The assumptions appear to be as follows: +1. the offset produced in this situation indicates + the alignment for x relative in such a way that it + depends only on the types that precede it in the struct. +2. the compiler does not reorder fields. +3. arrays are tightly packed. +4. nested structs are alignd according to their first member + (this actually follows from C language requirement that + a struct can legally be cast to an instance of its first member). +Given the alignments for the various common primitive types, +it is assumed that one can use them anywhere to construct +the layout of a struct of such types. +It seems to work for HDF5 for a wide variety of machines. +*/ + +#define COMP_ALIGNMENT(DST,TYPE) {\ + struct {char f1; TYPE x;} tmp; \ + DST.typename = #TYPE ; \ + DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));} + + +#define NCCTYPECOUNT (NCCTYPENCVLEN+1) + +static NCtypealignvec vec[NCCTYPECOUNT]; +static NCtypealignset set; +static int dapaligninit = 0; + +unsigned int +ncctypealignment(int nctype) +{ + NCtypealignment* align = NULL; + int index = 0; + if(!dapaligninit) compute_nccalignments(); + switch (nctype) { + case NC_BYTE: index = NCCTYPEUCHAR; break; + case NC_CHAR: index = NCCTYPECHAR; break; + case NC_SHORT: index = NCCTYPESHORT; break; + case NC_INT: index = NCCTYPEINT; break; + case NC_FLOAT: index = NCCTYPEFLOAT; break; + case NC_DOUBLE: index = NCCTYPEDOUBLE; break; + case NC_UBYTE: index = NCCTYPEUCHAR; break; + case NC_USHORT: index = NCCTYPEUSHORT; break; + case NC_UINT: index = NCCTYPEUINT; break; + case NC_INT64: index = NCCTYPELONGLONG; break; + case NC_UINT64: index = NCCTYPEULONGLONG; break; + case NC_STRING: index = NCCTYPEPTR; break; + case NC_VLEN: index = NCCTYPENCVLEN; break; + case NC_OPAQUE: index = NCCTYPEUCHAR; break; + default: +#ifndef OFFSETTEST + PANIC1("nctypealignment: bad type code: %d",nctype); +#else + return 0; +#endif + } + align = &vec[index]; + return align->alignment; +} + + +void +compute_nccalignments(void) +{ + /* Compute the alignments for all the common C data types*/ + /* First for the struct*/ + /* initialize*/ + memset((void*)&set,0,sizeof(set)); + memset((void*)vec,0,sizeof(vec)); + + COMP_ALIGNMENT(set.charalign,char); + COMP_ALIGNMENT(set.ucharalign,unsigned char); + COMP_ALIGNMENT(set.shortalign,short); + COMP_ALIGNMENT(set.ushortalign,unsigned short); + COMP_ALIGNMENT(set.intalign,int); + COMP_ALIGNMENT(set.uintalign,unsigned int); + COMP_ALIGNMENT(set.longalign,long); + COMP_ALIGNMENT(set.ulongalign,unsigned long); + COMP_ALIGNMENT(set.longlongalign,long long); + COMP_ALIGNMENT(set.ulonglongalign,unsigned long long); + COMP_ALIGNMENT(set.floatalign,float); + COMP_ALIGNMENT(set.doublealign,double); + COMP_ALIGNMENT(set.ptralign,void*); + COMP_ALIGNMENT(set.ncvlenalign,nccalignvlen_t); + + /* Then the vector*/ + COMP_ALIGNMENT(vec[NCCTYPECHAR],char); + COMP_ALIGNMENT(vec[NCCTYPEUCHAR],unsigned char); + COMP_ALIGNMENT(vec[NCCTYPESHORT],short); + COMP_ALIGNMENT(vec[NCCTYPEUSHORT],unsigned short); + COMP_ALIGNMENT(vec[NCCTYPEINT],int); + COMP_ALIGNMENT(vec[NCCTYPEUINT],unsigned int); + COMP_ALIGNMENT(vec[NCCTYPELONG],long); + COMP_ALIGNMENT(vec[NCCTYPEULONG],unsigned long); + COMP_ALIGNMENT(vec[NCCTYPELONGLONG],long long); + COMP_ALIGNMENT(vec[NCCTYPEULONGLONG],unsigned long long); + COMP_ALIGNMENT(vec[NCCTYPEFLOAT],float); + COMP_ALIGNMENT(vec[NCCTYPEDOUBLE],double); + COMP_ALIGNMENT(vec[NCCTYPEPTR],void*); + COMP_ALIGNMENT(vec[NCCTYPENCVLEN],nccalignvlen_t); + + dapaligninit = 1; +} + +/* Compute padding */ +int +nccpadding(unsigned long offset, int alignment) +{ + int pad,rem; + rem = (alignment==0?0:(offset % alignment)); + pad = (rem==0?0:(alignment - rem)); + return pad; +} + +#ifdef OFFSETTEST + +#define COMP_ALIGNMENT1(DST,TYPE1,TYPE) {\ + struct {TYPE1 f1; TYPE x;} tmp; \ + DST.typename = #TYPE ; \ + DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));} + +#define COMP_ALIGNMENT2(DST,TYPE1,TYPE2,TYPE) {\ + struct {TYPE1 f1, TYPE2 f2; TYPE x;} tmp; \ + DST.typename = #TYPE ; \ + DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));} + +#define COMP_SIZE0(DST,TYPE1,TYPE2) {\ + struct {TYPE1 c; TYPE2 x;} tmp; \ + DST = sizeof(tmp); } + +static char* +padname(char* name) +{ +#define MAX 20 + if(name == NULL) name = "null"; + int len = strlen(name); + if(len > MAX) len = MAX; + char* s = (char*)malloc(MAX+1); + memset(s,' ',MAX); + s[MAX+1] = '\0'; + strncpy(s,name,len); + return s; +} + +static void +verify(NCtypealignvec* vec) +{ + int i,j; + NCtypealignvec* vec16; + NCtypealignvec* vec32; + int* sizes8; + int* sizes16; + int* sizes32; + + vec16 = (NCtypealignvec*)malloc(sizeof(NCtypealignvec)*NCCTYPECOUNT); + vec32 = (NCtypealignvec*)malloc(sizeof(NCtypealignvec)*NCCTYPECOUNT); + sizes8 = (int*)malloc(sizeof(int)*NCCTYPECOUNT); + sizes16 = (int*)malloc(sizeof(int)*NCCTYPECOUNT); + sizes32 = (int*)malloc(sizeof(int)*NCCTYPECOUNT); + + COMP_SIZE0(sizes8[1],char,char); + COMP_SIZE0(sizes8[2],unsigned char,char); + COMP_SIZE0(sizes8[3],short,char); + COMP_SIZE0(sizes8[4],unsigned short,char); + COMP_SIZE0(sizes8[5],int,char); + COMP_SIZE0(sizes8[6],unsigned int,char); + COMP_SIZE0(sizes8[7],long,char); + COMP_SIZE0(sizes8[8],unsigned long,char); + COMP_SIZE0(sizes8[9],long long,char); + COMP_SIZE0(sizes8[10],unsigned long long,char); + COMP_SIZE0(sizes8[11],float,char); + COMP_SIZE0(sizes8[12],double,char) ; + COMP_SIZE0(sizes8[13],void*,char); + COMP_SIZE0(sizes8[14],alignvlen_t,char); + + COMP_SIZE0(sizes16[1],char,short); + COMP_SIZE0(sizes16[2],unsigned char,short); + COMP_SIZE0(sizes16[3],short,short); + COMP_SIZE0(sizes16[4],unsigned short,short); + COMP_SIZE0(sizes16[5],int,short); + COMP_SIZE0(sizes16[6],unsigned int,short); + COMP_SIZE0(sizes16[7],long,short); + COMP_SIZE0(sizes16[8],unsigned long,short); + COMP_SIZE0(sizes16[9],long long,short); + COMP_SIZE0(sizes16[10],unsigned long long,short); + COMP_SIZE0(sizes16[11],float,short); + COMP_SIZE0(sizes16[12],double,short) ; + COMP_SIZE0(sizes16[13],void*,short); + COMP_SIZE0(sizes16[14],alignvlen_t*,short); + + COMP_SIZE0(sizes32[1],char,int); + COMP_SIZE0(sizes32[2],unsigned char,int); + COMP_SIZE0(sizes32[3],short,int); + COMP_SIZE0(sizes32[4],unsigned short,int); + COMP_SIZE0(sizes32[5],int,int); + COMP_SIZE0(sizes32[6],unsigned int,int); + COMP_SIZE0(sizes32[7],long,int); + COMP_SIZE0(sizes32[8],unsigned long,int); + COMP_SIZE0(sizes32[9],long long,int); + COMP_SIZE0(sizes32[10],unsigned long long,int); + COMP_SIZE0(sizes32[11],float,int); + COMP_SIZE0(sizes32[12],double,int) ; + COMP_SIZE0(sizes32[13],void*,int); + COMP_SIZE0(sizes32[14],alignvlen_t*,int); + + COMP_ALIGNMENT1(vec16[1],char,short); + COMP_ALIGNMENT1(vec16[2],unsigned char,short); + COMP_ALIGNMENT1(vec16[3],short,short); + COMP_ALIGNMENT1(vec16[4],unsigned short,short); + COMP_ALIGNMENT1(vec16[5],int,short); + COMP_ALIGNMENT1(vec16[6],unsigned int,short); + COMP_ALIGNMENT1(vec32[7],long,short); + COMP_ALIGNMENT1(vec32[8],unsigned long,short); + COMP_ALIGNMENT1(vec32[9],long long,short); + COMP_ALIGNMENT1(vec32[10],unsigned long long,short); + COMP_ALIGNMENT1(vec16[11],float,short); + COMP_ALIGNMENT1(vec16[12],double,short); + COMP_ALIGNMENT1(vec16[13],void*,short); + COMP_ALIGNMENT1(vec16[14],alignvlen_t*,short); + + COMP_ALIGNMENT1(vec32[1],char,short); + COMP_ALIGNMENT1(vec32[2],unsigned char,short); + COMP_ALIGNMENT1(vec32[3],char,short); + COMP_ALIGNMENT1(vec32[4],unsigned short,short); + COMP_ALIGNMENT1(vec32[5],int,int); + COMP_ALIGNMENT1(vec32[6],unsigned int,int); + COMP_ALIGNMENT1(vec32[7],long,int); + COMP_ALIGNMENT1(vec32[8],unsigned long,int); + COMP_ALIGNMENT1(vec32[9],long long,int); + COMP_ALIGNMENT1(vec32[10],unsigned long long,int); + COMP_ALIGNMENT1(vec32[11],float,int); + COMP_ALIGNMENT1(vec32[12],double,int); + COMP_ALIGNMENT1(vec32[13],void*,int); + COMP_ALIGNMENT1(vec32[14],alignvlen_t*,int); + + for(i=0;i NOT-A-TYPE*/ +#define NCCTYPENAT 0 +#define NCCTYPECHAR 1 +#define NCCTYPEUCHAR 2 +#define NCCTYPESHORT 3 +#define NCCTYPEUSHORT 4 +#define NCCTYPEINT 5 +#define NCCTYPEUINT 6 +#define NCCTYPELONG 7 +#define NCCTYPEULONG 8 +#define NCCTYPELONGLONG 9 +#define NCCTYPEULONGLONG 10 +#define NCCTYPEFLOAT 11 +#define NCCTYPEDOUBLE 12 +#define NCCTYPEPTR 13 +#define NCCTYPENCVLEN 14 + +/* Capture in struct and in a vector*/ +typedef struct NCtypealignset { + NCtypealignment charalign; /* char*/ + NCtypealignment ucharalign; /* unsigned char*/ + NCtypealignment shortalign; /* short*/ + NCtypealignment ushortalign; /* unsigned short*/ + NCtypealignment intalign; /* int*/ + NCtypealignment uintalign; /* unsigned int*/ + NCtypealignment longalign; /* long*/ + NCtypealignment ulongalign; /* unsigned long*/ + NCtypealignment longlongalign; /* long long*/ + NCtypealignment ulonglongalign; /* unsigned long long*/ + NCtypealignment floatalign; /* float*/ + NCtypealignment doublealign; /* double*/ + NCtypealignment ptralign; /* void**/ + NCtypealignment ncvlenalign; /* nc_vlen_t*/ +} NCtypealignset; + +typedef NCtypealignment NCtypealignvec; + +extern void compute_nccalignments(void); +extern unsigned int ncctypealignment(int nctype); +extern int nccpadding(unsigned long offset, int alignment); + +#endif /*ALIGN_H*/ diff --git a/extern/src_netcdf4/dapattr3.c b/extern/src_netcdf4/dapattr3.c new file mode 100644 index 0000000..b39a61e --- /dev/null +++ b/extern/src_netcdf4/dapattr3.c @@ -0,0 +1,341 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapattr3.c,v 1.14 2009/12/03 03:42:38 dmh Exp $ + *********************************************************************/ + +#include "ncdap3.h" + +#define OCHECK(exp) if((ocstat = (exp))) goto done; + +/* Forward */ +static NCerror buildattribute(char*,nc_type,NClist*,NCattribute**); +static int mergedas1(NCDAPCOMMON*, OCconnection, CDFnode* dds, OCobject das); +static int isglobalname3(char* name); + +static NCerror +buildattribute(char* name, nc_type ptype, + NClist* values, NCattribute** attp) +{ + NCerror ncstat = NC_NOERR; + NCattribute* att; + + att = (NCattribute*)calloc(1,sizeof(NCattribute)); + MEMCHECK(att,NC_ENOMEM); + att->name = nulldup(name); + att->etype = ptype; + + att->values = values; + + if(attp) *attp = att; + + return THROW(ncstat); +} + +/* +Given a das attribute walk it to see if it +has at least 1 actual attribute (no recursion) +*/ +static int +hasattribute3(OCconnection conn, OCobject dasnode) +{ + int i; + OCerror ocstat = OC_NOERR; + int tf = 0; /* assume false */ + unsigned int nsubnodes; + OCtype ocsubtype; + OCobject* subnodes = NULL; + + OCHECK(oc_inq_class(conn,dasnode,&ocsubtype)); + if(ocsubtype == OC_Attribute) return 1; /* this is an attribute */ + ASSERT((ocsubtype == OC_Attributeset)); + + OCHECK(oc_inq_nsubnodes(conn,dasnode,&nsubnodes)); + OCHECK(oc_inq_subnodes(conn,dasnode,&subnodes)); + for(i=0;ioc.conn; + unsigned int nsubnodes, nobjects; + OCobject* dasobjects = NULL; + NClist* dasglobals = nclistnew(); + NClist* dasnodes = nclistnew(); + NClist* dodsextra = nclistnew(); + NClist* varnodes = nclistnew(); + NClist* allddsnodes = ddsroot->tree->nodes; + + if(ddsroot == NULL || dasroot == NULL) return NC_NOERR; + + nobjects = oc_inq_nobjects(conn,dasroot); + dasobjects = oc_inq_objects(conn,dasroot); + + /* 1. collect all the relevant DAS nodes; + namely those that contain at least one + attribute value. + Simultaneously look for potential ambiguities + if found; complain but continue: result are indeterminate. + also collect globals and DODS_EXTRA separately. + */ + for(i=0;inctype == NC_Primitive) nclistpush(varnodes,(ncelem)dds); + } + + /* 3. For each das node, lncate matching DDS node(s) and attach + attributes to the DDS node(s). + Match means: + 1. DAS->fullname :: DDS->fullname + 2. DAS->name :: DDS->fullname (support DAS names with embedded '.' + 3. DAS->name :: DDS->name + 4. special case for DODS. Apply 1-3 on DODS parent. + */ + for(i=0;iocname)==0) { + mergedas1(nccomm,conn,dds,das); + /* remove from dasnodes list*/ + nclistset(dasnodes,i,(ncelem)NULL); + } + nullfree(ddsfullname); + } + nullfree(ocfullname); + nullfree(ocbasename); + } + + /* 4. Assign globals */ + for(i=0;iattributes == NULL) dds->attributes = nclistnew(); + /* assign the simple attributes in the das set to this dds node*/ + OCHECK(oc_inq_nsubnodes(conn,das,&nsubnodes)); + OCHECK(oc_inq_subnodes(conn,das,&subnodes)); + for(i=0;iattributes,(ncelem)att); + } else if(octype == OC_Attributeset + && (strcmp(ocname,"DODS")==0 + || strcmp(ocname,"DODS_EXTRA")==0)) { + /* Turn the DODS special attributes into into + special attributes for dds node */ + OCHECK(oc_inq_nsubnodes(conn,attnode,&ndodsnodes)); + OCHECK(oc_inq_subnodes(conn,attnode,&dodsnodes)); + for(j=0;jinvisible = 1; + nclistpush(dds->attributes,(ncelem)att); + + /* Define extra semantics associated with DODS and DODS_EXTRA attribute */ + if(strcmp(dodsname,"strlen")==0) { + unsigned int maxstrlen = 0; + if(nclistlength(stringvalues) > 0) { + char* stringval = (char*)nclistget(stringvalues,0); + if(0==sscanf(stringval,"%u",&maxstrlen)) maxstrlen = 0; + } + dds->dodsspecial.maxstrlen = maxstrlen; +#ifdef DEBUG +fprintf(stderr,"%s.maxstrlen=%d\n",dds->ocname,(int)dds->dodsspecial.maxstrlen); +#endif + } else if(strcmp(dodsname,"dimName")==0) { + if(nclistlength(stringvalues) > 0) { + char* stringval = (char*)nclistget(stringvalues,0); + dds->dodsspecial.dimname = nulldup(stringval); +#ifdef DEBUG +fprintf(stderr,"%s.dimname=%s\n",dds->ocname,dds->dodsspecial.dimname); +#endif + } else dds->dodsspecial.dimname = NULL; + } else if(strcmp(dodsname,"Unlimited_Dimension")==0) { + if(nccomm->cdf.recorddimname != NULL) { + nclog(NCLOGWARN,"Duplicate DODS_EXTRA:Unlimited_Dimension specifications"); + } else if(nclistlength(stringvalues) > 0) { + char* stringval = (char*)nclistget(stringvalues,0); + nccomm->cdf.recorddimname = nulldup(stringval); +#ifdef DEBUG +fprintf(stderr,"%s.Unlimited_Dimension=%s\n",dds->ocname,nccomm->cdf.recorddimname); +#endif + } + } /* else ignore */ + nullfree(dodsname); + } + nullfree(dodsnodes); + } + nullfree(ocname); + } + +done: + nullfree(subnodes); + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return THROW(ncstat); +} + +static int +isglobalname3(char* name) +{ + int len = strlen(name); + int glen = strlen("global"); + char* p; + if(len < glen) return 0; + p = name + (len - glen); + if(strcasecmp(p,"global") != 0) + return 0; + return 1; +} + diff --git a/extern/src_netcdf4/dapcvt.c b/extern/src_netcdf4/dapcvt.c new file mode 100644 index 0000000..67041f2 --- /dev/null +++ b/extern/src_netcdf4/dapcvt.c @@ -0,0 +1,265 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapcvt.c,v 1.14 2009/11/29 00:16:26 dmh Exp $ + *********************************************************************/ +#include "config.h" +#include "ncdap3.h" +#include "dapodom.h" + +NCerror +dapconvert3(nc_type srctype, nc_type dsttype, char* memory0, char* value0, size_t count) +{ + NCerror ncstat = NC_NOERR; + size_t i; + char* memory = memory0; + char* value = value0; + + /* In order to deal with the DAP upgrade problem, + try to preserve the bit patterns + */ + + /* Provide space and pointer casts for intermediate results */ + signed char ncbyte; + signed char* ncbytep; + char ncchar; + char* nccharp; + short ncshort; + short* ncshortp; + int ncint; + int* ncintp; + float ncfloat; + float* ncfloatp; + double ncdouble; + double* ncdoublep; + unsigned char ncubyte; + unsigned char* ncubytep; + unsigned short ncushort; + unsigned short* ncushortp; + unsigned int ncuint; + unsigned int* ncuintp; + long long ncint64; + long long* ncint64p; + unsigned long long ncuint64; + unsigned long long* ncuint64p; + + +#define CASE(nc1,nc2) (nc1*256+nc2) +#define CUT8(e) ((unsigned char)((e) & 0xff)) +#define CUT16(e) ((unsigned short)((e) & 0xffff)) +#define CUT32(e) ((unsigned int)((e) & 0xffffffff)) +#define ARM(vs,ncs,ts,vd,ncd,td) \ +case CASE(ncs,ncd):\ + vs##p = (ts *)value;\ + vs = *vs##p;\ + vd##p = (td *)memory;\ + *vd##p = (td)vs;\ + break; + + for(i=0;i +#include + +#include "nclog.h" +#include "oc.h" +#include "dapdebug.h" + +int ncdap3debug = 0; + +#ifdef CATCHERROR +/* Place breakpoint here to catch errors close to where they occur*/ +int +dapbreakpoint(int err) {return err;} + +int +dapthrow(int err) +{ + if(err == 0) return err; + return dapbreakpoint(err); +} +#endif + +int +dappanic(const char* fmt, ...) +{ + va_list args; + if(fmt != NULL) { + va_start(args, fmt); + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n" ); + va_end( args ); + } else { + fprintf(stderr, "panic" ); + } + fprintf(stderr, "\n" ); + fflush(stderr); + return 0; +} diff --git a/extern/src_netcdf4/dapdebug.h b/extern/src_netcdf4/dapdebug.h new file mode 100644 index 0000000..ffd92d9 --- /dev/null +++ b/extern/src_netcdf4/dapdebug.h @@ -0,0 +1,73 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapdebug.h,v 1.33 2009/12/03 18:53:16 dmh Exp $ + *********************************************************************/ +#ifndef DEBUG_H +#define DEBUG_H + +#include "ocdebug.h" + +#ifdef DAPDEBUG +# define DEBUG +# if DAPDEBUG > 0 +# define DEBUG1 +# endif +# if DAPDEBUG > 1 +# define DEBUG2 +# endif +# if DAPDEBUG > 2 +# define DEBUG3 +# endif +#endif + +#undef PARSEDEBUG + +#include +#include + +/* Warning: setting CATCHERROR has significant performance impact */ +#undef CATCHERROR +#ifdef DEBUG +#undef CATCHERROR +#define CATCHERROR +#endif + +#define PANIC(msg) assert(dappanic(msg)); +#define PANIC1(msg,arg) assert(dappanic(msg,arg)); +#define PANIC2(msg,arg1,arg2) assert(dappanic(msg,arg1,arg2)); + +#define ASSERT(expr) if(!(expr)) {PANIC(#expr);} else {} + +extern int ncdap3debug; + +extern int dappanic(const char* fmt, ...); + +#define MEMCHECK(var,throw) {if((var)==NULL) return (throw);} + +#ifdef CATCHERROR +/* Place breakpoint on dapbreakpoint to catch errors close to where they occur*/ +#define THROW(e) dapthrow(e) +#define THROWCHK(e) (void)dapthrow(e) + +extern int dapbreakpoint(int err); +extern int dapthrow(int err); +#else +#define THROW(e) (e) +#define THROWCHK(e) +#endif + +#ifdef DEBUG +#define SHOWFETCH (1) +#define LOG0(level,msg) fprintf(stderr,msg) +#define LOG1(level,msg,a1) fprintf(stderr,msg,a1) +#define LOG2(level,msg,a1,a2) fprintf(stderr,msg,a1,a2) +#else +#define SHOWFETCH FLAGSET(nccomm->controls,NCF_SHOWFETCH) +#define LOG0(level,msg) nclog(level,msg) +#define LOG1(level,msg,a1) nclog(level,msg,a1) +#define LOG2(level,msg,a1,a2) nclog(level,msg,a1,a2) +#endif + +#endif /*DEBUG_H*/ + diff --git a/extern/src_netcdf4/dapdump.c b/extern/src_netcdf4/dapdump.c new file mode 100644 index 0000000..f26bdea --- /dev/null +++ b/extern/src_netcdf4/dapdump.c @@ -0,0 +1,607 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapdump.c,v 1.21 2010/05/26 21:43:31 dmh Exp $ + *********************************************************************/ +#include "config.h" +#ifdef USE_PARALLEL +#include "netcdf_par.h" +#endif +#include "ncdap3.h" +#include "dapdump.h" +#include "dceconstraints.h" + +#define CHECK(n) if((n) != NC_NOERR) {return (n);} else {} + +static void dumptreer(CDFnode* root, NCbytes* buf, int indent, int visible); + +int +dumpmetadata(int ncid, NChdr** hdrp) +{ + int stat,i,j,k; + NChdr* hdr = (NChdr*)calloc(1,sizeof(NChdr)); + MEMCHECK(hdr,NC_ENOMEM); + hdr->ncid = ncid; + hdr->content = ncbytesnew(); + if(hdrp) *hdrp = hdr; + + stat = nc_inq(hdr->ncid, + &hdr->ndims, + &hdr->nvars, + &hdr->ngatts, + &hdr->unlimid); + CHECK(stat); + if(ncdap3debug > 0) { + fprintf(stdout,"ncid=%d ngatts=%d ndims=%d nvars=%d unlimid=%d\n", + hdr->ncid,hdr->ngatts,hdr->ndims,hdr->nvars,hdr->unlimid); + } + hdr->gatts = (NCattribute*)calloc(1,hdr->ngatts*sizeof(NCattribute)); + MEMCHECK(hdr->gatts,NC_ENOMEM); + if(hdr->ngatts > 0) + fprintf(stdout,"global attributes:\n"); + for(i=0;ingatts;i++) { + NCattribute* att = &hdr->gatts[i]; + char attname[NC_MAX_NAME]; + nc_type nctype; + size_t typesize; + size_t nvalues; + + stat = nc_inq_attname(hdr->ncid,NC_GLOBAL,i,attname); + CHECK(stat); + att->name = nulldup(attname); + stat = nc_inq_att(hdr->ncid,NC_GLOBAL,att->name,&nctype,&nvalues); + CHECK(stat); + att->etype = nctypetodap(nctype); + typesize = nctypesizeof(att->etype); + fprintf(stdout,"\t[%d]: name=%s type=%s values(%lu)=", + i,att->name,nctypetostring(octypetonc(att->etype)), + (unsigned long)nvalues); + if(nctype == NC_CHAR) { + size_t len = typesize*nvalues; + char* values = (char*)malloc(len+1);/* for null terminate*/ + MEMCHECK(values,NC_ENOMEM); + stat = nc_get_att(hdr->ncid,NC_GLOBAL,att->name,values); + CHECK(stat); + values[len] = '\0'; + fprintf(stdout," '%s'",values); + } else { + size_t len = typesize*nvalues; + char* values = (char*)malloc(len); + MEMCHECK(values,NC_ENOMEM); + stat = nc_get_att(hdr->ncid,NC_GLOBAL,att->name,values); + CHECK(stat); + for(k=0;ketype),k,values); + } + } + fprintf(stdout,"\n"); + } + + hdr->dims = (Dim*)malloc(hdr->ndims*sizeof(Dim)); + MEMCHECK(hdr->dims,NC_ENOMEM); + for(i=0;indims;i++) { + hdr->dims[i].dimid = i; + stat = nc_inq_dim(hdr->ncid, + hdr->dims[i].dimid, + hdr->dims[i].name, + &hdr->dims[i].size); + CHECK(stat); + fprintf(stdout,"dim[%d]: name=%s size=%lu\n", + i,hdr->dims[i].name,(unsigned long)hdr->dims[i].size); + } + hdr->vars = (Var*)malloc(hdr->nvars*sizeof(Var)); + MEMCHECK(hdr->vars,NC_ENOMEM); + for(i=0;invars;i++) { + Var* var = &hdr->vars[i]; + nc_type nctype; + var->varid = i; + stat = nc_inq_var(hdr->ncid, + var->varid, + var->name, + &nctype, + &var->ndims, + var->dimids, + &var->natts); + CHECK(stat); + var->nctype = (nctype); + fprintf(stdout,"var[%d]: name=%s type=%s |dims|=%d", + i, + var->name, + nctypetostring(var->nctype), + var->ndims); + fprintf(stdout," dims={"); + for(j=0;jndims;j++) { + fprintf(stdout," %d",var->dimids[j]); + } + fprintf(stdout,"}\n"); + var->atts = (NCattribute*)malloc(var->natts*sizeof(NCattribute)); + MEMCHECK(var->atts,NC_ENOMEM); + for(j=0;jnatts;j++) { + NCattribute* att = &var->atts[j]; + char attname[NC_MAX_NAME]; + size_t typesize; + char* values; + nc_type nctype; + size_t nvalues; + stat = nc_inq_attname(hdr->ncid,var->varid,j,attname); + CHECK(stat); + att->name = nulldup(attname); + stat = nc_inq_att(hdr->ncid,var->varid,att->name,&nctype,&nvalues); + CHECK(stat); + att->etype = nctypetodap(nctype); + typesize = nctypesizeof(att->etype); + values = (char*)malloc(typesize*nvalues); + MEMCHECK(values,NC_ENOMEM); + stat = nc_get_att(hdr->ncid,var->varid,att->name,values); + CHECK(stat); + fprintf(stdout,"\tattr[%d]: name=%s type=%s values(%lu)=", + j,att->name,nctypetostring(octypetonc(att->etype)),(unsigned long)nvalues); + for(k=0;ketype),k,values); + } + fprintf(stdout,"\n"); + } + } + fflush(stdout); + return NC_NOERR; +} + +void +dumpdata1(nc_type nctype, size_t index, char* data) +{ + switch (nctype) { + case NC_CHAR: + fprintf(stdout,"'%c' %hhd",data[index],data[index]); + break; + case NC_BYTE: + fprintf(stdout,"%hdB",((signed char*)data)[index]); + break; + case NC_UBYTE: + fprintf(stdout,"%huB",((unsigned char*)data)[index]); + break; + case NC_SHORT: + fprintf(stdout,"%hdS",((short*)data)[index]); + break; + case NC_USHORT: + fprintf(stdout,"%hdUS",((unsigned short*)data)[index]); + break; + case NC_INT: + fprintf(stdout,"%d",((int*)data)[index]); + break; + case NC_UINT: + fprintf(stdout,"%uU",((unsigned int*)data)[index]); + break; + case NC_FLOAT: + fprintf(stdout,"%#gF",((float*)data)[index]); + break; + case NC_DOUBLE: + fprintf(stdout,"%#gD",((double*)data)[index]); + break; + case NC_STRING: + fprintf(stdout,"\"%s\"",((char**)data)[index]); + break; + default: + fprintf(stdout,"Unknown type: %i",nctype); + break; + } + fflush(stdout); +} + +/* Following should be kept consistent with + the makeXXXstring3 routines in constraints3.c +*/ + +/* Convert an NCprojection instance into a string + that can be used with the url +*/ +char* +dumpprojections(NClist* projections) +{ + char* tmp; + int v = dceverbose; + dceverbose = 1; + tmp = dcelisttostring(projections,","); + dceverbose = v; + return tmp; +} + +char* +dumpprojection(DCEprojection* proj) +{ + char* tmp; + int v = dceverbose; + dceverbose = 1; + tmp = dcetostring((DCEnode*)proj); + dceverbose = v; + return tmp; +} + +char* +dumpselections(NClist* selections) +{ + return dcelisttostring(selections,"&"); +} + +char* +dumpselection(DCEselection* sel) +{ + return dcetostring((DCEnode*)sel); +} + +char* +dumpconstraint(DCEconstraint* con) +{ + char* tmp; + int v = dceverbose; + dceverbose = 1; + tmp = dcetostring((DCEnode*)con); + dceverbose = v; + return tmp; +} + +char* +dumpsegments(NClist* segments) +{ + return dcelisttostring(segments,"."); +} + +char* +dumppath(CDFnode* leaf) +{ + NClist* path = nclistnew(); + NCbytes* buf = ncbytesnew(); + char* result; + int i; + + if(leaf == NULL) return nulldup(""); + collectnodepath3(leaf,path,!WITHDATASET); + for(i=0;i 0) ncbytescat(buf,"."); + ncbytescat(buf,node->ncbasename); + } + result = ncbytesdup(buf); + ncbytesfree(buf); + nclistfree(path); + return result; +} + +static void +dumpindent(int indent, NCbytes* buf) +{ + static char* indentstr = " "; + int i; + for(i=0;isubnodes);i++) { + CDFnode* node = (CDFnode*)nclistget(root->subnodes,i); + if(visible && !root->visible) continue; + if(root->nctype == NC_Grid) { + if(i==0) { + dumpindent(indent+1,buf); + ncbytescat(buf,"Array:\n"); + } else if(i==1) { + dumpindent(indent+1,buf); + ncbytescat(buf,"Maps:\n"); + } + dumptreer(node,buf,indent+2,visible); + } else { + dumptreer(node,buf,indent+1,visible); + } + } + dumpindent(indent,buf); + ncbytescat(buf,"} "); + ncbytescat(buf,root->ncbasename); +} + +static void +dumptreer(CDFnode* root, NCbytes* buf, int indent, int visible) +{ + int i; + char* primtype = NULL; + NClist* dimset = NULL; + + if(visible && !root->visible) return; + switch (root->nctype) { + case NC_Dataset: + dumptreer1(root,buf,indent,"Dataset",visible); + break; + case NC_Sequence: + dumptreer1(root,buf,indent,"Sequence",visible); + break; + case NC_Structure: + dumptreer1(root,buf,indent,"Structure",visible); + break; + case NC_Grid: + dumptreer1(root,buf,indent,"Grid",visible); + break; + case NC_Primitive: + switch (root->etype) { + case NC_BYTE: primtype = "byte"; break; + case NC_CHAR: primtype = "char"; break; + case NC_SHORT: primtype = "short"; break; + case NC_INT: primtype = "int"; break; + case NC_FLOAT: primtype = "float"; break; + case NC_DOUBLE: primtype = "double"; break; + case NC_UBYTE: primtype = "ubyte"; break; + case NC_USHORT: primtype = "ushort"; break; + case NC_UINT: primtype = "uint"; break; + case NC_INT64: primtype = "int64"; break; + case NC_UINT64: primtype = "uint64"; break; + case NC_STRING: primtype = "string"; break; + default: break; + } + dumpindent(indent,buf); + ncbytescat(buf,primtype); + ncbytescat(buf," "); + ncbytescat(buf,root->ncbasename); + break; + default: break; + } + + if(nclistlength(root->array.dimsetplus) > 0) dimset = root->array.dimsetplus; + else if(nclistlength(root->array.dimset0) > 0) dimset = root->array.dimset0; + if(dimset != NULL) { + for(i=0;incbasename != NULL) { + ncbytescat(buf,dim->ncbasename); + ncbytescat(buf,"="); + } + snprintf(tmp,sizeof(tmp),"%lu",(unsigned long)dim->dim.declsize); + ncbytescat(buf,tmp); + ncbytescat(buf,"]"); + } + } + ncbytescat(buf,";\n"); +} + +char* +dumptree(CDFnode* root) +{ + NCbytes* buf = ncbytesnew(); + char* result; + dumptreer(root,buf,0,0); + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + +char* +dumpvisible(CDFnode* root) +{ + NCbytes* buf = ncbytesnew(); + char* result; + dumptreer(root,buf,0,1); + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + +/* Provide detailed data on a CDFnode */ +char* +dumpnode(CDFnode* node) +{ + NCbytes* buf = ncbytesnew(); + char* result; + int i; + char* nctype = NULL; + char* primtype = NULL; + char tmp[1024]; + + switch (node->nctype) { + case NC_Dataset: nctype = "Dataset"; break; + case NC_Sequence: nctype = "Sequence"; break; + case NC_Structure: nctype = "Structure"; break; + case NC_Grid: nctype = "Grid"; break; + case NC_Primitive: + switch (node->etype) { + case NC_BYTE: primtype = "byte"; break; + case NC_CHAR: primtype = "char"; break; + case NC_SHORT: primtype = "short"; break; + case NC_INT: primtype = "int"; break; + case NC_FLOAT: primtype = "float"; break; + case NC_DOUBLE: primtype = "double"; break; + case NC_UBYTE: primtype = "ubyte"; break; + case NC_USHORT: primtype = "ushort"; break; + case NC_UINT: primtype = "uint"; break; + case NC_INT64: primtype = "int64"; break; + case NC_UINT64: primtype = "uint64"; break; + case NC_STRING: primtype = "string"; break; + default: break; + } + break; + default: break; + } + snprintf(tmp,sizeof(tmp),"%s %s {\n", + (nctype?nctype:primtype),node->ocname); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"ocnode=%lx\n",(unsigned long)node->ocnode); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"container=%s\n", + (node->container?node->container->ocname:"null")); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"root=%s\n", + (node->root?node->root->ocname:"null")); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"ncbasename=%s\n",node->ncbasename); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"ncfullname=%s\n",node->ncfullname); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"|subnodes|=%d\n",nclistlength(node->subnodes)); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"externaltype=%d\n",node->externaltype); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"ncid=%d\n",node->ncid); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"maxstringlength=%ld\n",node->maxstringlength); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"sequencelimit=%ld\n",node->sequencelimit); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"usesequence=%d\n",node->usesequence); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"elided=%d\n",node->elided); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"visible=%d\n",node->visible); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"attachment=%s\n", + (node->attachment?node->attachment->ocname:"null")); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp),"rank=%u\n",nclistlength(node->array.dimset0)); + ncbytescat(buf,tmp); + for(i=0;iarray.dimset0);i++) { + CDFnode* dim = (CDFnode*)nclistget(node->array.dimset0,i); + snprintf(tmp,sizeof(tmp),"dims[%d]={\n",i); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp)," ocname=%s\n",dim->ocname); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp)," ncbasename=%s\n",dim->ncbasename); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp)," dimflags=%u\n", + (unsigned int)dim->dim.dimflags); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp)," declsize=%lu\n", + (unsigned long)dim->dim.declsize); + ncbytescat(buf,tmp); + snprintf(tmp,sizeof(tmp)," }\n"); + ncbytescat(buf,tmp); + } + + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + +char* +dumpalign(NCalignment* ncalign) +{ + char* result; + char tmp[1024]; + if(ncalign == NULL) + result = nulldup("NCalignment{size=-- alignment=-- offset=--}"); + else { + snprintf(tmp,sizeof(tmp),"NCalignment{size=%lu alignment=%lu offset=%lu}", + ncalign->size,ncalign->alignment,ncalign->offset); + result = nulldup(tmp); + } + return result; +} + +char* +dumpcachenode(NCcachenode* node) +{ + char* result = NULL; + char tmp[8192]; + int i; + NCbytes* buf; + + if(node == NULL) return strdup("cachenode{null}"); + buf = ncbytesnew(); + result = buildconstraintstring3(node->constraint); + snprintf(tmp,sizeof(tmp),"cachenode%s(%lx){size=%lu; constraint=%s; vars=", + node->prefetch?"*":"", + (unsigned long)node, + (unsigned long)node->xdrsize, + result); + ncbytescat(buf,tmp); + if(nclistlength(node->vars)==0) + ncbytescat(buf,"null"); + else for(i=0;ivars);i++) { + CDFnode* var = (CDFnode*)nclistget(node->vars,i); + if(i > 0) ncbytescat(buf,","); + ncbytescat(buf,makecdfpathstring3(var,".")); + } + ncbytescat(buf,"}"); + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + +char* +dumpcache(NCcache* cache) +{ + char* result = NULL; + char tmp[8192]; + int i; + NCbytes* buf; + + if(cache == NULL) return strdup("cache{null}"); + buf = ncbytesnew(); + snprintf(tmp,sizeof(tmp),"cache{limit=%lu; size=%lu;\n", + (unsigned long)cache->cachelimit, + (unsigned long)cache->cachesize); + ncbytescat(buf,tmp); + if(cache->prefetch) { + ncbytescat(buf,"\tprefetch="); + ncbytescat(buf,dumpcachenode(cache->prefetch)); + ncbytescat(buf,"\n"); + } + if(nclistlength(cache->nodes) > 0) { + for(i=0;inodes);i++) { + NCcachenode* node = (NCcachenode*)nclistget(cache->nodes,i); + ncbytescat(buf,"\t"); + ncbytescat(buf,dumpcachenode(node)); + ncbytescat(buf,"\n"); + } + } + ncbytescat(buf,"}"); + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + +/* This should be consistent with makeslicestring3 in constraints3.c */ +char* +dumpslice(DCEslice* slice) +{ + char buf[8192]; + char tmp[8192]; + size_t last = (slice->first+slice->length)-1; + buf[0] = '\0'; + if(last > slice->declsize && slice->declsize > 0) + last = slice->declsize - 1; + if(slice->count == 1) { + snprintf(tmp,sizeof(tmp),"[%lu]", + (unsigned long)slice->first); + } else if(slice->stride == 1) { + snprintf(tmp,sizeof(tmp),"[%lu:%lu]", + (unsigned long)slice->first, + (unsigned long)last); + } else { + snprintf(tmp,sizeof(tmp),"[%lu:%lu:%lu]", + (unsigned long)slice->first, + (unsigned long)slice->stride, + (unsigned long)last); + } + strcat(buf,tmp); + return strdup(tmp); +} + +char* +dumpslices(DCEslice* slice, unsigned int rank) +{ + int i; + NCbytes* buf; + char* result = NULL; + + buf = ncbytesnew(); + for(i=0;i +#include "dapparselex.h" + +#undef URLCVT /* NEVER turn this on */ +#define DAP2ENCODE + +/* Forward */ +static void dumptoken(DAPlexstate* lexstate); +static void dapaddyytext(DAPlexstate* lex, int c); +#ifndef DAP2ENCODE +static int tohex(int c); +#endif + +/****************************************************/ + +#if 0 /* Following definitions are for informational purposes */ +/* Set of all ascii printable characters */ +static char ascii[] = " !\"#$%&'()*+,-./:;<=>?@[]\\^_`|{}~"; + +/* Define the set of legal nonalphanum characters as specified in the DAP2 spec. */ +static char* daplegal ="_!~*'-\""; +#endif + +static char* ddsworddelims = + "{}[]:;=,"; + +/* Define 1 and > 1st legal characters */ +static char* ddswordchars1 = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\.*"; +static char* ddswordcharsn = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\.*#"; +static char* daswordcharsn = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\.*#:"; +static char* cewordchars1 = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\"; +static char* cewordcharsn = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\"; + +/* Current sets of legal characters */ +/* +static char* wordchars1 = NULL; +static char* wordcharsn = NULL; +static char* worddelims = NULL; +*/ + +static char* keywords[] = { +"alias", +"array", +"attributes", +"byte", +"dataset", +"error", +"float32", +"float64", +"grid", +"int16", +"int32", +"maps", +"sequence", +"string", +"structure", +"uint16", +"uint32", +"url", +"code", +"message", +"program_type", +"program", +NULL /* mark end of the keywords list */ +}; + +static int keytokens[] = { +SCAN_ALIAS, +SCAN_ARRAY, +SCAN_ATTR, +SCAN_BYTE, +SCAN_DATASET, +SCAN_ERROR, +SCAN_FLOAT32, +SCAN_FLOAT64, +SCAN_GRID, +SCAN_INT16, +SCAN_INT32, +SCAN_MAPS, +SCAN_SEQUENCE, +SCAN_STRING, +SCAN_STRUCTURE, +SCAN_UINT16, +SCAN_UINT32, +SCAN_URL, +SCAN_CODE, +SCAN_MESSAGE, +SCAN_PTYPE, +SCAN_PROG +}; + +/**************************************************/ + +int +daplex(YYSTYPE* lvalp, DAPparsestate* state) +{ + DAPlexstate* lexstate = state->lexstate; + int token; + int c; + unsigned int i; + char* p; + char* tmp; + + token = 0; + ocbytesclear(lexstate->yytext); + /* invariant: p always points to current char */ + for(p=lexstate->next;token==0&&(c=*p);p++) { + if(c == '\n') { + lexstate->lineno++; + } else if(c <= ' ' || c == '\177') { + /* whitespace: ignore */ + } else if(c == '#') { + /* single line comment */ + while((c=*(++p))) {if(c == '\n') break;} + } else if(strchr(lexstate->worddelims,c) != NULL) { + /* don't put in lexstate->yytext to avoid memory leak */ + token = c; + } else if(c == '"') { + int more = 1; + /* We have a string token; will be reported as WORD_STRING */ + while(more && (c=*(++p))) { +#ifdef DAP2ENCODE + if(c == '"') + more = 0; + else if(c == '\\') { + /* Remove spec ambiguity by convering \c to c + for any character c */ + c=*(++p); + if(c == '\0') more = 0; + } +#else /*Non-standard*/ + switch (c) { + case '"': more=0; break; + case '\\': + c=*(++p); + switch (c) { + case 'r': c = '\r'; break; + case 'n': c = '\n'; break; + case 'f': c = '\f'; break; + case 't': c = '\t'; break; + case 'x': { + int d1,d2; + c = '?'; + ++p; + d1 = tohex(*p++); + if(d1 < 0) { + daperror(state,"Illegal \\xDD in TOKEN_STRING"); + } else { + d2 = tohex(*p++); + if(d2 < 0) { + daperror(state,"Illegal \\xDD in TOKEN_STRING"); + } else { + c=(((unsigned int)d1)<<4) | (unsigned int)d2; + } + } + } break; + default: break; + } + break; + default: break; + } +#endif /*!DAP2ENCODE*/ + if(more) dapaddyytext(lexstate,c); + } + token=WORD_STRING; + } else if(strchr(lexstate->wordchars1,c) != NULL) { + int isdatamark = 0; + /* we have a WORD_WORD */ + dapaddyytext(lexstate,c); + while((c=*(++p))) { +#ifdef URLCVT + if(c == '%' && p[1] != 0 && p[2] != 0 + && strchr(hexdigits,p[1]) != NULL + && strchr(hexdigits,p[2]) != NULL) { + int d1,d2; + d1 = tohex(p[1]); + d2 = tohex(p[2]); + if(d1 >= 0 || d2 >= 0) { + c=(((unsigned int)d1)<<4) | (unsigned int)d2; + p+=2; + } + } else { + if(strchr(lexstate->wordcharsn,c) == NULL) {p--; break;} + } + dapaddyytext(lexstate,c); +#else + if(strchr(lexstate->wordcharsn,c) == NULL) {p--; break;} + dapaddyytext(lexstate,c); +#endif + } + /* Special check for Data: */ + tmp = ocbytescontents(lexstate->yytext); + if(strcmp(tmp,"Data")==0 && *p == ':') { + dapaddyytext(lexstate,*p); p++; + if(p[0] == '\n') { + token = SCAN_DATA; + isdatamark = 1; + p++; + } else if(p[0] == '\r' && p[1] == '\n') { + token = SCAN_DATA; + isdatamark = 1; + p+=2; + } + } + if(!isdatamark) { + /* check for keyword */ + token=WORD_WORD; /* assume */ + for(i=0;;i++) { + if(keywords[i] == NULL) break; + if(strcasecmp(keywords[i],tmp)==0) { + token=keytokens[i]; + break; + } + } + } + } else { /* illegal */ + } + } + lexstate->next = p; + strncpy(lexstate->lasttokentext,ocbytescontents(lexstate->yytext),MAX_TOKEN_LENGTH); + lexstate->lasttoken = token; + if(ocdebug >= 2) + dumptoken(lexstate); + + /*Put return value onto Bison stack*/ + + if(ocbyteslength(lexstate->yytext) == 0) + *lvalp = NULL; + else { + *lvalp = ocbytesdup(lexstate->yytext); + oclistpush(lexstate->reclaim,(ocelem)*lvalp); + } + return token; /* Return the type of the token. */ +} + +static void +dapaddyytext(DAPlexstate* lex, int c) +{ + ocbytesappend(lex->yytext,(char)c); +} + +#ifndef DAP2ENCODE +static int +tohex(int c) +{ + if(c >= 'a' && c <= 'f') return (c - 'a') + 0xa; + if(c >= 'A' && c <= 'F') return (c - 'A') + 0xa; + if(c >= '0' && c <= '9') return (c - '0'); + return -1; +} +#endif + +static void +dumptoken(DAPlexstate* lexstate) +{ + fprintf(stderr,"TOKEN = |%s|\n",ocbytescontents(lexstate->yytext)); +} + +/* +Simple lexer +*/ + +void +dapsetwordchars(DAPlexstate* lexstate, int kind) +{ + switch (kind) { + case 0: + lexstate->worddelims = ddsworddelims; + lexstate->wordchars1 = ddswordchars1; + lexstate->wordcharsn = ddswordcharsn; + break; + case 1: + lexstate->worddelims = ddsworddelims; + lexstate->wordchars1 = ddswordchars1; + lexstate->wordcharsn = daswordcharsn; + break; + case 2: + lexstate->worddelims = ddsworddelims; + lexstate->wordchars1 = cewordchars1; + lexstate->wordcharsn = cewordcharsn; + break; + default: break; + } +} + +void +daplexinit(char* input, DAPlexstate** lexstatep) +{ + DAPlexstate* lexstate = (DAPlexstate*)malloc(sizeof(DAPlexstate)); + if(lexstatep) *lexstatep = lexstate; + if(lexstate == NULL) return; + memset((void*)lexstate,0,sizeof(DAPlexstate)); + lexstate->input = strdup(input); + lexstate->next = lexstate->input; + lexstate->yytext = ocbytesnew(); + lexstate->reclaim = oclistnew(); + dapsetwordchars(lexstate,0); /* Assume DDS */ +} + +void +daplexcleanup(DAPlexstate** lexstatep) +{ + DAPlexstate* lexstate = *lexstatep; + if(lexstate == NULL) return; + if(lexstate->input != NULL) ocfree(lexstate->input); + if(lexstate->reclaim != NULL) { + while(oclistlength(lexstate->reclaim) > 0) { + char* word = (char*)oclistpop(lexstate->reclaim); + if(word) free(word); + } + oclistfree(lexstate->reclaim); + } + ocbytesfree(lexstate->yytext); + free(lexstate); + *lexstatep = NULL; +} + +/* Dap identifiers will come to us with some + characters escaped using the URL notation of + %HH. The assumption here is that any character + that is encoded is left encoded, except as follows: + 1. if the encoded character is in fact a legal DAP2 character + (alphanum+"_!~*'-\"") then it is decoded, otherwise not. +*/ +#ifndef DECODE_IDENTIFIERS +static char* decodelist = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_!~*'-\""; +#endif + +char* +dapdecode(DAPlexstate* lexstate, char* name) +{ + char* decoded; +#ifdef DECODE_IDENTIFIERS + decoded = ocuridecode(name); +#else + decoded = ocuridecodeonly(name,decodelist); +#endif + oclistpush(lexstate->reclaim,(ocelem)decoded); + return decoded; +} diff --git a/extern/src_netcdf4/dapnc.h b/extern/src_netcdf4/dapnc.h new file mode 100644 index 0000000..c75482b --- /dev/null +++ b/extern/src_netcdf4/dapnc.h @@ -0,0 +1,21 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapnc.h,v 1.10 2009/09/23 22:26:01 dmh Exp $ + *********************************************************************/ +#ifndef DAPNC_H +#define DAPNC_H + +/* Take some types from libsrc4/netcdf.h*/ +#define NC_UBYTE 7 /* unsigned 1 byte int */ +#define NC_USHORT 8 /* unsigned 2-byte int */ +#define NC_UINT 9 /* unsigned 4-byte int */ +#define NC_INT64 10 /* signed 8-byte int */ +#define NC_UINT64 11 /* unsigned 8-byte int */ +#define NC_STRING 12 /* string */ +#define NC_VLEN 13 /* used internally for vlen types */ +#define NC_OPAQUE 14 /* used internally for opaque types */ +#define NC_ENUM 15 /* used internally for enum types */ +#define NC_COMPOUND 16 /* used internally for compound types */ + +#endif /*DAPNC_H*/ diff --git a/extern/src_netcdf4/dapodom.c b/extern/src_netcdf4/dapodom.c new file mode 100644 index 0000000..7b34d14 --- /dev/null +++ b/extern/src_netcdf4/dapodom.c @@ -0,0 +1,252 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/dapodom.c,v 1.12 2010/05/27 21:34:08 dmh Exp $ + *********************************************************************/ + +#include "ncdap3.h" +#include "dapodom.h" + +/**********************************************/ +/* Define methods for a dimension dapodometer*/ + +Dapodometer* +newdapodometer(DCEslice* slices, unsigned int first, unsigned int rank) +{ + int i; + Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer)); + MEMCHECK(odom,NULL); + if(rank == 0) { + return newdapodometer1(1); + } + odom->rank = rank; + ASSERT(odom->rank <= NC_MAX_VAR_DIMS); + for(i=0;irank;i++) { + DCEslice* slice = slices+(first+i); + odom->slices[i] = *slice; + odom->index[i] = odom->slices[i].first; + } + return odom; +} + +Dapodometer* +newsimpledapodometer(DCEsegment* segment, unsigned int rank) +{ + int i; + Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer)); + MEMCHECK(odom,NULL); + if(rank == 0) { + return newdapodometer1(1); + } + odom->rank = rank; + assert(odom->rank <= NC_MAX_VAR_DIMS); + assert(segment->slicesdefined && segment->slicesdeclized); + for(i=0;irank;i++) { + DCEslice* odslice = &odom->slices[i]; + DCEslice* segslice = &segment->slices[i]; + odslice->first = 0; + odslice->stride = 1; + odslice->declsize = segslice->count; + odslice->length = odslice->declsize; + odslice->stop = odslice->declsize; + odslice->count = odslice->declsize; + odom->index[i] = 0; + } + return odom; +} + +Dapodometer* +newdapodometer1(unsigned int count) +{ + Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer)); + MEMCHECK(odom,NULL); + odom->rank = 1; + odom->slices[0].first = 0; + odom->slices[0].length = count; + odom->slices[0].stride = 1; + odom->slices[0].stop = count; + odom->slices[0].declsize = count; + odom->slices[0].count = count; + odom->index[0] = 0; + return odom; +} + +void +freedapodometer(Dapodometer* odom) +{ + if(odom) free(odom); +} + +char* +dapodometerprint(Dapodometer* odom) +{ + int i; + static char line[1024]; + char tmp[64]; + line[0] = '\0'; + if(odom->rank == 0) { + strcat(line,"[]"); + } else for(i=0;irank;i++) { + sprintf(tmp,"[%lu/%lu:%lu:%lu]", + (unsigned long)odom->index[i], + (unsigned long)odom->slices[i].first, + (unsigned long)odom->slices[i].stride, + (unsigned long)odom->slices[i].length); + strcat(line,tmp); + } + return line; +} + +int +dapodometermore(Dapodometer* odom) +{ + return (odom->index[0] < odom->slices[0].stop); +} + +void +dapodometerreset(Dapodometer* odom) +{ + int rank = odom->rank; + while(rank-- > 0) {odom->index[rank] = odom->slices[rank].first;} +} + +/* Convert current dapodometer settings to a single integer count*/ +size_t +dapodometercount(Dapodometer* odom) +{ + int i; + size_t offset = 0; + for(i=0;irank;i++) { + offset *= odom->slices[i].declsize; + offset += odom->index[i]; + } + return offset; +} + +/* +Given a dapodometer, compute the total +number of elements in its space +as determined by declsize; start at +offset wheel +*/ + +size_t +dapodometerspace(Dapodometer* odom, unsigned int wheel) +{ + unsigned int i,rank = odom->rank; + size_t count = 1; + DCEslice* slice; + ASSERT((wheel < rank)); + slice = odom->slices+wheel; + for(i=wheel;ideclsize; + } + return count; +} + +/* +Compute the number of elements +that will be returned as the odometer +is incremented to its stop point. +*/ + +size_t +dapodometerpoints(Dapodometer* odom) +{ + unsigned int i,rank = odom->rank; + size_t count = 1; + DCEslice* slice = odom->slices; + for(i=0;ilength/slice->stride); + count *= slicecount; + } + return count; +} + +int +dapodometerincr(Dapodometer* odom) +{ + return dapodometerincrith(odom,-1); +} + +int +dapodometerincrith(Dapodometer* odom, int wheel) +{ + int i; /* do not make unsigned */ + DCEslice* slice; + if(odom->rank == 0) return 0; + if(wheel < 0) wheel = (odom->rank - 1); + for(slice=odom->slices+(wheel),i=wheel;i>=0;i--,slice--) { + odom->index[i] += slice->stride; + if(odom->index[i] < slice->stop) break; + if(i == 0) return 0; /* leave the 0th entry if it overflows*/ + odom->index[i] = slice->first; /* reset this position*/ + } + return 1; +} + +/**************************************************/ +int +dapodometervarmcount(Dapodometer* odom, const ptrdiff_t* steps, const size_t* declsizes) +{ + int i; + size_t offset = 0; + for(i=0;irank;i++) { + size_t tmp; + tmp = odom->index[i]; + tmp = tmp - odom->slices[i].first; + tmp = tmp / odom->slices[i].stride; + tmp = tmp * steps[i]; + offset += tmp; + } + return offset; +} + + +/* Return the current set of indices */ +size_t* +dapodometerindices(Dapodometer* odom) +{ + if(odom == NULL) return NULL; + return odom->index; +} + +Dapodometer* +newdapodometer2(const size_t* start, const size_t* count, const ptrdiff_t* stride, + unsigned int first, unsigned int rank) +{ + int i; + Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer)); + MEMCHECK(odom,NULL); + odom->rank = rank; + assert(odom->rank <= NC_MAX_VAR_DIMS); + for(i=0;irank;i++) { + odom->slices[i].first = start[first+i]; + odom->slices[i].stride = (size_t)stride[first+i]; + odom->slices[i].length = count[first+i] * stride[first+i]; + odom->slices[i].stop = (odom->slices[i].first+odom->slices[i].length); + odom->slices[i].declsize = odom->slices[i].stop; + odom->slices[i].count = (odom->slices[i].length /odom->slices[i].stride); + odom->index[i] = odom->slices[i].first; + } + return odom; +} + +Dapodometer* +newdapodometer3(int rank, size_t* dimsizes) +{ + int i; + Dapodometer* odom = (Dapodometer*)calloc(1,sizeof(Dapodometer)); + MEMCHECK(odom,NULL); + odom->rank = rank; + for(i=0;islices[i].first = 0; + odom->slices[i].length = dimsizes[i]; + odom->slices[i].stride = 1; + odom->slices[i].stop = dimsizes[i]; + odom->slices[i].declsize = dimsizes[i]; + odom->slices[i].count = (odom->slices[i].length / odom->slices[i].stride); + odom->index[i] = 0; + } + return odom; +} diff --git a/extern/src_netcdf4/dapodom.h b/extern/src_netcdf4/dapodom.h new file mode 100644 index 0000000..05c10ac --- /dev/null +++ b/extern/src_netcdf4/dapodom.h @@ -0,0 +1,42 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header$ + *********************************************************************/ + +#ifndef DAPODOM_H +#define DAPODOM_H 1 + +typedef struct Dapodometer { + int rank; + DCEslice slices[NC_MAX_VAR_DIMS]; + size_t index[NC_MAX_VAR_DIMS]; +} Dapodometer; + +/* Odometer operators*/ +extern Dapodometer* newdapodometer(DCEslice* slices, unsigned int first, unsigned int count); + +extern Dapodometer* newsimpledapodometer(struct DCEsegment*,unsigned int); + +extern Dapodometer* newdapodometer1(unsigned int count); +extern Dapodometer* newdapodometer2(const size_t*, const size_t*, + const ptrdiff_t*, unsigned int, unsigned int); +extern Dapodometer* newdapodometer3(int, size_t*); + +extern void freedapodometer(Dapodometer*); +extern char* dapodometerprint(Dapodometer* odom); + +extern int dapodometermore(Dapodometer* odom); +extern int dapodometerincr(Dapodometer* odo); +extern int dapodometerincrith(Dapodometer* odo,int); +extern size_t dapodometercount(Dapodometer* odo); +extern void dapodometerreset(Dapodometer*); +extern Dapodometer* dapodometersplit(Dapodometer* odom, int tail); + +extern size_t dapodometerspace(Dapodometer* odom, unsigned int wheel); +extern size_t dapodometerpoints(Dapodometer*); + +extern size_t* dapodometerindices(Dapodometer*); +extern int dapodometervarmcount(Dapodometer*, const ptrdiff_t*, const size_t*); + +#endif /*DAPODOM_H*/ diff --git a/extern/src_netcdf4/dapparse.c b/extern/src_netcdf4/dapparse.c new file mode 100644 index 0000000..a3a1a16 --- /dev/null +++ b/extern/src_netcdf4/dapparse.c @@ -0,0 +1,480 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include "dapparselex.h" + +/* Forward */ + +static void addedges(OCnode* node); +static void setroot(OCnode*,OClist*); +static int isglobalname(char* name); +static OCnode* newocnode(char* name, OCtype octype, DAPparsestate* state); +static OCtype octypefor(Object etype); +static char* scopeduplicates(OClist* list); +static int check_int32(char* val, long* value); + + +/****************************************************/ + +/* Switch to DAS parsing SCAN_WORD definition */ + +/* Use the initial keyword to indicate what we are parsing */ +void +dap_tagparse(DAPparsestate* state, int kind) +{ + switch (kind) { + case SCAN_DATASET: + case SCAN_ERROR: + break; + case SCAN_ATTR: + dapsetwordchars(state->lexstate,1); + break; + default: + fprintf(stderr,"tagparse: Unknown tag argument: %d\n",kind); + } +} + + +Object +dap_datasetbody(DAPparsestate* state, Object name, Object decls) +{ + OCnode* root = newocnode((char*)name,OC_Dataset,state); + root->subnodes = (OClist*)decls; + OCASSERT((state->root == NULL)); + state->root = root; + state->root->root = state->root; /* make sure to cross link */ + addedges(root); + setroot(root,state->ocnodes); + return NULL; +} + +Object +dap_attributebody(DAPparsestate* state, Object attrlist) +{ + OCnode* node = newocnode(NULL,OC_Attributeset,state); + OCASSERT((state->root == NULL)); + state->root = node; + /* make sure to cross link */ + state->root->root = state->root; + node->subnodes = (OClist*)attrlist; + addedges(node); + return NULL; +} + +void +dap_errorbody(DAPparsestate* state, + Object code, Object msg, Object ptype, Object prog) +{ + state->svcerror = 1; + state->code = nulldup((char*)code); + state->message = nulldup((char*)msg); + /* Ignore ptype and prog for now */ +} + +void +dap_unrecognizedresponse(DAPparsestate* state) +{ + /* see if this is an HTTP error */ + unsigned int httperr = 0; + int i; + char iv[32]; + sscanf(state->lexstate->input,"%u ",&httperr); + sprintf(iv,"%u",httperr); + state->lexstate->next = state->lexstate->input; + /* Limit the amount of input to prevent runaway */ + for(i=0;i<4096;i++) {if(state->lexstate->input[i] == '\0') break;} + state->lexstate->input[i] = '\0'; + dap_errorbody(state,iv,state->lexstate->input,NULL,NULL); +} + +Object +dap_declarations(DAPparsestate* state, Object decls, Object decl) +{ + OClist* alist = (OClist*)decls; + if(alist == NULL) + alist = oclistnew(); + else + oclistpush(alist,(ocelem)decl); + return alist; +} + +Object +dap_arraydecls(DAPparsestate* state, Object arraydecls, Object arraydecl) +{ + OClist* alist = (OClist*)arraydecls; + if(alist == NULL) + alist = oclistnew(); + else + oclistpush(alist,(ocelem)arraydecl); + return alist; +} + +Object +dap_arraydecl(DAPparsestate* state, Object name, Object size) +{ + long value; + OCnode* dim; + if(!check_int32(size,&value)) + dap_parse_error(state,"Dimension not an integer"); + if(name != NULL) + dim = newocnode((char*)name,OC_Dimension,state); + else + dim = newocnode(NULL,OC_Dimension,state); + dim->dim.declsize = value; + return dim; +} + +Object +dap_attrlist(DAPparsestate* state, Object attrlist, Object attrtuple) +{ + OClist* alist = (OClist*)attrlist; + if(alist == NULL) + alist = oclistnew(); + else { + char* dupname; + if(attrtuple != NULL) {/* NULL=>alias encountered, ignore */ + oclistpush(alist,(ocelem)attrtuple); + if((dupname=scopeduplicates(alist))!=NULL) { + dap_parse_error(state,"Duplicate attribute names in same scope: %s",dupname); + /* Remove this attribute */ + oclistpop(alist); + } + } + } + return alist; +} + +Object +dap_attrvalue(DAPparsestate* state, Object valuelist, Object value, Object etype) +{ + OClist* alist = (OClist*)valuelist; + if(alist == NULL) alist = oclistnew(); + /* Watch out for null values */ + if(value == NULL) value = ""; + oclistpush(alist,(ocelem)strdup(value)); + return alist; +} + +Object +dap_attribute(DAPparsestate* state, Object name, Object values, Object etype) +{ + OCnode* att; + att = newocnode((char*)name,OC_Attribute,state); + att->etype = octypefor(etype); + att->att.values = (OClist*)values; + return att; +} + +Object +dap_attrset(DAPparsestate* state, Object name, Object attributes) +{ + OCnode* attset; + attset = newocnode((char*)name,OC_Attributeset,state); + /* Check var set vs global set */ + attset->att.isglobal = isglobalname(name); + attset->subnodes = (OClist*)attributes; + addedges(attset); + return attset; +} + +static int +isglobalname(char* name) +{ + int len = strlen(name); + int glen = strlen("global"); + char* p; + if(len < glen) return 0; + p = name + (len - glen); + if(strcasecmp(p,"global") != 0) + return 0; + return 1; +} + +#if 0 +static int +isnumber(const char* text) +{ + for(;*text;text++) {if(!isdigit(*text)) return 0;} + return 1; +} +#endif + +static void +dimension(OCnode* node, OClist* dimensions) +{ + unsigned int i; + unsigned int rank = oclistlength(dimensions); + node->array.dimensions = (OClist*)dimensions; + node->array.rank = rank; + for(i=0;iarray.dimensions,i); + dim->dim.array = node; + dim->dim.arrayindex = i; +#if 0 + if(dim->name == NULL) { + dim->dim.anonymous = 1; + dim->name = dimnameanon(node->name,i); + } +#endif + } +} + +char* +dimnameanon(char* basename, unsigned int index) +{ + char name[64]; + sprintf(name,"%s_%d",basename,index); + return strdup(name); +} + +Object +dap_makebase(DAPparsestate* state, Object name, Object etype, Object dimensions) +{ + OCnode* node; + node = newocnode((char*)name,OC_Primitive,state); + node->etype = octypefor(etype); + dimension(node,(OClist*)dimensions); + return node; +} + +Object +dap_makestructure(DAPparsestate* state, Object name, Object dimensions, Object fields) +{ + OCnode* node; + char* dupname; + if((dupname=scopeduplicates((OClist*)fields))!= NULL) { + dap_parse_error(state,"Duplicate structure field names in same scope: %s.%s",(char*)name,dupname); + return (Object)NULL; + } + node = newocnode(name,OC_Structure,state); + node->subnodes = fields; + dimension(node,(OClist*)dimensions); + addedges(node); + return node; +} + +Object +dap_makesequence(DAPparsestate* state, Object name, Object members) +{ + OCnode* node; + char* dupname; + if((dupname=scopeduplicates((OClist*)members)) != NULL) { + dap_parse_error(state,"Duplicate sequence member names in same scope: %s.%s",(char*)name,dupname); + return (Object)NULL; + } + node = newocnode(name,OC_Sequence,state); + node->subnodes = members; + addedges(node); + return node; +} + +Object +dap_makegrid(DAPparsestate* state, Object name, Object arraydecl, Object mapdecls) +{ + OCnode* node; + /* Check for duplicate map names */ + char* dupname; + if((dupname=scopeduplicates((OClist*)mapdecls)) != NULL) { + dap_parse_error(state,"Duplicate grid map names in same scope: %s.%s",(char*)name,dupname); + return (Object)NULL; + } + node = newocnode(name,OC_Grid,state); + node->subnodes = (OClist*)mapdecls; + oclistinsert(node->subnodes,0,(ocelem)arraydecl); + addedges(node); + return node; +} + +static void +addedges(OCnode* node) +{ + unsigned int i; + if(node->subnodes == NULL) return; + for(i=0;isubnodes);i++) { + OCnode* subnode = (OCnode*)oclistget(node->subnodes,i); + subnode->container = node; + } +} + +static void +setroot(OCnode* root, OClist* ocnodes) +{ + int i; + for(i=0;iroot = root; + } +} + +int +daperror(DAPparsestate* state, const char* msg) +{ + dap_parse_error(state,msg); + return 0; +} + +static char* +flatten(char* s, char* tmp, int tlen) +{ + int c; + char* p,*q; + strncpy(tmp,s,tlen); + tmp[tlen] = '\0'; + p = (q = tmp); + while((c=*p++)) { + switch (c) { + case '\r': case '\n': break; + case '\t': *q++ = ' '; break; + case ' ': if(*p != ' ') *q++ = c; break; + default: *q++ = c; + } + } + *q = '\0'; + return tmp; +} + +/* Create an ocnode and capture in the state->ocnode list */ +static OCnode* +newocnode(char* name, OCtype octype, DAPparsestate* state) +{ + OCnode* node = ocmakenode(name,octype,state->root); + oclistpush(state->ocnodes,(ocelem)node); + return node; +} + +static int +check_int32(char* val, long* value) +{ + char* ptr; + int ok = 1; + long iv = strtol(val,&ptr,0); /* 0=>auto determine base */ + if((iv == 0 && val == ptr) || *ptr != '\0') {ok=0; iv=1;} + else if(iv > OC_INT32_MAX || iv < OC_INT32_MIN) ok=0; + if(value != NULL) *value = iv; + return ok; +} + +static char* +scopeduplicates(OClist* list) +{ + unsigned int i,j; + for(i=0;iname,jo->name)==0) + return io->name; + } + } + return NULL; +} + +static OCtype +octypefor(Object etype) +{ + switch ((long)etype) { + case SCAN_BYTE: return OC_Byte; + case SCAN_INT16: return OC_Int16; + case SCAN_UINT16: return OC_UInt16; + case SCAN_INT32: return OC_Int32; + case SCAN_UINT32: return OC_UInt32; + case SCAN_FLOAT32: return OC_Float32; + case SCAN_FLOAT64: return OC_Float64; + case SCAN_URL: return OC_URL; + case SCAN_STRING: return OC_String; + default: abort(); + } + return OC_NAT; +} + +void +dap_parse_error(DAPparsestate* state, const char *fmt, ...) +{ + size_t len, suffixlen, prefixlen; + va_list argv; + char* tmp = NULL; + va_start(argv,fmt); + (void) vfprintf(stderr,fmt,argv) ; + (void) fputc('\n',stderr) ; + len = strlen(state->lexstate->input); + suffixlen = strlen(state->lexstate->next); + prefixlen = (len - suffixlen); + tmp = (char*)ocmalloc(len+1); + flatten(state->lexstate->input,tmp,prefixlen); + (void) fprintf(stderr,"context: %s",tmp); + flatten(state->lexstate->next,tmp,suffixlen); + (void) fprintf(stderr,"^%s\n",tmp); + (void) fflush(stderr); /* to ensure log files are current */ + ocfree(tmp); +} + +static void +dap_parse_cleanup(DAPparsestate* state) +{ + daplexcleanup(&state->lexstate); + if(state->ocnodes != NULL) ocfreenodes(state->ocnodes); + state->ocnodes = NULL; + free(state); +} + +static DAPparsestate* +dap_parse_init(char* buf) +{ + DAPparsestate* state = (DAPparsestate*)ocmalloc(sizeof(DAPparsestate)); /*ocmalloc zeros*/ + MEMCHECK(state,(DAPparsestate*)NULL); + if(buf==NULL) { + dap_parse_error(state,"dap_parse_init: no input buffer"); + dap_parse_cleanup(state); + return NULL; + } + daplexinit(buf,&state->lexstate); + return state; +} + +/* Wrapper for dapparse */ +OCerror +DAPparse(OCstate* conn, OCtree* tree, char* parsestring) +{ + DAPparsestate* state = dap_parse_init(parsestring); + int parseresult; + OCerror ocerr = OC_NOERR; + state->ocnodes = oclistnew(); + state->conn = conn; + if(ocdebug >= 2) + dapdebug = 1; + parseresult = dapparse(state); + if(parseresult == 0) {/* 0 => parse ok */ + /* Check to see if we ended up parsing an error message */ + if(state->svcerror) { + conn->error.code = nulldup(state->code); + conn->error.message = nulldup(state->message); + tree->root = NULL; + /* Attempt to further decipher the error code */ + if(state->code != NULL + && (strcmp(state->code,"404") == 0 /* tds returns 404 */ + || strcmp(state->code,"5") == 0)) /* hyrax returns 5 */ + ocerr = OC_ENOFILE; + else + ocerr = OC_EDAPSVC; + } else { + OCASSERT((state->root != NULL)); + tree->root = state->root; + state->root = NULL; /* avoid reclaim */ + tree->nodes = state->ocnodes; + state->ocnodes = NULL; /* avoid reclaim */ + tree->root->tree = tree; + ocerr = OC_NOERR; + } + } else { /* Parse failed */ + switch (tree->dxdclass) { + case OCDAS: ocerr = OC_EDAS; break; + case OCDDS: ocerr = OC_EDDS; break; + case OCDATADDS: ocerr = OC_EDATADDS; break; + default: ocerr = OC_EDAPSVC; + } + } + dap_parse_cleanup(state); + return ocerr; +} + diff --git a/extern/src_netcdf4/dapparselex.h b/extern/src_netcdf4/dapparselex.h new file mode 100644 index 0000000..3661157 --- /dev/null +++ b/extern/src_netcdf4/dapparselex.h @@ -0,0 +1,95 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef DAPPARSELEX_H +#define DAPPARSELEX_H 1 + +#include "ocinternal.h" +#include "ocdebug.h" +#ifdef USE_DAP +/* To avoid "make distclean" wiping out dap.tab.h */ +#include "daptab.h" +#else +#include "daptab.h" +#endif + +#ifdef WIN32 +#define strcasecmp stricmp +#define snprintf _snprintf +#endif + +/* For consistency with Java parser */ +#define null NULL + +typedef void* Object; + +#define YYSTYPE Object + +#define MAX_TOKEN_LENGTH 1024 + +/*! Specifies the Lexstate. */ +typedef struct DAPlexstate { + char* input; + char* next; /* next char in uri.query*/ + OCbytes* yytext; + int lineno; + /*! Specifies the Lasttoken. */ + int lasttoken; + char lasttokentext[MAX_TOKEN_LENGTH+1]; + char* wordchars1; + char* wordcharsn; + char* worddelims; + OClist* reclaim; /* reclaim WORD_WORD instances */ +} DAPlexstate; + +/*! Specifies the DAPparsestate. */ +typedef struct DAPparsestate { + struct OCnode* root; + DAPlexstate* lexstate; + OClist* ocnodes; + struct OCstate* conn; + /* For error returns from the server */ + int svcerror; /* 1 => we had an error from the server */ + char* code; + char* message; + char* progtype; + char* progname; + /* State for constraint expressions */ + struct CEstate* cestate; +} DAPparsestate; + +extern int daperror(DAPparsestate* state, const char* msg); +extern void dap_parse_error(DAPparsestate*,const char *fmt, ...); +/* bison parse entry point */ +extern int dapparse(DAPparsestate*); + +extern Object dap_datasetbody(DAPparsestate*,Object decls, Object name); +extern Object dap_declarations(DAPparsestate*,Object decls, Object decl); +extern Object dap_arraydecls(DAPparsestate*,Object arraydecls, Object arraydecl); +extern Object dap_arraydecl(DAPparsestate*,Object name, Object size); + +extern void dap_dassetup(DAPparsestate*); +extern Object dap_attributebody(DAPparsestate*,Object attrlist); +extern Object dap_attrlist(DAPparsestate*,Object attrlist, Object attrtuple); +extern Object dap_attribute(DAPparsestate*,Object name, Object value, Object etype); +extern Object dap_attrset(DAPparsestate*,Object name, Object attributes); +extern Object dap_attrvalue(DAPparsestate*,Object valuelist, Object value, Object etype); + +extern Object dap_makebase(DAPparsestate*,Object name, Object etype, Object dimensions); +extern Object dap_makestructure(DAPparsestate*,Object name, Object dimensions, Object fields); +extern Object dap_makesequence(DAPparsestate*,Object name, Object members); +extern Object dap_makegrid(DAPparsestate*,Object name, Object arraydecl, Object mapdecls); + +extern void dap_errorbody(DAPparsestate*, Object, Object, Object, Object); +extern void dap_unrecognizedresponse(DAPparsestate*); + +extern void dap_tagparse(DAPparsestate*,int); + +/* Lexer entry points */ +extern int daplex(YYSTYPE*, DAPparsestate*); +extern void daplexinit(char* input, DAPlexstate** lexstatep); +extern void daplexcleanup(DAPlexstate** lexstatep); +extern void dapsetwordchars(DAPlexstate* lexstate, int kind); +extern char* dapdecode(DAPlexstate*,char*); + +#endif /*DAPPARSELEX_H*/ diff --git a/extern/src_netcdf4/daptab.c b/extern/src_netcdf4/daptab.c new file mode 100644 index 0000000..2de8f1e --- /dev/null +++ b/extern/src_netcdf4/daptab.c @@ -0,0 +1,2493 @@ +/* A Bison parser, made by GNU Bison 2.4.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2009, 2010 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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.4.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse dapparse +#define yylex daplex +#define yyerror daperror +#define yylval daplval +#define yychar dapchar +#define yydebug dapdebug +#define yynerrs dapnerrs + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 11 "dap.y" + +#include "config.h" +#include "dapparselex.h" +int dapdebug = 0; + + +/* Line 189 of yacc.c */ +#line 87 "dap.tab.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + SCAN_ALIAS = 258, + SCAN_ARRAY = 259, + SCAN_ATTR = 260, + SCAN_BYTE = 261, + SCAN_CODE = 262, + SCAN_DATASET = 263, + SCAN_DATA = 264, + SCAN_ERROR = 265, + SCAN_FLOAT32 = 266, + SCAN_FLOAT64 = 267, + SCAN_GRID = 268, + SCAN_INT16 = 269, + SCAN_INT32 = 270, + SCAN_MAPS = 271, + SCAN_MESSAGE = 272, + SCAN_SEQUENCE = 273, + SCAN_STRING = 274, + SCAN_STRUCTURE = 275, + SCAN_UINT16 = 276, + SCAN_UINT32 = 277, + SCAN_URL = 278, + SCAN_PTYPE = 279, + SCAN_PROG = 280, + WORD_WORD = 281, + WORD_STRING = 282 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 156 "dap.tab.c" + +#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 /* 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 defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* 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 yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#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 /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* 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 /* 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 /* 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_alloc; + YYSTYPE yyvs_alloc; +}; + +/* 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_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 9 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 361 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 36 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 34 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 106 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 201 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 282 + +#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, 35, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 31, 30, + 2, 34, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 32, 2, 33, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 28, 2, 29, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 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 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 6, 10, 13, 16, 18, 20, 22, + 24, 30, 31, 34, 39, 47, 54, 66, 68, 70, + 72, 74, 76, 78, 80, 82, 84, 86, 87, 90, + 94, 99, 105, 107, 109, 111, 113, 117, 119, 120, + 123, 126, 131, 136, 141, 146, 151, 156, 161, 166, + 171, 176, 178, 180, 184, 186, 190, 192, 196, 198, + 202, 204, 208, 210, 214, 216, 220, 222, 226, 228, + 232, 234, 236, 238, 242, 250, 251, 256, 257, 262, + 263, 268, 269, 274, 276, 278, 280, 282, 284, 286, + 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, + 308, 310, 312, 314, 316, 318, 320 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 37, 0, -1, 38, 41, -1, 38, 41, 9, -1, + 39, 49, -1, 40, 64, -1, 1, -1, 8, -1, + 5, -1, 10, -1, 28, 42, 29, 47, 30, -1, + -1, 42, 43, -1, 44, 48, 45, 30, -1, 20, + 28, 42, 29, 48, 45, 30, -1, 18, 28, 42, + 29, 48, 30, -1, 13, 28, 4, 31, 43, 16, + 31, 42, 29, 48, 30, -1, 1, -1, 6, -1, + 14, -1, 21, -1, 15, -1, 22, -1, 11, -1, + 12, -1, 23, -1, 19, -1, -1, 45, 46, -1, + 32, 26, 33, -1, 32, 34, 26, 33, -1, 32, + 69, 34, 26, 33, -1, 1, -1, 48, -1, 1, + -1, 69, -1, 28, 50, 29, -1, 1, -1, -1, + 50, 51, -1, 63, 30, -1, 6, 69, 52, 30, + -1, 14, 69, 53, 30, -1, 21, 69, 54, 30, + -1, 15, 69, 55, 30, -1, 22, 69, 56, 30, + -1, 11, 69, 57, 30, -1, 12, 69, 58, 30, + -1, 19, 69, 59, 30, -1, 23, 69, 60, 30, + -1, 69, 28, 50, 29, -1, 1, -1, 26, -1, + 52, 35, 26, -1, 26, -1, 53, 35, 26, -1, + 26, -1, 54, 35, 26, -1, 26, -1, 55, 35, + 26, -1, 26, -1, 56, 35, 26, -1, 26, -1, + 57, 35, 26, -1, 26, -1, 58, 35, 26, -1, + 62, -1, 59, 35, 62, -1, 61, -1, 60, 35, + 61, -1, 69, -1, 69, -1, 27, -1, 3, 26, + 26, -1, 28, 65, 66, 67, 68, 29, 30, -1, + -1, 7, 34, 26, 30, -1, -1, 17, 34, 26, + 30, -1, -1, 24, 34, 26, 30, -1, -1, 25, + 34, 26, 30, -1, 26, -1, 3, -1, 4, -1, + 5, -1, 6, -1, 8, -1, 9, -1, 10, -1, + 11, -1, 12, -1, 13, -1, 14, -1, 15, -1, + 16, -1, 18, -1, 19, -1, 20, -1, 21, -1, + 22, -1, 23, -1, 7, -1, 17, -1, 25, -1, + 24, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 53, 53, 54, 55, 56, 57, 61, 65, 69, + 74, 80, 81, 87, 89, 91, 93, 96, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 114, 115, 119, + 120, 121, 122, 127, 128, 132, 135, 136, 141, 142, + 146, 147, 149, 151, 153, 155, 157, 159, 161, 163, + 165, 166, 171, 172, 176, 177, 181, 182, 186, 187, + 191, 192, 195, 196, 199, 200, 203, 204, 208, 209, + 213, 217, 218, 229, 233, 237, 237, 238, 238, 239, + 239, 240, 240, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269 +}; +#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", "SCAN_ALIAS", "SCAN_ARRAY", "SCAN_ATTR", + "SCAN_BYTE", "SCAN_CODE", "SCAN_DATASET", "SCAN_DATA", "SCAN_ERROR", + "SCAN_FLOAT32", "SCAN_FLOAT64", "SCAN_GRID", "SCAN_INT16", "SCAN_INT32", + "SCAN_MAPS", "SCAN_MESSAGE", "SCAN_SEQUENCE", "SCAN_STRING", + "SCAN_STRUCTURE", "SCAN_UINT16", "SCAN_UINT32", "SCAN_URL", "SCAN_PTYPE", + "SCAN_PROG", "WORD_WORD", "WORD_STRING", "'{'", "'}'", "';'", "':'", + "'['", "']'", "'='", "','", "$accept", "start", "dataset", "attr", "err", + "datasetbody", "declarations", "declaration", "base_type", "array_decls", + "array_decl", "datasetname", "var_name", "attributebody", "attr_list", + "attribute", "bytes", "int16", "uint16", "int32", "uint32", "float32", + "float64", "strs", "urls", "url", "str_or_id", "alias", "errorbody", + "errorcode", "errormsg", "errorptype", "errorprog", "name", 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, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 123, 125, + 59, 58, 91, 93, 61, 44 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 36, 37, 37, 37, 37, 37, 38, 39, 40, + 41, 42, 42, 43, 43, 43, 43, 43, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, + 46, 46, 46, 47, 47, 48, 49, 49, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, + 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, + 61, 62, 62, 63, 64, 65, 65, 66, 66, 67, + 67, 68, 68, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 3, 2, 2, 1, 1, 1, 1, + 5, 0, 2, 4, 7, 6, 11, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 3, + 4, 5, 1, 1, 1, 1, 3, 1, 0, 2, + 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 1, 1, 3, 7, 0, 4, 0, 4, 0, + 4, 0, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 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 yytype_uint8 yydefact[] = +{ + 0, 6, 8, 7, 9, 0, 0, 0, 0, 1, + 11, 2, 37, 38, 4, 75, 5, 0, 3, 0, + 0, 77, 17, 18, 23, 24, 0, 19, 21, 0, + 26, 0, 20, 22, 25, 0, 12, 0, 51, 84, + 85, 86, 87, 103, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 104, 97, 98, 99, 100, 101, 102, + 106, 105, 83, 36, 39, 0, 0, 0, 0, 79, + 0, 11, 11, 34, 84, 87, 91, 92, 94, 95, + 98, 100, 101, 102, 0, 33, 35, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 38, + 0, 0, 0, 81, 0, 0, 0, 10, 0, 73, + 52, 0, 62, 0, 64, 0, 54, 0, 58, 0, + 72, 0, 66, 71, 56, 0, 60, 0, 0, 68, + 70, 0, 76, 0, 0, 0, 0, 0, 0, 0, + 32, 13, 0, 28, 41, 0, 46, 0, 47, 0, + 42, 0, 44, 0, 48, 0, 43, 0, 45, 0, + 49, 0, 50, 78, 0, 0, 0, 0, 0, 27, + 83, 0, 0, 53, 63, 65, 55, 59, 67, 57, + 61, 69, 80, 0, 74, 0, 15, 0, 29, 0, + 0, 82, 11, 14, 30, 0, 0, 31, 0, 0, + 16 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 5, 6, 7, 8, 11, 17, 36, 37, 108, + 143, 84, 85, 14, 19, 64, 111, 117, 125, 119, + 127, 113, 115, 121, 128, 129, 122, 65, 16, 21, + 69, 103, 136, 86 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -70 +static const yytype_int16 yypact[] = +{ + 5, -70, -70, -70, -70, 8, -1, 3, 0, -70, + -70, 10, -70, -70, -70, 28, -70, 69, -70, 159, + 34, 57, -70, -70, -70, -70, 50, -70, -70, 58, + -70, 65, -70, -70, -70, 263, -70, 312, -70, 59, + -70, -70, 312, -70, -70, -70, -70, 312, 312, -70, + 312, 312, -70, -70, -70, 312, -70, 312, 312, 312, + -70, -70, -70, -70, -70, 64, 67, 70, 63, 75, + 96, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, -70, 73, -70, -70, -70, 78, 79, + 80, 81, 82, 83, 287, 84, 85, 312, -70, -70, + 86, 88, 87, 90, 89, 127, 212, -70, 4, -70, + -70, -23, -70, -21, -70, -19, -70, -13, -70, -12, + -70, -10, -70, -70, -70, -9, -70, 36, 42, -70, + -70, 186, -70, 92, 91, 93, 97, 338, 312, 312, + -70, -70, 39, -70, -70, 99, -70, 103, -70, 104, + -70, 105, -70, 106, -70, 287, -70, 108, -70, 109, + -70, 312, -70, -70, 114, 110, 121, 102, 122, -70, + 120, 128, 123, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, 125, -70, 155, -70, 37, -70, 126, + 132, -70, -70, -70, -70, 181, 236, -70, 312, 187, + -70 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -70, -70, -70, -70, -70, -70, -69, -25, -70, -50, + -70, -70, -37, -70, 117, -70, -70, -70, -70, -70, + -70, -70, -70, -70, -70, 60, 74, -70, -70, -70, + -70, -70, -70, -18 +}; + +/* 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[] = +{ + 87, 66, 105, 106, 12, 140, 1, 144, 9, 146, + 2, 148, 145, 3, 147, 4, 149, 150, 152, 18, + 154, 156, 151, 153, 89, 155, 157, 10, 15, 90, + 91, 13, 92, 93, 141, 20, 142, 94, 140, 95, + 96, 97, 74, 40, 41, 75, 43, 44, 45, 46, + 76, 77, 49, 78, 79, 52, 53, 54, 80, 56, + 81, 82, 83, 60, 61, 170, 158, 193, 67, 142, + 22, 159, 160, 171, 68, 23, 123, 161, 70, 130, + 24, 25, 26, 27, 28, 88, 71, 29, 30, 31, + 32, 33, 34, 72, 98, 99, 100, 101, 35, 102, + 104, 168, 169, 107, 109, 110, 112, 114, 116, 118, + 124, 126, 167, 66, 133, 135, 132, 164, 185, 187, + 137, 134, 163, 196, 172, 173, 166, 165, 22, 174, + 175, 176, 177, 23, 179, 180, 183, 123, 24, 25, + 26, 27, 28, 130, 182, 29, 30, 31, 32, 33, + 34, 184, 186, 188, 189, 191, 138, 190, 195, 194, + 38, 199, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 192, 38, 63, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 22, 197, 162, 131, 200, 23, 0, + 0, 181, 0, 24, 25, 26, 27, 28, 0, 178, + 29, 30, 31, 32, 33, 34, 0, 22, 0, 0, + 0, 139, 23, 0, 0, 0, 0, 24, 25, 26, + 27, 28, 0, 0, 29, 30, 31, 32, 33, 34, + 0, 0, 0, 0, 73, 198, 74, 40, 41, 75, + 43, 44, 45, 46, 76, 77, 49, 78, 79, 52, + 53, 54, 80, 56, 81, 82, 83, 60, 61, 62, + 74, 40, 41, 75, 43, 44, 45, 46, 76, 77, + 49, 78, 79, 52, 53, 54, 80, 56, 81, 82, + 83, 60, 61, 62, 120, 74, 40, 41, 75, 43, + 44, 45, 46, 76, 77, 49, 78, 79, 52, 53, + 54, 80, 56, 81, 82, 83, 60, 61, 62, 22, + 0, 0, 0, 0, 23, 0, 0, 0, 0, 24, + 25, 26, 27, 28, 0, 0, 29, 30, 31, 32, + 33, 34 +}; + +static const yytype_int16 yycheck[] = +{ + 37, 19, 71, 72, 1, 1, 1, 30, 0, 30, + 5, 30, 35, 8, 35, 10, 35, 30, 30, 9, + 30, 30, 35, 35, 42, 35, 35, 28, 28, 47, + 48, 28, 50, 51, 30, 7, 32, 55, 1, 57, + 58, 59, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 30, 30, 34, 32, + 1, 35, 30, 34, 17, 6, 94, 35, 28, 97, + 11, 12, 13, 14, 15, 26, 28, 18, 19, 20, + 21, 22, 23, 28, 30, 28, 26, 34, 29, 24, + 4, 138, 139, 30, 26, 26, 26, 26, 26, 26, + 26, 26, 137, 131, 26, 25, 30, 26, 16, 169, + 31, 34, 30, 192, 142, 26, 29, 34, 1, 26, + 26, 26, 26, 6, 26, 26, 26, 155, 11, 12, + 13, 14, 15, 161, 30, 18, 19, 20, 21, 22, + 23, 30, 30, 33, 26, 30, 29, 34, 26, 33, + 1, 198, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 31, 1, 29, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 1, 33, 29, 99, 30, 6, -1, + -1, 161, -1, 11, 12, 13, 14, 15, -1, 155, + 18, 19, 20, 21, 22, 23, -1, 1, -1, -1, + -1, 29, 6, -1, -1, -1, -1, 11, 12, 13, + 14, 15, -1, -1, 18, 19, 20, 21, 22, 23, + -1, -1, -1, -1, 1, 29, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 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, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 1, + -1, -1, -1, -1, 6, -1, -1, -1, -1, 11, + 12, 13, 14, 15, -1, -1, 18, 19, 20, 21, + 22, 23 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 1, 5, 8, 10, 37, 38, 39, 40, 0, + 28, 41, 1, 28, 49, 28, 64, 42, 9, 50, + 7, 65, 1, 6, 11, 12, 13, 14, 15, 18, + 19, 20, 21, 22, 23, 29, 43, 44, 1, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 29, 51, 63, 69, 34, 17, 66, + 28, 28, 28, 1, 3, 6, 11, 12, 14, 15, + 19, 21, 22, 23, 47, 48, 69, 48, 26, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 30, 28, + 26, 34, 24, 67, 4, 42, 42, 30, 45, 26, + 26, 52, 26, 57, 26, 58, 26, 53, 26, 55, + 27, 59, 62, 69, 26, 54, 26, 56, 60, 61, + 69, 50, 30, 26, 34, 25, 68, 31, 29, 29, + 1, 30, 32, 46, 30, 35, 30, 35, 30, 35, + 30, 35, 30, 35, 30, 35, 30, 35, 30, 35, + 30, 35, 29, 30, 26, 34, 29, 43, 48, 48, + 26, 34, 69, 26, 26, 26, 26, 26, 62, 26, + 26, 61, 30, 26, 30, 16, 30, 45, 33, 26, + 34, 30, 31, 30, 33, 26, 42, 33, 29, 48, + 30 +}; + +#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. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif + +#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 (parsestate, 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 defined YYLTYPE_IS_TRIVIAL && 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 (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, parsestate) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* 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, parsestate); \ + 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, DAPparsestate* parsestate) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, parsestate) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + DAPparsestate* parsestate; +#endif +{ + if (!yyvaluep) + return; + YYUSE (parsestate); +# 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, DAPparsestate* parsestate) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, parsestate) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + DAPparsestate* parsestate; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, parsestate); + 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 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + 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, DAPparsestate* parsestate) +#else +static void +yy_reduce_print (yyvsp, yyrule, parsestate) + YYSTYPE *yyvsp; + int yyrule; + DAPparsestate* parsestate; +#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++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , parsestate); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule, parsestate); \ +} 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 + + + +#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 */ + + +/*-----------------------------------------------. +| 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, DAPparsestate* parsestate) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, parsestate) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + DAPparsestate* parsestate; +#endif +{ + YYUSE (yyvaluep); + YYUSE (parsestate); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* 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 (DAPparsestate* parsestate); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#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 (DAPparsestate* parsestate) +#else +int +yyparse (parsestate) + DAPparsestate* parsestate; +#endif +#endif +{ +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + 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_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, 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)); + + if (yystate == YYFINAL) + YYACCEPT; + + 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. */ + + /* 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); + 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; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + 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 6: + +/* Line 1464 of yacc.c */ +#line 57 "dap.y" + {dap_unrecognizedresponse(parsestate); YYABORT;;} + break; + + case 7: + +/* Line 1464 of yacc.c */ +#line 62 "dap.y" + {dap_tagparse(parsestate,SCAN_DATASET);;} + break; + + case 8: + +/* Line 1464 of yacc.c */ +#line 66 "dap.y" + {dap_tagparse(parsestate,SCAN_ATTR);;} + break; + + case 9: + +/* Line 1464 of yacc.c */ +#line 70 "dap.y" + {dap_tagparse(parsestate,SCAN_ERROR);;} + break; + + case 10: + +/* Line 1464 of yacc.c */ +#line 75 "dap.y" + {dap_datasetbody(parsestate,(yyvsp[(4) - (5)]),(yyvsp[(2) - (5)]));;} + break; + + case 11: + +/* Line 1464 of yacc.c */ +#line 80 "dap.y" + {(yyval)=dap_declarations(parsestate,null,null);;} + break; + + case 12: + +/* Line 1464 of yacc.c */ +#line 81 "dap.y" + {(yyval)=dap_declarations(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 13: + +/* Line 1464 of yacc.c */ +#line 88 "dap.y" + {(yyval)=dap_makebase(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(1) - (4)]),(yyvsp[(3) - (4)]));;} + break; + + case 14: + +/* Line 1464 of yacc.c */ +#line 90 "dap.y" + {if(((yyval)=dap_makestructure(parsestate,(yyvsp[(5) - (7)]),(yyvsp[(6) - (7)]),(yyvsp[(3) - (7)])))==null) {YYABORT;};} + break; + + case 15: + +/* Line 1464 of yacc.c */ +#line 92 "dap.y" + {if(((yyval)=dap_makesequence(parsestate,(yyvsp[(5) - (6)]),(yyvsp[(3) - (6)])))==null) {YYABORT;};} + break; + + case 16: + +/* Line 1464 of yacc.c */ +#line 95 "dap.y" + {if(((yyval)=dap_makegrid(parsestate,(yyvsp[(10) - (11)]),(yyvsp[(5) - (11)]),(yyvsp[(8) - (11)])))==null) {YYABORT;};} + break; + + case 17: + +/* Line 1464 of yacc.c */ +#line 97 "dap.y" + {daperror(parsestate,"Unrecognized type"); YYABORT;;} + break; + + case 18: + +/* Line 1464 of yacc.c */ +#line 102 "dap.y" + {(yyval)=(Object)SCAN_BYTE;;} + break; + + case 19: + +/* Line 1464 of yacc.c */ +#line 103 "dap.y" + {(yyval)=(Object)SCAN_INT16;;} + break; + + case 20: + +/* Line 1464 of yacc.c */ +#line 104 "dap.y" + {(yyval)=(Object)SCAN_UINT16;;} + break; + + case 21: + +/* Line 1464 of yacc.c */ +#line 105 "dap.y" + {(yyval)=(Object)SCAN_INT32;;} + break; + + case 22: + +/* Line 1464 of yacc.c */ +#line 106 "dap.y" + {(yyval)=(Object)SCAN_UINT32;;} + break; + + case 23: + +/* Line 1464 of yacc.c */ +#line 107 "dap.y" + {(yyval)=(Object)SCAN_FLOAT32;;} + break; + + case 24: + +/* Line 1464 of yacc.c */ +#line 108 "dap.y" + {(yyval)=(Object)SCAN_FLOAT64;;} + break; + + case 25: + +/* Line 1464 of yacc.c */ +#line 109 "dap.y" + {(yyval)=(Object)SCAN_URL;;} + break; + + case 26: + +/* Line 1464 of yacc.c */ +#line 110 "dap.y" + {(yyval)=(Object)SCAN_STRING;;} + break; + + case 27: + +/* Line 1464 of yacc.c */ +#line 114 "dap.y" + {(yyval)=dap_arraydecls(parsestate,null,null);;} + break; + + case 28: + +/* Line 1464 of yacc.c */ +#line 115 "dap.y" + {(yyval)=dap_arraydecls(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 29: + +/* Line 1464 of yacc.c */ +#line 119 "dap.y" + {(yyval)=dap_arraydecl(parsestate,null,(yyvsp[(2) - (3)]));;} + break; + + case 30: + +/* Line 1464 of yacc.c */ +#line 120 "dap.y" + {(yyval)=dap_arraydecl(parsestate,null,(yyvsp[(3) - (4)]));;} + break; + + case 31: + +/* Line 1464 of yacc.c */ +#line 121 "dap.y" + {(yyval)=dap_arraydecl(parsestate,(yyvsp[(2) - (5)]),(yyvsp[(4) - (5)]));;} + break; + + case 32: + +/* Line 1464 of yacc.c */ +#line 123 "dap.y" + {daperror(parsestate,"Illegal dimension declaration"); YYABORT;;} + break; + + case 33: + +/* Line 1464 of yacc.c */ +#line 127 "dap.y" + {(yyval)=(yyvsp[(1) - (1)]);;} + break; + + case 34: + +/* Line 1464 of yacc.c */ +#line 129 "dap.y" + {daperror(parsestate,"Illegal dataset declaration"); YYABORT;;} + break; + + case 35: + +/* Line 1464 of yacc.c */ +#line 132 "dap.y" + {(yyval)=(yyvsp[(1) - (1)]);;} + break; + + case 36: + +/* Line 1464 of yacc.c */ +#line 135 "dap.y" + {dap_attributebody(parsestate,(yyvsp[(2) - (3)]));;} + break; + + case 37: + +/* Line 1464 of yacc.c */ +#line 137 "dap.y" + {daperror(parsestate,"Illegal DAS body"); YYABORT;;} + break; + + case 38: + +/* Line 1464 of yacc.c */ +#line 141 "dap.y" + {(yyval)=dap_attrlist(parsestate,null,null);;} + break; + + case 39: + +/* Line 1464 of yacc.c */ +#line 142 "dap.y" + {(yyval)=dap_attrlist(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 40: + +/* Line 1464 of yacc.c */ +#line 146 "dap.y" + {(yyval)=null;;} + break; + + case 41: + +/* Line 1464 of yacc.c */ +#line 148 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_BYTE);;} + break; + + case 42: + +/* Line 1464 of yacc.c */ +#line 150 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_INT16);;} + break; + + case 43: + +/* Line 1464 of yacc.c */ +#line 152 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_UINT16);;} + break; + + case 44: + +/* Line 1464 of yacc.c */ +#line 154 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_INT32);;} + break; + + case 45: + +/* Line 1464 of yacc.c */ +#line 156 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_UINT32);;} + break; + + case 46: + +/* Line 1464 of yacc.c */ +#line 158 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_FLOAT32);;} + break; + + case 47: + +/* Line 1464 of yacc.c */ +#line 160 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_FLOAT64);;} + break; + + case 48: + +/* Line 1464 of yacc.c */ +#line 162 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_STRING);;} + break; + + case 49: + +/* Line 1464 of yacc.c */ +#line 164 "dap.y" + {(yyval)=dap_attribute(parsestate,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(Object)SCAN_URL);;} + break; + + case 50: + +/* Line 1464 of yacc.c */ +#line 165 "dap.y" + {(yyval)=dap_attrset(parsestate,(yyvsp[(1) - (4)]),(yyvsp[(3) - (4)]));;} + break; + + case 51: + +/* Line 1464 of yacc.c */ +#line 167 "dap.y" + {daperror(parsestate,"Illegal attribute"); YYABORT;;} + break; + + case 52: + +/* Line 1464 of yacc.c */ +#line 171 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_BYTE);;} + break; + + case 53: + +/* Line 1464 of yacc.c */ +#line 173 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_BYTE);;} + break; + + case 54: + +/* Line 1464 of yacc.c */ +#line 176 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_INT16);;} + break; + + case 55: + +/* Line 1464 of yacc.c */ +#line 178 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_INT16);;} + break; + + case 56: + +/* Line 1464 of yacc.c */ +#line 181 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_UINT16);;} + break; + + case 57: + +/* Line 1464 of yacc.c */ +#line 183 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_UINT16);;} + break; + + case 58: + +/* Line 1464 of yacc.c */ +#line 186 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_INT32);;} + break; + + case 59: + +/* Line 1464 of yacc.c */ +#line 188 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_INT32);;} + break; + + case 60: + +/* Line 1464 of yacc.c */ +#line 191 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_UINT32);;} + break; + + case 61: + +/* Line 1464 of yacc.c */ +#line 192 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_UINT32);;} + break; + + case 62: + +/* Line 1464 of yacc.c */ +#line 195 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_FLOAT32);;} + break; + + case 63: + +/* Line 1464 of yacc.c */ +#line 196 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_FLOAT32);;} + break; + + case 64: + +/* Line 1464 of yacc.c */ +#line 199 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_FLOAT64);;} + break; + + case 65: + +/* Line 1464 of yacc.c */ +#line 200 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_FLOAT64);;} + break; + + case 66: + +/* Line 1464 of yacc.c */ +#line 203 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_STRING);;} + break; + + case 67: + +/* Line 1464 of yacc.c */ +#line 204 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_STRING);;} + break; + + case 68: + +/* Line 1464 of yacc.c */ +#line 208 "dap.y" + {(yyval)=dap_attrvalue(parsestate,null,(yyvsp[(1) - (1)]),(Object)SCAN_URL);;} + break; + + case 69: + +/* Line 1464 of yacc.c */ +#line 209 "dap.y" + {(yyval)=dap_attrvalue(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]),(Object)SCAN_URL);;} + break; + + case 70: + +/* Line 1464 of yacc.c */ +#line 213 "dap.y" + {(yyval)=(yyvsp[(1) - (1)]);;} + break; + + case 71: + +/* Line 1464 of yacc.c */ +#line 217 "dap.y" + {(yyval)=(yyvsp[(1) - (1)]);;} + break; + + case 72: + +/* Line 1464 of yacc.c */ +#line 218 "dap.y" + {(yyval)=(yyvsp[(1) - (1)]);;} + break; + + case 73: + +/* Line 1464 of yacc.c */ +#line 229 "dap.y" + {(yyval)=(yyvsp[(2) - (3)]); (yyval)=(yyvsp[(3) - (3)]); (yyval)=null;;} + break; + + case 74: + +/* Line 1464 of yacc.c */ +#line 234 "dap.y" + {dap_errorbody(parsestate,(yyvsp[(2) - (7)]),(yyvsp[(3) - (7)]),(yyvsp[(4) - (7)]),(yyvsp[(5) - (7)]));;} + break; + + case 75: + +/* Line 1464 of yacc.c */ +#line 237 "dap.y" + {(yyval)=null;;} + break; + + case 76: + +/* Line 1464 of yacc.c */ +#line 237 "dap.y" + {(yyval)=(yyvsp[(3) - (4)]);;} + break; + + case 77: + +/* Line 1464 of yacc.c */ +#line 238 "dap.y" + {(yyval)=null;;} + break; + + case 78: + +/* Line 1464 of yacc.c */ +#line 238 "dap.y" + {(yyval)=(yyvsp[(3) - (4)]);;} + break; + + case 79: + +/* Line 1464 of yacc.c */ +#line 239 "dap.y" + {(yyval)=null;;} + break; + + case 80: + +/* Line 1464 of yacc.c */ +#line 239 "dap.y" + {(yyval)=(yyvsp[(3) - (4)]);;} + break; + + case 81: + +/* Line 1464 of yacc.c */ +#line 240 "dap.y" + {(yyval)=null;;} + break; + + case 82: + +/* Line 1464 of yacc.c */ +#line 240 "dap.y" + {(yyval)=(yyvsp[(3) - (4)]);;} + break; + + case 83: + +/* Line 1464 of yacc.c */ +#line 246 "dap.y" + {(yyval)=dapdecode(parsestate->lexstate,(yyvsp[(1) - (1)]));;} + break; + + case 84: + +/* Line 1464 of yacc.c */ +#line 247 "dap.y" + {(yyval)=strdup("alias");;} + break; + + case 85: + +/* Line 1464 of yacc.c */ +#line 248 "dap.y" + {(yyval)=strdup("array");;} + break; + + case 86: + +/* Line 1464 of yacc.c */ +#line 249 "dap.y" + {(yyval)=strdup("attributes");;} + break; + + case 87: + +/* Line 1464 of yacc.c */ +#line 250 "dap.y" + {(yyval)=strdup("byte");;} + break; + + case 88: + +/* Line 1464 of yacc.c */ +#line 251 "dap.y" + {(yyval)=strdup("dataset");;} + break; + + case 89: + +/* Line 1464 of yacc.c */ +#line 252 "dap.y" + {(yyval)=strdup("data");;} + break; + + case 90: + +/* Line 1464 of yacc.c */ +#line 253 "dap.y" + {(yyval)=strdup("error");;} + break; + + case 91: + +/* Line 1464 of yacc.c */ +#line 254 "dap.y" + {(yyval)=strdup("float32");;} + break; + + case 92: + +/* Line 1464 of yacc.c */ +#line 255 "dap.y" + {(yyval)=strdup("float64");;} + break; + + case 93: + +/* Line 1464 of yacc.c */ +#line 256 "dap.y" + {(yyval)=strdup("grid");;} + break; + + case 94: + +/* Line 1464 of yacc.c */ +#line 257 "dap.y" + {(yyval)=strdup("int16");;} + break; + + case 95: + +/* Line 1464 of yacc.c */ +#line 258 "dap.y" + {(yyval)=strdup("int32");;} + break; + + case 96: + +/* Line 1464 of yacc.c */ +#line 259 "dap.y" + {(yyval)=strdup("maps");;} + break; + + case 97: + +/* Line 1464 of yacc.c */ +#line 260 "dap.y" + {(yyval)=strdup("sequence");;} + break; + + case 98: + +/* Line 1464 of yacc.c */ +#line 261 "dap.y" + {(yyval)=strdup("string");;} + break; + + case 99: + +/* Line 1464 of yacc.c */ +#line 262 "dap.y" + {(yyval)=strdup("structure");;} + break; + + case 100: + +/* Line 1464 of yacc.c */ +#line 263 "dap.y" + {(yyval)=strdup("uint16");;} + break; + + case 101: + +/* Line 1464 of yacc.c */ +#line 264 "dap.y" + {(yyval)=strdup("uint32");;} + break; + + case 102: + +/* Line 1464 of yacc.c */ +#line 265 "dap.y" + {(yyval)=strdup("url");;} + break; + + case 103: + +/* Line 1464 of yacc.c */ +#line 266 "dap.y" + {(yyval)=strdup("code");;} + break; + + case 104: + +/* Line 1464 of yacc.c */ +#line 267 "dap.y" + {(yyval)=strdup("message");;} + break; + + case 105: + +/* Line 1464 of yacc.c */ +#line 268 "dap.y" + {(yyval)=strdup("program");;} + break; + + case 106: + +/* Line 1464 of yacc.c */ +#line 269 "dap.y" + {(yyval)=strdup("program_type");;} + break; + + + +/* Line 1464 of yacc.c */ +#line 2280 "dap.tab.c" + 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 (parsestate, 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 (parsestate, yymsg); + } + else + { + yyerror (parsestate, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead 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, parsestate); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead 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, parsestate); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++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; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (parsestate, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, parsestate); + /* 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, parsestate); + 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 1684 of yacc.c */ +#line 272 "dap.y" + + diff --git a/extern/src_netcdf4/daptab.h b/extern/src_netcdf4/daptab.h new file mode 100644 index 0000000..f5341cf --- /dev/null +++ b/extern/src_netcdf4/daptab.h @@ -0,0 +1,80 @@ +/* A Bison parser, made by GNU Bison 2.4.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2009, 2010 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 { + SCAN_ALIAS = 258, + SCAN_ARRAY = 259, + SCAN_ATTR = 260, + SCAN_BYTE = 261, + SCAN_CODE = 262, + SCAN_DATASET = 263, + SCAN_DATA = 264, + SCAN_ERROR = 265, + SCAN_FLOAT32 = 266, + SCAN_FLOAT64 = 267, + SCAN_GRID = 268, + SCAN_INT16 = 269, + SCAN_INT32 = 270, + SCAN_MAPS = 271, + SCAN_MESSAGE = 272, + SCAN_SEQUENCE = 273, + SCAN_STRING = 274, + SCAN_STRUCTURE = 275, + SCAN_UINT16 = 276, + SCAN_UINT32 = 277, + SCAN_URL = 278, + SCAN_PTYPE = 279, + SCAN_PROG = 280, + WORD_WORD = 281, + WORD_STRING = 282 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + diff --git a/extern/src_netcdf4/daputil.c b/extern/src_netcdf4/daputil.c new file mode 100644 index 0000000..ef97a90 --- /dev/null +++ b/extern/src_netcdf4/daputil.c @@ -0,0 +1,786 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/daputil.c,v 1.47 2010/05/21 23:24:15 dmh Exp $ + *********************************************************************/ + +#include "config.h" + +#include + +#include "oc.h" +extern int oc_dumpnode(OClink, OCobject); + +#include "ncdap3.h" +#include "dapalign.h" +#include "dapodom.h" + +#define LBRACKET '[' +#define RBRACKET ']' + + +/**************************************************/ +/** + * Provide a hidden interface to allow utilities + * to check if a given path name is really an ncdap3 url. + * If no, return null, else return basename of the url + * minus any extension. + */ + +int +nc__testurl(const char* path, char** basenamep) +{ + NC_URI* uri; + int ok = nc_uriparse(path,&uri); + if(ok) { + char* slash = strrchr(uri->file, '/'); + char* dot; + if(slash == NULL) slash = (char*)path; else slash++; + slash = nulldup(slash); + dot = strrchr(slash, '.'); + if(dot != NULL && dot != slash) *dot = '\0'; + if(basenamep) *basenamep=slash ; else free(slash); + nc_urifree(uri); + } + return ok; +} + +/**************************************************/ + +/* +Given a legal dap name with arbitrary characters, +convert to equivalent legal cdf name +With the new name policy for netcdf, this procedure +does nothing. +*/ + +char* +cdflegalname3(char* dapname) +{ + return nulldup(dapname); +} + +/* Define the type conversion of the DAP variables + to the external netCDF variable type. + The proper way is to, for example, convert unsigned short + to an int to maintain the values. + Unfortuneately, libnc-dap does not do this: + it translates the types directly. For example + libnc-dap upgrades the DAP byte type, which is unsigned char, + to NC_BYTE, which signed char. + Oh well. + For netcdf-4, we can do proper type conversion. +*/ +nc_type +nctypeconvert(NCDAPCOMMON* drno, nc_type nctype) +{ + nc_type upgrade = NC_NAT; + if(drno->controls.flags & NCF_NC3) { + /* libnc-dap mimic invariant is to maintain type size */ + switch (nctype) { + case NC_CHAR: upgrade = NC_CHAR; break; + case NC_BYTE: upgrade = NC_BYTE; break; + case NC_UBYTE: upgrade = NC_BYTE; break; + case NC_SHORT: upgrade = NC_SHORT; break; + case NC_USHORT: upgrade = NC_SHORT; break; + case NC_INT: upgrade = NC_INT; break; + case NC_UINT: upgrade = NC_INT; break; + case NC_INT64: upgrade = NC_INT64; break; + case NC_UINT64: upgrade = NC_UINT64; break; + case NC_FLOAT: upgrade = NC_FLOAT; break; + case NC_DOUBLE: upgrade = NC_DOUBLE; break; + case NC_URL: + case NC_STRING: upgrade = NC_CHAR; break; + default: break; + } + } else if(drno->controls.flags & NCF_NC4) { + /* netcdf-4 conversion is more correct */ + switch (nctype) { + case NC_CHAR: upgrade = NC_CHAR; break; + case NC_BYTE: upgrade = NC_BYTE; break; + case NC_UBYTE: upgrade = NC_UBYTE; break; + case NC_SHORT: upgrade = NC_SHORT; break; + case NC_USHORT: upgrade = NC_USHORT; break; + case NC_INT: upgrade = NC_INT; break; + case NC_UINT: upgrade = NC_UINT; break; + case NC_INT64: upgrade = NC_INT64; break; + case NC_UINT64: upgrade = NC_UINT64; break; + case NC_FLOAT: upgrade = NC_FLOAT; break; + case NC_DOUBLE: upgrade = NC_DOUBLE; break; + case NC_URL: + case NC_STRING: upgrade = NC_STRING; break; + default: break; + } + } + return upgrade; +} + +nc_type +octypetonc(OCtype etype) +{ + switch (etype) { + case OC_Char: return NC_CHAR; + case OC_Byte: return NC_UBYTE; + case OC_UByte: return NC_UBYTE; + case OC_Int16: return NC_SHORT; + case OC_UInt16: return NC_USHORT; + case OC_Int32: return NC_INT; + case OC_UInt32: return NC_UINT; + case OC_Int64: return NC_INT64; + case OC_UInt64: return NC_UINT64; + case OC_Float32: return NC_FLOAT; + case OC_Float64: return NC_DOUBLE; + case OC_String: return NC_STRING; + case OC_URL: return NC_STRING; + case OC_Dataset: return NC_Dataset; + case OC_Sequence: return NC_Sequence; + case OC_Structure: return NC_Structure; + case OC_Grid: return NC_Grid; + case OC_Dimension: return NC_Dimension; + case OC_Primitive: return NC_Primitive; + default: break; + } + return NC_NAT; +} + +OCtype +nctypetodap(nc_type nctype) +{ + switch (nctype) { + case NC_CHAR: return OC_Char; + case NC_BYTE: return OC_Byte; + case NC_UBYTE: return OC_UByte; + case NC_SHORT: return OC_Int16; + case NC_USHORT: return OC_UInt16; + case NC_INT: return OC_Int32; + case NC_UINT: return OC_UInt32; + case NC_INT64: return OC_Int64; + case NC_UINT64: return OC_UInt64; + case NC_FLOAT: return OC_Float32; + case NC_DOUBLE: return OC_Float64; + case NC_STRING: return OC_String; + default : break; + } + return OC_NAT; +} + +size_t +nctypesizeof(nc_type nctype) +{ + switch (nctype) { + case NC_CHAR: return sizeof(char); + case NC_BYTE: return sizeof(signed char); + case NC_UBYTE: return sizeof(unsigned char); + case NC_SHORT: return sizeof(short); + case NC_USHORT: return sizeof(unsigned short); + case NC_INT: return sizeof(int); + case NC_UINT: return sizeof(unsigned int); + case NC_INT64: return sizeof(long long); + case NC_UINT64: return sizeof(unsigned long long); + case NC_FLOAT: return sizeof(float); + case NC_DOUBLE: return sizeof(double); + case NC_STRING: return sizeof(char*); + default: PANIC("nctypesizeof"); + } + return 0; +} + +char* +nctypetostring(nc_type nctype) +{ + switch (nctype) { + case NC_NAT: return "NC_NAT"; + case NC_BYTE: return "NC_BYTE"; + case NC_CHAR: return "NC_CHAR"; + case NC_SHORT: return "NC_SHORT"; + case NC_INT: return "NC_INT"; + case NC_FLOAT: return "NC_FLOAT"; + case NC_DOUBLE: return "NC_DOUBLE"; + case NC_UBYTE: return "NC_UBYTE"; + case NC_USHORT: return "NC_USHORT"; + case NC_UINT: return "NC_UINT"; + case NC_INT64: return "NC_INT64"; + case NC_UINT64: return "NC_UINT64"; + case NC_STRING: return "NC_STRING"; + case NC_VLEN: return "NC_VLEN"; + case NC_OPAQUE: return "NC_OPAQUE"; + case NC_ENUM: return "NC_ENUM"; + case NC_COMPOUND: return "NC_COMPOUND"; + case NC_URL: return "NC_URL"; + case NC_SET: return "NC_SET"; + case NC_Dataset: return "NC_Dataset"; + case NC_Sequence: return "NC_Sequence"; + case NC_Structure: return "NC_Structure"; + case NC_Grid: return "NC_Grid"; + case NC_Dimension: return "NC_Dimension"; + case NC_Primitive: return "NC_Primitive"; + default: break; + } + return NULL; +} + + +/* Pad a buffer */ +int +alignbuffer3(NCbytes* buf, int alignment) +{ + int pad; + unsigned long len; + if(buf == NULL) return 0; + len = ncbyteslength(buf); + pad = nccpadding(len,alignment); + +#ifdef TEST + for(;pad > 0;pad--) + ncbytesappend(buf,0x3a); /* 0x3a was chosen at random */ +#else + ncbytessetlength(buf,len+pad); +#endif + return 1; +} + +size_t +dimproduct3(NClist* dimensions) +{ + size_t size = 1; + unsigned int i; + if(dimensions == NULL) return size; + for(i=0;idim.declsize; + } + return size; +} + + +/* Return value of param or NULL if not found */ +const char* +paramvalue34(NCDAPCOMMON* nccomm, const char* key) +{ + const char* value; + + if(nccomm == NULL || key == NULL) return 0; + if(!nc_urilookup(nccomm->oc.url,key,&value)) + return NULL; + return value; +} + +static const char* checkseps = "+,:;"; + +/* Search for substring in value of param. If substring == NULL; then just + check if param is defined. +*/ +int +paramcheck34(NCDAPCOMMON* nccomm, const char* key, const char* subkey) +{ + const char* value; + char* p; + + if(nccomm == NULL || key == NULL) return 0; + if(!nc_urilookup(nccomm->oc.url,key,&value)) + return 0; + if(subkey == NULL) return 1; + p = strstr(value,subkey); + if(p == NULL) return 0; + p += strlen(subkey); + if(*p != '\0' && strchr(checkseps,*p) == NULL) return 0; + return 1; +} + + +/* This is NOT UNION */ +int +nclistconcat(NClist* l1, NClist* l2) +{ + unsigned int i; + for(i=0;i=0;i--) { + ncelem test = nclistget(l,i); + if(test==elem) { + nclistremove(l,i); + found=1; + } + } + return found; +} + +/* Collect the set of container nodes ending in "container"*/ +void +collectnodepath3(CDFnode* node, NClist* path, int withdataset) +{ + if(node == NULL) return; + nclistpush(path,(ncelem)node); + while(node->container != NULL) { + node = node->container; + if(!withdataset && node->nctype == NC_Dataset) break; + nclistinsert(path,0,(ncelem)node); + } +} + +/* Like collectnodepath3, but in ocspace */ +void +collectocpath(OCconnection conn, OCobject node, NClist* path) +{ + OCobject container; + OCtype octype; + if(node == OCNULL) return; + oc_inq_class(conn,node,&octype); + if(octype == OC_Dataset) return; + oc_inq_container(conn,node,&container); + if(container != OCNULL) + collectocpath(conn,container,path); + nclistpush(path,(ncelem)node); +} + +char* +makeocpathstring3(OCconnection conn, OCobject node, const char* sep) +{ + int slen,i,len,first,seplen; + char* pathname; + OCtype octype; + NClist* ocpath = nclistnew(); + + collectocpath(conn,node,ocpath); + len = nclistlength(ocpath); + assert(len > 0); /* dataset at least */ + + oc_inq_type(conn,node,&octype); + if(octype == OC_Dataset) + {pathname = nulldup(""); goto done;} /* Dataset */ + + seplen = strlen(sep); + for(slen=0,i=0;i 0); /* dataset at least */ + seplen = strlen(separator); + ASSERT(seplen > 0); + for(slen=0,i=0;inctype == NC_Dataset) continue; + slen += strlen(node->ncbasename); + slen += seplen; + } + slen += 1; /* for null terminator*/ + pathname = (char*)malloc(slen); + MEMCHECK(pathname,NULL); + pathname[0] = '\0'; + for(first=1,i=0;ielided || (flags & PATHELIDE)==0) { + if(node->nctype != NC_Dataset) { + name = node->ncbasename; + if(!first) strcat(pathname,separator); + strcat(pathname,name); + first = 0; + } + } + } + return pathname; +} + + +/* convert path to string using the ncname field */ +char* +makecdfpathstring3(CDFnode* var, const char* separator) +{ + char* spath; + NClist* path = nclistnew(); + collectnodepath3(var,path,WITHDATASET); /* <= note */ + spath = makepathstring3(path,separator,PATHNC); + nclistfree(path); + return spath; +} + +/* Collect the set names of container nodes ending in "container"*/ +void +clonenodenamepath3(CDFnode* node, NClist* path, int withdataset) +{ + if(node == NULL) return; + /* stop at the dataset container as well*/ + if(node->nctype != NC_Dataset) + clonenodenamepath3(node->container,path,withdataset); + if(node->nctype != NC_Dataset || withdataset) + nclistpush(path,(ncelem)nulldup(node->ncbasename)); +} + +char* +simplepathstring3(NClist* names, char* separator) +{ + int i; + size_t len; + char* result; + if(nclistlength(names) == 0) return nulldup(""); + for(len=0,i=0;i 0) strcat(result,separator); + strcat(result,segment); + } + return result; +} + +/* Define a number of location tests */ + +/* Is node contained (transitively) in a sequence ? */ +BOOL +dapinsequence(CDFnode* node) +{ + if(node == NULL || node->container == NULL) return TRUE; + for(node=node->container;node->nctype != NC_Dataset;node=node->container) { + if(node->nctype == NC_Sequence) return TRUE; + } + return FALSE; +} + +/* Is node a map field of a grid? */ +BOOL +dapgridmap(CDFnode* node) +{ + if(node != NULL && node->container != NULL + && node->container->nctype == NC_Grid) { + CDFnode* array = (CDFnode*)nclistget(node->container->subnodes,0); + return (node != array); + } + return FALSE; +} + +/* Is node an array field of a grid? */ +BOOL +dapgridarray(CDFnode* node) +{ + if(node != NULL && node->container != NULL + && node->container->nctype == NC_Grid) { + CDFnode* array = (CDFnode*)nclistget(node->container->subnodes,0); + return (node == array); + } + return FALSE; +} + +BOOL +dapgridelement(CDFnode* node) +{ + return dapgridarray(node) + || dapgridmap(node); +} + +/* Is node a top-level grid node? */ +BOOL +daptopgrid(CDFnode* grid) +{ + if(grid == NULL || grid->nctype != NC_Grid) return FALSE; + return daptoplevel(grid); +} + +/* Is node a top-level sequence node? */ +BOOL +daptopseq(CDFnode* seq) +{ + if(seq == NULL || seq->nctype != NC_Sequence) return FALSE; + return daptoplevel(seq); +} + +/* Is node a top-level node? */ +BOOL +daptoplevel(CDFnode* node) +{ + if(node->container == NULL + || node->container->nctype != NC_Dataset) return FALSE; + return TRUE; +} + +unsigned int +modeldecode(int translation, const char* smodel, + const struct NCTMODEL* models, + unsigned int dfalt) +{ + for(;models->translation;models++) { + if(translation != models->translation) continue; + if(smodel == models->model + || (models->model != NULL && strcasecmp(smodel,models->model)==0)) { + /* We have a match */ + return models->flags; + } + } + return dfalt; +} + +unsigned long +getlimitnumber(const char* limit) +{ + size_t slen; + unsigned long multiplier = 1; + unsigned long lu; + + if(limit == NULL) return 0; + slen = strlen(limit); + if(slen == 0) return 0; + switch (limit[slen-1]) { + case 'G': case 'g': multiplier = GIGBYTE; break; + case 'M': case 'm': multiplier = MEGBYTE; break; + case 'K': case 'k': multiplier = KILBYTE; break; + default: break; + } + sscanf(limit,"%lu",&lu); + return (lu*multiplier); +} + +void +dapexpandescapes(char *termstring) +{ + char *s, *t, *endp; + + /* expand "\" escapes, e.g. "\t" to tab character; + will only shorten string length, never increase it + */ + s = termstring; + t = termstring; + while(*t) { + if (*t == '\\') { + t++; + switch (*t) { + case 'a': + *s++ = '\007'; t++; /* will use '\a' when STDC */ + break; + case 'b': + *s++ = '\b'; t++; + break; + case 'f': + *s++ = '\f'; t++; + break; + case 'n': + *s++ = '\n'; t++; + break; + case 'r': + *s++ = '\r'; t++; + break; + case 't': + *s++ = '\t'; t++; + break; + case 'v': + *s++ = '\v'; t++; + break; + case '\\': + *s++ = '\\'; t++; + break; + case '?': + *s++ = '\177'; t++; + break; + case 'x': + t++; /* now t points to one or more hex digits */ + *s++ = (char) strtol(t, &endp, 16); + t = endp; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { + /* t should now point to 3 octal digits */ + int c; + c = t[0]; + if(c == 0 || c < '0' || c > '7') goto normal; + c = t[1]; + if(c == 0 || c < '0' || c > '7') goto normal; + c = t[2]; + if(c == 0 || c < '0' || c > '7') goto normal; + c = ((t[0]-'0')<<6)+((t[1]-'0')<<3)+(t[2]-'0'); + *s++ = (char)c; + t += 3; + } break; + default: + if(*t == 0) + *s++ = '\\'; + else + *s++ = *t++; + break; + } + } else { +normal: *s++ = *t++; + } + } + *s = '\0'; + return; +} + +#ifdef HAVE_GETTIMEOFDAY +static struct timeval time0; +static struct timeval time1; + +static double +deltatime() +{ + double t0, t1; + t0 = ((double)time0.tv_sec); + t0 += ((double)time0.tv_usec) / 1000000.0; + t1 = ((double)time1.tv_sec); + t1 += ((double)time1.tv_usec) / 1000000.0; + return (t1 - t0); +} +#endif + +/* Provide a wrapper for oc_fetch so we can log what it does */ +OCerror +dap_fetch(NCDAPCOMMON* nccomm, OCconnection conn, const char* ce, + OCdxd dxd, OCobject* rootp) +{ + OCerror ocstat; + char* ext; + OCflags flags = 0; + + if(dxd == OCDDS) ext = ".dds"; + else if(dxd == OCDAS) ext = ".das"; + else ext = ".dods"; + + if(ce != NULL && strlen(ce) == 0) + ce = NULL; + + if(FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE)) { + ce = NULL; + } + + if(FLAGSET(nccomm->controls,NCF_ONDISK)) { + flags |= OCONDISK; + } + + if(SHOWFETCH) { + /* Build uri string minus the constraint */ + char* baseurl = nc_uribuild(nccomm->oc.url,NULL,ext,0); + if(ce == NULL) + LOG1(NCLOGNOTE,"fetch: %s\n",baseurl); + else + LOG2(NCLOGNOTE,"fetch: %s?%s\n",baseurl,ce); + nullfree(baseurl); +#ifdef HAVE_GETTIMEOFDAY + gettimeofday(&time0,NULL); +#endif + } + ocstat = oc_fetchf(conn,ce,dxd,flags,rootp); + if(FLAGSET(nccomm->controls,NCF_SHOWFETCH)) { +#ifdef HAVE_GETTIMEOFDAY + double secs; + gettimeofday(&time1,NULL); + secs = deltatime(); + nclog(NCLOGNOTE,"fetch complete: %0.3f secs",secs); +#else + nclog(NCLOGNOTE,"fetch complete."); +#endif + } +#ifdef DEBUG2 +fprintf(stderr,"fetch: dds:\n"); +oc_dumpnode(conn,*rootp); +#endif + return ocstat; +} + +/* Check a name to see if it contains illegal dap characters +*/ + +static char* badchars = "./"; + + +int +dap_badname(char* name) +{ + char* p; + if(name == NULL) return 0; + for(p=badchars;*p;p++) { + if(strchr(name,*p) != NULL) return 1; + } + return 0; +} + +/* Check a name to see if it contains illegal dap characters + and repair them +*/ + +char* +dap_repairname(char* name) +{ + char* newname; + char *p, *q; int c; + + if(name == NULL) return NULL; + /* assume that dap_badname was called on this name and returned 1 */ + newname = (char*)malloc(1+(3*strlen(name))); /* max needed */ + newname[0] = '\0'; /* so we can use strcat */ + for(p=name,q=newname;(c=*p);p++) { + if(strchr(badchars,c) != NULL) { + char newchar[8]; + snprintf(newchar,sizeof(newchar),"%%%hhx",c); + strcat(newname,newchar); + q += 3; /*strlen(newchar)*/ + } else + *q++ = c; + *q = '\0'; /* so we can always do strcat */ + } + *q = '\0'; /* ensure trailing null */ + return newname; +} diff --git a/extern/src_netcdf4/daputil.h b/extern/src_netcdf4/daputil.h new file mode 100644 index 0000000..f0541da --- /dev/null +++ b/extern/src_netcdf4/daputil.h @@ -0,0 +1,86 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/daputil.h,v 1.25 2010/05/05 22:15:16 dmh Exp $ + *********************************************************************/ +#ifndef DAPUTIL_H +#define DAPUTIL_H 1 + +/* Define a set of flags to control path construction */ +#define PATHNC 1 /*Use ->ncname*/ +#define PATHELIDE 2 /*Leave out elided nodes*/ + +/* mnemonic */ +#define WITHDATASET 1 +#define WITHOUTDATASET 0 + +/* sigh!, Forwards */ +struct CDFnode; +struct NCTMODEL; +struct NCDAPCOMMON; + +extern nc_type nctypeconvert(struct NCDAPCOMMON*, nc_type); +extern nc_type octypetonc(OCtype); +extern OCtype nctypetodap(nc_type); +extern size_t nctypesizeof(nc_type); +extern char* nctypetostring(nc_type); +extern char* maketmppath(char* path, char* prefix); + +extern void collectnodepath3(struct CDFnode*, NClist* path, int dataset); +extern void collectocpath(OCconnection conn, OCobject node, NClist* path); + +extern char* makecdfpathstring3(struct CDFnode*,const char*); +extern void clonenodenamepath3(struct CDFnode*, NClist*, int); +extern char* makepathstring3(NClist* path, const char* separator, int flags); + +extern char* makeocpathstring3(OCconnection, OCobject, const char*); + +extern char* cdflegalname3(char* dapname); + +/* Given a param string; return its value or null if not found*/ +extern const char* paramvalue34(struct NCDAPCOMMON* drno, const char* param); +/* Given a param string; check for a given substring */ +extern int paramcheck34(struct NCDAPCOMMON* drno, const char* param, const char* substring); + +extern int nclistconcat(NClist* l1, NClist* l2); +extern int nclistminus(NClist* l1, NClist* l2); +extern int nclistdeleteall(NClist* l1, ncelem); + +extern char* getvaraprint(void* gv); + +extern int dapinsequence(struct CDFnode* node); +extern int daptopgrid(struct CDFnode* node); +extern int daptopseq(struct CDFnode* node); +extern int daptoplevel(struct CDFnode* node); +extern int dapgridmap(struct CDFnode* node); +extern int dapgridarray(struct CDFnode* node); +extern int dapgridelement(struct CDFnode* node); + +extern unsigned int modeldecode(int, const char*, const struct NCTMODEL*, unsigned int); +extern unsigned long getlimitnumber(const char* limit); + +extern void dapexpandescapes(char *termstring); + +/* Only used by libncdap4 */ +extern int alignbuffer3(NCbytes*, int alignment); +extern size_t dimproduct3(NClist* dimensions); + +#if defined(DLL_NETCDF) +# if defined(DLL_EXPORT) +# define NCC_EXTRA __declspec(dllexport) +#else +# define NCC_EXTRA __declspec(dllimport) +# endif +NCC_EXTRA extern int nc__testurl(const char* path, char** basename); +#else +extern int nc__testurl(const char* parth, char** basename); +#endif + + +/* Provide a wrapper for oc_fetch so we can log what it does */ +extern OCerror dap_fetch(struct NCDAPCOMMON*,OCconnection,const char*,OCdxd,OCobject*); + +extern int dap_badname(char* name); +extern char* dap_repairname(char* name); + +#endif /*DAPUTIL_H*/ diff --git a/extern/src_netcdf4/datt.c b/extern/src_netcdf4/datt.c new file mode 100644 index 0000000..cfdc501 --- /dev/null +++ b/extern/src_netcdf4/datt.c @@ -0,0 +1,166 @@ +/** \file +Attribute functions + +These functions read and write attributes. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \defgroup attributes Attributes + +Attributes hold metadata about data and files. + +\image html ncatts.png "Attributes store metadata." + +Attributes may be associated with a netCDF variable to specify such +properties as units, special values, maximum and minimum valid values, +scaling factors, and offsets. + +Attributes for a netCDF dataset are defined when the dataset is first +created, while the netCDF dataset is in define mode. Additional +attributes may be added later by reentering define mode. + +A netCDF attribute has a netCDF variable to which it is assigned, a +name, a type, a length, and a sequence of one or more values. + +An attribute is designated by its variable ID and name. When an +attribute name is not known, it may be designated by its variable ID +and number in order to determine its name, using the function +nc_inq_attname(). + +The attributes associated with a variable are typically defined +immediately after the variable is created, while still in define +mode. The data type, length, and value of an attribute may be changed +even when in data mode, as long as the changed attribute requires no +more space than the attribute as originally defined. + +It is also possible to have attributes that are not associated with +any variable. These are called global attributes and are identified by +using ::NC_GLOBAL as a variable pseudo-ID. Global attributes are usually +related to the netCDF dataset as a whole and may be used for purposes +such as providing a title or processing history for a netCDF dataset. + +Operations supported on attributes are: +- Create an attribute, given its variable ID, name, data type, length, + and value. +- Get attribute's data type and length from its variable ID and name. +- Get attribute's value from its variable ID and name. +- Copy attribute from one netCDF variable to another. +- Get name of attribute from its number. +- Rename an attribute. +- Delete an attribute. +*/ + +/*! \{*/ /* All these functions are part of the above defgroup... */ + + +/** \name Deleting and Renaming Attributes + +Functions to delete or rename an attribute. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/*! +Rename an attribute. + +The function nc_rename_att() changes the name of an attribute. If the +new name is longer than the original name, the netCDF dataset must be +in define mode. You cannot rename an attribute to have the same name +as another attribute of the same variable. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL for +a global attribute. + +\param name Attribute \ref object_name. + +\param newname The new attribute \ref object_name. + +

Example

+ +Here is an example using nc_rename_att() to rename the variable +attribute units to Units for a variable rh in an existing netCDF +dataset named foo.nc: + +\code + #include + ... + int status; + int ncid; + int rh_id; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_rename_att(ncid, rh_id, "units", "Units"); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_rename_att(int ncid, int varid, const char *name, const char *newname) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->rename_att(ncid, varid, name, newname); +} + +/*! +Delete an attribute. + +The function nc_del_att() deletes a netCDF attribute from an open +netCDF dataset. The netCDF dataset must be in define mode. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global attribute. + +\param name Attribute name. + +

Example

+ +Here is an example using nc_del_att() to delete the variable attribute +Units for a variable rh in an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status; + int ncid; + int rh_id; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_redef(ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_del_att(ncid, rh_id, "Units"); + if (status != NC_NOERR) handle_error(status); + status = nc_enddef(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_del_att(int ncid, int varid, const char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->del_att(ncid, varid, name); +} +/*! \} */ /* End of named group ...*/ + +/*! \} */ /* End of defgroup. */ diff --git a/extern/src_netcdf4/dattget.c b/extern/src_netcdf4/dattget.c new file mode 100644 index 0000000..4f79e8c --- /dev/null +++ b/extern/src_netcdf4/dattget.c @@ -0,0 +1,256 @@ +/** \file +Attribute functions + +These functions read and write attributes. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Getting Attributes + +Functions to get the values of attributes. + */ +/*! \{ */ + +/*! +\ingroup attributes +Get an attribute of any type. + +The nc_get_att() functions works for any type of attribute, and must +be used to get attributes of user-defined type. We recommend that they +type safe versions of this function be used where possible. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global attribute. + +\param name Attribute \ref object_name. + +\param value Pointer to location for returned attribute value(s). All +elements of the vector of attribute values are returned, so you must +allocate enough space to hold them. Before using the value as a C +string, make sure it is null-terminated. Call nc_inq_attlen() first to +find out the length of the attribute. +*/ +int +nc_get_att(int ncid, int varid, const char *name, void *value) +{ + NC* ncp; + int stat = NC_NOERR; + nc_type xtype; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + + /* Need to get the type */ + if ((stat = nc_inq_atttype(ncid, varid, name, &xtype))) + return stat; + + return ncp->dispatch->get_att(ncid, varid, name, value, xtype); +} +/*! \} */ + +/*! +\ingroup attributes +Get an attribute. + +This function gets an attribute from the netCDF file. The nc_get_att() +function works with any type of data, including user defined types. + +\note The netCDF library reads all attributes into memory when the +file is opened with nc_open(). Getting an attribute copies the value +from the in-memory store, and does not incure any file I/O penalties. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global attribute. + +\param name Attribute \ref object_name. + +\param value Pointer to location for returned attribute value(s). All +elements of the vector of attribute values are returned, so you must +allocate enough space to hold them. If you don't know how much +space to reserve, call nc_inq_attlen() first to find out the length of +the attribute. + +

Example

+ +Here is an example using nc_get_att_double() to determine the values +of a variable attribute named valid_range for a netCDF variable named +rh and using nc_get_att_text() to read a global attribute named title +in an existing netCDF dataset named foo.nc. + +In this example, it is assumed that we don't know how many values will +be returned, but that we do know the types of the attributes. Hence, +to allocate enough space to store them, we must first inquire about +the length of the attributes. + +\code + #include + ... + int status; + int ncid; + int rh_id; + int vr_len, t_len; + double *vr_val; + char *title; + extern char *malloc() + + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_attlen (ncid, rh_id, "valid_range", &vr_len); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_attlen (ncid, NC_GLOBAL, "title", &t_len); + if (status != NC_NOERR) handle_error(status); + + vr_val = (double *) malloc(vr_len * sizeof(double)); + title = (char *) malloc(t_len + 1); + + status = nc_get_att_double(ncid, rh_id, "valid_range", vr_val); + if (status != NC_NOERR) handle_error(status); + status = nc_get_att_text(ncid, NC_GLOBAL, "title", title); + if (status != NC_NOERR) handle_error(status); + title[t_len] = '\0'; + ... +\endcode +*/ +/*! \{ */ +int +nc_get_att_text(int ncid, int varid, const char *name, char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_CHAR); +} + +int +nc_get_att_schar(int ncid, int varid, const char *name, signed char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_BYTE); +} + +int +nc_get_att_uchar(int ncid, int varid, const char *name, unsigned char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UBYTE); +} + +int +nc_get_att_short(int ncid, int varid, const char *name, short *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_SHORT); +} + +int +nc_get_att_int(int ncid, int varid, const char *name, int *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_INT); +} + +int +nc_get_att_long(int ncid, int varid, const char *name, long *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, longtype); +} + +int +nc_get_att_float(int ncid, int varid, const char *name, float *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_FLOAT); +} + +int +nc_get_att_double(int ncid, int varid, const char *name, double *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_DOUBLE); +} + +int +nc_get_att_ubyte(int ncid, int varid, const char *name, unsigned char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UBYTE); +} + +int +nc_get_att_ushort(int ncid, int varid, const char *name, unsigned short *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_USHORT); +} + +int +nc_get_att_uint(int ncid, int varid, const char *name, unsigned int *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UINT); +} + +int +nc_get_att_longlong(int ncid, int varid, const char *name, long long *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_INT64); +} + +int +nc_get_att_ulonglong(int ncid, int varid, const char *name, unsigned long long *value) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid, varid, name, (void *)value, NC_UINT64); +} + +int +nc_get_att_string(int ncid, int varid, const char *name, char **value) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_att(ncid,varid,name,(void*)value, NC_STRING); +} +/*! \} */ diff --git a/extern/src_netcdf4/dattinq.c b/extern/src_netcdf4/dattinq.c new file mode 100644 index 0000000..c9d2c07 --- /dev/null +++ b/extern/src_netcdf4/dattinq.c @@ -0,0 +1,208 @@ +/** \file +Attribute inquiry functions + +These functions find out about attributes. + +Copyright 2011 University Corporation for Atmospheric +Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Learning about Attributes + +Functions to learn about the attributes in a file. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** +\ingroup attributes +Return information about a netCDF attribute. + +The function nc_inq_att returns the attribute's type and length. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global attribute. + +\param name Pointer to the location for the returned attribute \ref +object_name. \ref ignored_if_null. + +\param xtypep Pointer to location for returned attribute \ref +data_type. \ref ignored_if_null. + +\param lenp Pointer to location for returned number of values +currently stored in the attribute. For attributes of type ::NC_CHAR, +you should not assume that this includes a trailing zero byte; it +doesn't if the attribute was stored without a trailing zero byte, for +example from a FORTRAN program. Before using the value as a C string, +make sure it is null-terminated. \ref ignored_if_null. + +\section Example + +Here is an example using nc_inq_att() to find out the type and length of +a variable attribute named valid_range for a netCDF variable named rh +and a global attribute named title in an existing netCDF dataset named +foo.nc: + +\code + #include + ... + int status; + int ncid; + int rh_id; + nc_type vr_type, t_type; + size_t vr_len, t_len; + + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_att (ncid, rh_id, "valid_range", &vr_type, &vr_len); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_att (ncid, NC_GLOBAL, "title", &t_type, &t_len); + if (status != NC_NOERR) handle_error(status); +\endcode +*/ +int +nc_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, + size_t *lenp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_att(ncid, varid, name, xtypep, lenp); +} + +/** +\ingroup attributes +Find an attribute ID. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL for +a global attribute. + +\param name Attribute \ref object_name. + +\param idp Pointer to location for returned attribute number that +specifies which attribute this is for this variable (or which global +attribute). If you already know the attribute name, knowing its number +is not very useful, because accessing information about an attribute +requires its name. +*/ +int +nc_inq_attid(int ncid, int varid, const char *name, int *idp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_attid(ncid, varid, name, idp); +} + +/** +\ingroup attributes +Find the name of an attribute. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global attribute. + +\param attnum Attribute number. The attributes for each variable are +numbered from 0 (the first attribute) to natts-1, where natts is the +number of attributes for the variable, as returned from a call to +nc_inq_varnatts(). + +\param name Pointer to the location for the returned attribute \ref +object_name. +*/ +int +nc_inq_attname(int ncid, int varid, int attnum, char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_attname(ncid, varid, attnum, name); +} + +/** +\ingroup attributes +Find number of global or group attributes. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param nattsp Pointer where number of global or group attributes will be +written. \ref ignored_if_null. +*/ +int +nc_inq_natts(int ncid, int *nattsp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + if(nattsp == NULL) return NC_NOERR; + return ncp->dispatch->inq(ncid, NULL, NULL, nattsp, NULL); +} + +/** +\ingroup attributes +Find the type of an attribute. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global or group attribute. + +\param name Attribute \ref object_name. + +\param xtypep Pointer to location for returned attribute \ref data_type. +*/ +int +nc_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_att(ncid, varid, name, xtypep, NULL); +} + +/** +\ingroup attributes +Find the length of an attribute. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the attribute's variable, or ::NC_GLOBAL +for a global or group attribute. + +\param name Attribute \ref object_name. + +\param lenp Pointer to location for returned number of values +currently stored in the attribute. Before using the value as a C +string, make sure it is null-terminated. \ref ignored_if_null. +*/ +int +nc_inq_attlen(int ncid, int varid, const char *name, size_t *lenp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_att(ncid, varid, name, NULL, lenp); +} + +/*! \} */ /* End of named group ...*/ diff --git a/extern/src_netcdf4/dattput.c b/extern/src_netcdf4/dattput.c new file mode 100644 index 0000000..5b74dc2 --- /dev/null +++ b/extern/src_netcdf4/dattput.c @@ -0,0 +1,366 @@ +/** \file +Functions to write attributes. + +These functions read and write attributes. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Writing Attributes + +Functions to write attributes. */ +/*! \{ */ + +/*! +\ingroup attributes +Write a string attribute. + +The function nc_put_att_string adds or changes a variable attribute or +global attribute of an open netCDF dataset. The string type is only +available in netCDF-4/HDF5 files, when ::NC_CLASSIC_MODEL has not been +used in nc_create(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the variable to which the attribute will +be assigned or ::NC_GLOBAL for a global or group attribute. + +\param name Attribute \ref object_name. \ref attribute_conventions may +apply. + +\param len Number of values provided for the attribute. + +\param value Pointer to one or more values. + +\returns ::NC_NOERR No error. +\returns ::NC_EINVAL Trying to set global _FillValue. +\returns ::NC_ENOTVAR Couldn't find varid. +\returns ::NC_EBADTYPE Fill value and var must be same type. +\returns ::NC_ENOMEM Out of memory +\returns ::NC_ELATEFILL Fill values must be written while the file +is still in initial define mode. +*/ +int +nc_put_att_string(int ncid, int varid, const char *name, + size_t len, const char** value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, NC_STRING, + len, (void*)value, NC_STRING); +} + +/*! +\ingroup attributes +Write a text attribute. + +Add or change a text attribute. If this attribute is new, +or if the space required to store the attribute is greater than +before, the netCDF dataset must be in define mode. + +Although it's possible to create attributes of all types, text and +double attributes are adequate for most purposes. + +Use the nc_put_att function to create attributes of any type, +including user-defined types. We recommend using the type safe +versions of this function whenever possible. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the variable to which the attribute will +be assigned or ::NC_GLOBAL for a global attribute. + +\param name Attribute \ref object_name. \ref attribute_conventions may +apply. + +\param len Number of values provided for the attribute. + +\param value Pointer to one or more values. + +\returns ::NC_NOERR No error. +\returns ::NC_EINVAL Trying to set global _FillValue. +\returns ::NC_ENOTVAR Couldn't find varid. +\returns ::NC_EBADTYPE Fill value and var must be same type. +\returns ::NC_ENOMEM Out of memory +\returns ::NC_ELATEFILL Fill values must be written while the file +is still in initial define mode. + +\note With netCDF-4 files, nc_put_att will notice if you are writing a +_Fill_Value_ attribute, and will tell the HDF5 layer to use the +specified fill value for that variable. + +\section Example + +Here is an example using nc_put_att_double() to add a variable +attribute named valid_range for a netCDF variable named rh and +nc_put_att_text() to add a global attribute named title to an existing +netCDF dataset named foo.nc: + +\code + #include + ... + int status; + int ncid; + int rh_id; + static double rh_range[] = {0.0, 100.0}; + static char title[] = "example netCDF dataset"; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_redef(ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_put_att_double (ncid, rh_id, "valid_range", + NC_DOUBLE, 2, rh_range); + if (status != NC_NOERR) handle_error(status); + status = nc_put_att_text (ncid, NC_GLOBAL, "title", + strlen(title), title) + if (status != NC_NOERR) handle_error(status); + ... + status = nc_enddef(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode +*/ +int +nc_put_att_text(int ncid, int varid, const char *name, + size_t len, const char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, NC_CHAR, len, + (void *)value, NC_CHAR); +} + +/*! \} */ +/*! +\ingroup attributes +Write an attribute. + +The function nc_put_att_ type adds or changes a variable attribute or +global attribute of an open netCDF dataset. If this attribute is new, +or if the space required to store the attribute is greater than +before, the netCDF dataset must be in define mode. + +With netCDF-4 files, nc_put_att will notice if you are writing a +_Fill_Value_ attribute, and will tell the HDF5 layer to use the +specified fill value for that variable. + +Although it's possible to create attributes of all types, text and +double attributes are adequate for most purposes. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID of the variable to which the attribute will +be assigned or ::NC_GLOBAL for a global or group attribute. + +\param name Attribute \ref object_name. \ref attribute_conventions may +apply. + +\param xtype \ref data_type of the attribute. + +\param len Number of values provided for the attribute. + +\param value Pointer to one or more values. + +\returns ::NC_NOERR No error. +\returns ::NC_EINVAL Trying to set global _FillValue. +\returns ::NC_ENOTVAR Couldn't find varid. +\returns ::NC_EBADTYPE Fill value and var must be same type. +\returns ::NC_ENOMEM Out of memory +\returns ::NC_ELATEFILL Fill values must be written while the file +is still in initial define mode. + +\section Example + +Here is an example using nc_put_att_double() to add a variable +attribute named valid_range for a netCDF variable named rh and +nc_put_att_text() to add a global attribute named title to an existing +netCDF dataset named foo.nc: + +\code + #include + ... + int status; + int ncid; + int rh_id; + static double rh_range[] = {0.0, 100.0}; + static char title[] = "example netCDF dataset"; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_redef(ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_put_att_double (ncid, rh_id, "valid_range", + NC_DOUBLE, 2, rh_range); + if (status != NC_NOERR) handle_error(status); + status = nc_put_att_text (ncid, NC_GLOBAL, "title", + strlen(title), title) + if (status != NC_NOERR) handle_error(status); + ... + status = nc_enddef(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode +*/ +/*! \{*/ +int +nc_put_att(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const void *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + value, xtype); +} + +int +nc_put_att_schar(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const signed char *value) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_BYTE); +} + +int +nc_put_att_uchar(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const unsigned char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_UBYTE); +} + +int +nc_put_att_short(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const short *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_SHORT); +} + +int +nc_put_att_int(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const int *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_INT); +} + +int +nc_put_att_long(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const long *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, longtype); +} + +int +nc_put_att_float(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const float *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_FLOAT); +} + +int +nc_put_att_double(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const double *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_DOUBLE); +} + +int +nc_put_att_ubyte(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const unsigned char *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_UBYTE); +} + +int +nc_put_att_ushort(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const unsigned short *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_USHORT); +} + +int +nc_put_att_uint(int ncid, int varid, const char *name, + nc_type xtype, size_t len, const unsigned int *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_UINT); +} + +int +nc_put_att_longlong(int ncid, int varid, const char *name, + nc_type xtype, size_t len, + const long long *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_INT64); +} + +int +nc_put_att_ulonglong(int ncid, int varid, const char *name, + nc_type xtype, size_t len, + const unsigned long long *value) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_att(ncid, varid, name, xtype, len, + (void *)value, NC_UINT64); +} + diff --git a/extern/src_netcdf4/dceconstraints.c b/extern/src_netcdf4/dceconstraints.c new file mode 100644 index 0000000..c43e53b --- /dev/null +++ b/extern/src_netcdf4/dceconstraints.c @@ -0,0 +1,866 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/constraints3.c,v 1.40 2010/05/27 21:34:07 dmh Exp $ + *********************************************************************/ + +#include "config.h" + +#include +#include +#include +#include + +#include "nclist.h" +#include "ncbytes.h" +#include "nclog.h" + +#include "netcdf.h" +#include "dceconstraints.h" +#include "dapdebug.h" +#include "dceparselex.h" + +#define DEBUG + +int dceverbose = 0; + +static char* opstrings[] = OPSTRINGS ; + +static void ceallnodesr(DCEnode* node, NClist* allnodes, CEsort which); + +/* Parse incoming url constraints, if any, + to check for syntactic correctness +*/ +int +dapparseconstraints(char* constraints, DCEconstraint* dapconstraint) +{ + int ncstat = NC_NOERR; + char* errmsg; + + assert(dapconstraint != NULL); + nclistclear(dapconstraint->projections); + nclistclear(dapconstraint->selections); + + ncstat = dapceparse(constraints,dapconstraint,&errmsg); + if(ncstat) { + nclog(NCLOGWARN,"DAP constraint parse failure: %s",errmsg); + if(errmsg) free(errmsg); + nclistclear(dapconstraint->projections); + nclistclear(dapconstraint->selections); + } + +#ifdef DEBUG +fprintf(stderr,"constraint: %s",dcetostring((DCEnode*)dapconstraint)); +#endif + return ncstat; +} + +/* Worksheet + +mg.st = md.st * ms.st +mg.f = md.f+(ms.f*md.st) +mg.l = ((ms.l-1) / ms.st) * mg.st + 1 +mg.p = mg.f + mg.l +mg.c = mg.l / mg.st + +0000000000111111111122222222223 +0123456789012345678901234567890 + xxxxxx + xxxxxx + 0 1 2 3 4 5 6 7 8 md=(st=3 f=1 l=25 p=26) + 0 1 2 ms=(st=2 f=3 l=5 p=8 ) + ---------------------------- + mg=(st=6 f=10 p=23 l=13) +c = 4 / 2 = 2 +l = 2 * 6 + 1 = 13 + +0000000000111111 +0123456789012345 + 0 1 2 3 4 md=(st=2 f=1 l=9 p=10) + 0 1 2 ms=(st=1 f=2 l=3 p=5) + ---------------------------- + mg=(st=2 f=5 p=10 l=5 ) +c = 2/1 = 2 +l = 2 * 2 + 1 = 13 + +0000000000111111111 +0123456789012345678 + 0 1 2 3 4 5 6 7 8 md=(st=2 f=1 l=17 p=18) + 0 1 2 ms=(st=2 f=3 l=5 p=8) + ---------------------------- + mg=(st=4 f=7 p=16 l=9 ) +c = 4/2 = 2 +l = 2 * 4 + 1 = 9 + +0000000000111111111 +0123456789012345678 + 0 1 2 3 4 md=(st=2 f=1 l=9 p=10) + 0 1 2 3 4 ms=(st=1 f=0 l=5 p=5) + ---------------------------- + mg=(st=2 f=1 p=10 l=9 ) +c = 4/1 = 4 +l = 4 * 2 + 1 = 9 + +00000 +01234 +01 md=(st=1 f=0 l=2 p=2) +0 ms=(st=1 f=0 l=1 p=1) + ---------------------------- + mg=(st=1 f=0 p=1 l=1 ) +c = 0/1 = 0 +l = 0 * 1 + 1 = 1 + +000000000011 +012345678901 +012 md=(st=1 f=0 l=3 p=3) +012 ms=(st=1 f=0 l=3 p=2) + ---------------------------- + mg=(st=1 f=0 p=3 l=3 ) +c = 2/1 = 2 +l = 2 * 1 + 1 = 3 + +*/ + +/* Merge slice src into slice dst; dst != src */ + +int +dceslicemerge(DCEslice* dst, DCEslice* src) +{ + int err = NC_NOERR; + DCEslice tmp; + + tmp.node.sort = CES_SLICE; + tmp.stride = (dst->stride * src->stride); + tmp.first = (dst->first+((src->first)*(dst->stride))); + tmp.length = (((src->length - 1) / src->stride) * tmp.stride) + 1; + tmp.stop = tmp.first + tmp.length; + tmp.count = tmp.length / tmp.stride; + /* use max declsize */ + if(dst->declsize > src->declsize) { + tmp.declsize = dst->declsize; + } else { + tmp.declsize = src->declsize; + } + if(tmp.length % tmp.stride != 0) tmp.count++; + if(tmp.first >= dst->stop || tmp.stop > dst->stop) + err = NC_EINVALCOORDS; + else + *dst = tmp; + return err; +} + + +/* +Given two projection lists, merge +src into dst taking +overlapping projections into acct. +*/ +int +dcemergeprojectionlists(NClist* dst, NClist* src) +{ + int i; + NClist* cat = nclistnew(); + int ncstat = NC_NOERR; + +#ifdef DEBUG +fprintf(stderr,"dapmergeprojection: dst = %s\n",dcetostring((DCEnode*)dst)); +fprintf(stderr,"dapmergeprojection: src = %s\n",dcetostring((DCEnode*)src)); +#endif + + /* get dst concat clone(src) */ + nclistsetalloc(cat,nclistlength(dst)+nclistlength(src)); + for(i=0;i 0) { + DCEprojection* target = (DCEprojection*)nclistremove(cat,0); + if(target == NULL) continue; + if(target->discrim != CES_VAR) continue; + for(i=0;idiscrim != CES_VAR) continue; + if(dcesamepath(target->var->segments, + p2->var->segments)!=0) continue; + /* This entry matches our current target; merge */ + ncstat = dcemergeprojections(target,p2); + /* null out this merged entry and release it */ + nclistset(cat,i,(ncelem)NULL); + dcefree((DCEnode*)p2); + } + /* Capture the clone */ + nclistpush(dst,(ncelem)target); + } + nclistfree(cat); + return ncstat; +} + +/* Modify merged projection to include "addition" projection */ +int +dcemergeprojections(DCEprojection* merged, DCEprojection* addition) +{ + int ncstat = NC_NOERR; + int i,j; + + ASSERT((merged->discrim == CES_VAR && addition->discrim == CES_VAR)); + ASSERT((nclistlength(merged->var->segments) == nclistlength(addition->var->segments))); + for(i=0;ivar->segments);i++) { + DCEsegment* mergedseg = (DCEsegment*)nclistget(merged->var->segments,i); + DCEsegment* addedseg = (DCEsegment*)nclistget(addition->var->segments,i); + /* If one segment has larger rank, then copy the extra slices unchanged */ + for(j=0;jrank;j++) { + if(j < mergedseg->rank) + dceslicemerge(mergedseg->slices+j,addedseg->slices+j); + else + mergedseg->slices[j] = addedseg->slices[j]; + } + if(addedseg->rank > mergedseg->rank) + mergedseg->rank = addedseg->rank; + } + return ncstat; +} + +/* Convert a DCEprojection instance into a string + that can be used with the url +*/ + +char* +buildprojectionstring(NClist* projections) +{ + char* pstring; + NCbytes* buf = ncbytesnew(); + dcelisttobuffer(projections,buf,","); + pstring = ncbytesdup(buf); + ncbytesfree(buf); + return pstring; +} + +char* +buildselectionstring(NClist* selections) +{ + NCbytes* buf = ncbytesnew(); + char* sstring; + dcelisttobuffer(selections,buf,","); + sstring = ncbytesdup(buf); + ncbytesfree(buf); + return sstring; +} + +char* +buildconstraintstring(DCEconstraint* constraints) +{ + NCbytes* buf = ncbytesnew(); + char* result = NULL; + dcetobuffer((DCEnode*)constraints,buf); + result = ncbytesdup(buf); + ncbytesfree(buf); + return result; +} + +DCEnode* +dceclone(DCEnode* node) +{ + DCEnode* result = NULL; + + result = (DCEnode*)dcecreate(node->sort); + if(result == NULL) goto done; + + switch (node->sort) { + + case CES_SLICE: { + DCEslice* clone = (DCEslice*)result; + DCEslice* orig = (DCEslice*)node; + *clone = *orig; + } break; + + case CES_SEGMENT: { + DCEsegment* clone = (DCEsegment*)result; + DCEsegment* orig = (DCEsegment*)node; + *clone = *orig; + clone->name = nulldup(orig->name); + if(orig->rank > 0) + memcpy(clone->slices,orig->slices,orig->rank*sizeof(DCEslice)); + } break; + + case CES_VAR: { + DCEvar* clone = (DCEvar*)result; + DCEvar* orig = (DCEvar*)node; + *clone = *orig; + clone->segments = dceclonelist(clone->segments); + } break; + + case CES_FCN: { + DCEfcn* clone = (DCEfcn*)result; + DCEfcn* orig = (DCEfcn*)node; + *clone = *orig; + clone->name = nulldup(orig->name); + clone->args = dceclonelist(orig->args); + } break; + + case CES_CONST: { + DCEconstant* clone = (DCEconstant*)result; + DCEconstant* orig = (DCEconstant*)node; + *clone = *orig; + if(clone->discrim == CES_STR) + clone->text = nulldup(clone->text); + } break; + + case CES_VALUE: { + DCEvalue* clone = (DCEvalue*)result; + DCEvalue* orig = (DCEvalue*)node; + *clone = *orig; + switch (clone->discrim) { + case CES_CONST: + clone->constant = (DCEconstant*)dceclone((DCEnode*)orig->constant); break; + case CES_VAR: + clone->var = (DCEvar*)dceclone((DCEnode*)orig->var); break; + case CES_FCN: + clone->fcn = (DCEfcn*)dceclone((DCEnode*)orig->fcn); break; + default: assert(0); + } + } break; + + case CES_PROJECT: { + DCEprojection* clone = (DCEprojection*)result; + DCEprojection* orig = (DCEprojection*)node; + *clone = *orig; + switch (orig->discrim) { + case CES_VAR: + clone->var = (DCEvar*)dceclone((DCEnode*)orig->var); break; + case CES_FCN: + clone->fcn = (DCEfcn*)dceclone((DCEnode*)orig->fcn); break; + default: assert(0); + } + } break; + + case CES_SELECT: { + DCEselection* clone = (DCEselection*)result; + DCEselection* orig = (DCEselection*)node; + *clone = *orig; + clone->lhs = (DCEvalue*)dceclone((DCEnode*)orig->lhs); + clone->rhs = dceclonelist(orig->rhs); + } break; + + case CES_CONSTRAINT: { + DCEconstraint* clone = (DCEconstraint*)result; + DCEconstraint* orig = (DCEconstraint*)node; + *clone = *orig; + clone->projections = dceclonelist(orig->projections); + clone->selections = dceclonelist(orig->selections); + } break; + + default: + assert(0); + } + +done: + return result; +} + +NClist* +dceclonelist(NClist* list) +{ + int i; + NClist* clone; + if(list == NULL) return NULL; + clone = nclistnew(); + for(i=0;isort) { + + case CES_VAR: { + DCEvar* target = (DCEvar*)node; + dcefreelist(target->segments); + } break; + + case CES_FCN: { + DCEfcn* target = (DCEfcn*)node; + dcefreelist(target->args); + nullfree(target->name); + } break; + + case CES_CONST: { + DCEconstant* target = (DCEconstant*)node; + if(target->discrim == CES_STR) + nullfree(target->text); + } break; + + case CES_VALUE: { + DCEvalue* target = (DCEvalue*)node; + switch(target->discrim) { + case CES_CONST: dcefree((DCEnode*)target->constant); break; + case CES_VAR: dcefree((DCEnode*)target->var); break; + case CES_FCN: dcefree((DCEnode*)target->fcn); break; + default: assert(0); + } + } break; + + case CES_PROJECT: { + DCEprojection* target = (DCEprojection*)node; + switch (target->discrim) { + case CES_VAR: dcefree((DCEnode*)target->var); break; + case CES_FCN: dcefree((DCEnode*)target->fcn); break; + default: assert(0); + } + } break; + + case CES_SELECT: { + DCEselection* target = (DCEselection*)node; + dcefreelist(target->rhs); + dcefree((DCEnode*)target->lhs); + } break; + + case CES_CONSTRAINT: { + DCEconstraint* target = (DCEconstraint*)node; + dcefreelist(target->projections); + dcefreelist(target->selections); + } break; + + case CES_SEGMENT: { + DCEsegment* target = (DCEsegment*)node; + target->rank = 0; + nullfree(target->name); + } break; + + case CES_SLICE: { + } break; + + default: + assert(0); + } + + /* final action */ + free(node); +} + +void +dcefreelist(NClist* list) +{ + int i; + if(list == NULL) return; + for(i=0;i"); return;} + + switch (node->sort) { + + case CES_SLICE: { + DCEslice* slice = (DCEslice*)node; + size_t last = (slice->first+slice->length)-1; + if(slice->count == 1) { + snprintf(tmp,sizeof(tmp),"[%lu%s]", + (unsigned long)slice->first,dimdecl(slice->declsize)); + } else if(slice->stride == 1) { + snprintf(tmp,sizeof(tmp),"[%lu:%lu%s]", + (unsigned long)slice->first, + (unsigned long)last, + dimdecl(slice->declsize)); + } else { + snprintf(tmp,sizeof(tmp),"[%lu:%lu:%lu%s]", + (unsigned long)slice->first, + (unsigned long)slice->stride, + (unsigned long)last, + dimdecl(slice->declsize)); + } + ncbytescat(buf,tmp); + } break; + + case CES_SEGMENT: { + DCEsegment* segment = (DCEsegment*)node; + int rank = segment->rank; + char* name = (segment->name?segment->name:""); + name = nulldup(name); + ncbytescat(buf,name); + nullfree(name); + if(dceverbose && dceiswholesegment(segment)) + ncbytescat(buf,"*"); + if(dceverbose || !dceiswholesegment(segment)) { + for(i=0;islices+i; + dcetobuffer((DCEnode*)slice,buf); + } + } + } break; + + case CES_VAR: { + DCEvar* var = (DCEvar*)node; + dcelisttobuffer(var->segments,buf,"."); + } break; + + case CES_FCN: { + DCEfcn* fcn = (DCEfcn*)node; + ncbytescat(buf,fcn->name); + ncbytescat(buf,"("); + dcelisttobuffer(fcn->args,buf,","); + ncbytescat(buf,")"); + } break; + + case CES_CONST: { + DCEconstant* value = (DCEconstant*)node; + switch (value->discrim) { + case CES_STR: + ncbytescat(buf,value->text); + break; + case CES_INT: + snprintf(tmp,sizeof(tmp),"%lld",value->intvalue); + ncbytescat(buf,tmp); + break; + case CES_FLOAT: + snprintf(tmp,sizeof(tmp),"%g",value->floatvalue); + ncbytescat(buf,tmp); + break; + default: assert(0); + } + } break; + + case CES_VALUE: { + DCEvalue* value = (DCEvalue*)node; + switch (value->discrim) { + case CES_CONST: + dcetobuffer((DCEnode*)value->constant,buf); + break; + case CES_VAR: + dcetobuffer((DCEnode*)value->var,buf); + break; + case CES_FCN: + dcetobuffer((DCEnode*)value->fcn,buf); + break; + default: assert(0); + } + } break; + + case CES_PROJECT: { + DCEprojection* target = (DCEprojection*)node; + switch (target->discrim) { + case CES_VAR: + dcetobuffer((DCEnode*)target->var,buf); + break; + case CES_FCN: dcetobuffer((DCEnode*)target->fcn,buf); break; + default: assert(0); + } + } break; + + case CES_SELECT: { + DCEselection* sel = (DCEselection*)node; + dcetobuffer((DCEnode*)sel->lhs,buf); + if(sel->operator == CES_NIL) break; + ncbytescat(buf,opstrings[(int)sel->operator]); + if(nclistlength(sel->rhs) > 1) + ncbytescat(buf,"{"); + dcelisttobuffer(sel->rhs,buf,","); + if(nclistlength(sel->rhs) > 1) + ncbytescat(buf,"}"); + } break; + + case CES_CONSTRAINT: { + DCEconstraint* con = (DCEconstraint*)node; + if(con->projections != NULL && nclistlength(con->projections) > 0) { + dcelisttobuffer(con->projections,buf,","); + } + if(con->selections != NULL && nclistlength(con->selections) > 0) { + ncbytescat(buf,"&"); /* because & is really a prefix */ + dcelisttobuffer(con->selections,buf,"&"); + } + } break; + + case CES_NIL: { + ncbytescat(buf,""); + } break; + + default: + assert(0); + } +} + +char* +dcelisttostring(NClist* list, char* sep) +{ + char* s; + NCbytes* buf = ncbytesnew(); + dcelisttobuffer(list,buf,sep); + s = ncbytesextract(buf); + ncbytesfree(buf); + return s; +} + +void +dcelisttobuffer(NClist* list, NCbytes* buf, char* sep) +{ + int i; + if(list == NULL || buf == NULL) return; + if(sep == NULL) sep = ","; + for(i=0;i0) ncbytescat(buf,sep); + dcetobuffer((DCEnode*)node,buf); + } +} + +/* Collect all nodes within a specified constraint tree */ +/* Caller frees result */ +NClist* +dceallnodes(DCEnode* node, CEsort which) +{ + NClist* allnodes = nclistnew(); + ceallnodesr(node,allnodes,which); + return allnodes; +} + +static void +ceallnodesr(DCEnode* node, NClist* allnodes, CEsort which) +{ + int i; + if(node == NULL) return; + if(nclistcontains(allnodes,(ncelem)node)) return; + if(which == CES_NIL || node->sort == which) + nclistpush(allnodes,(ncelem)node); + switch(node->sort) { + case CES_FCN: { + DCEfcn* fcn = (DCEfcn*)node; + for(i=0;iargs);i++) { + ceallnodesr((DCEnode*)nclistget(fcn->args,i),allnodes,which); + } + } break; + case CES_VAR: { + DCEvar* var = (DCEvar*)node; + for(i=0;isegments);i++) { + ceallnodesr((DCEnode*)nclistget(var->segments,i),allnodes,which); + } + } break; + case CES_VALUE: { + DCEvalue* value = (DCEvalue*)node; + if(value->discrim == CES_VAR) + ceallnodesr((DCEnode*)value->var,allnodes,which); + else if(value->discrim == CES_FCN) + ceallnodesr((DCEnode*)value->fcn,allnodes,which); + else + ceallnodesr((DCEnode*)value->constant,allnodes,which); + } break; + case CES_SELECT: { + DCEselection* selection = (DCEselection*)node; + ceallnodesr((DCEnode*)selection->lhs,allnodes,which); + for(i=0;irhs);i++) + ceallnodesr((DCEnode*)nclistget(selection->rhs,i),allnodes,which); + } break; + case CES_PROJECT: { + DCEprojection* projection = (DCEprojection*)node; + if(projection->discrim == CES_VAR) + ceallnodesr((DCEnode*)projection->var,allnodes,which); + else + ceallnodesr((DCEnode*)projection->fcn,allnodes,which); + } break; + case CES_CONSTRAINT: { + DCEconstraint* constraint = (DCEconstraint*)node; + for(i=0;iprojections);i++) + ceallnodesr((DCEnode*)nclistget(constraint->projections,i),allnodes,which); + for(i=0;iselections);i++) + ceallnodesr((DCEnode*)nclistget(constraint->selections,i),allnodes,which); + } break; + + /* All others have no subnodes */ + default: + break; + } +} + +DCEnode* +dcecreate(CEsort sort) +{ + DCEnode* node = NULL; + + switch (sort) { + + case CES_SLICE: { + DCEslice* target = (DCEslice*)calloc(1,sizeof(DCEslice)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + } break; + + case CES_SEGMENT: { + int i; + DCEsegment* target = (DCEsegment*)calloc(1,sizeof(DCEsegment)); + if(target == NULL) return NULL; + /* Initialize the sort of the slices */ + for(i=0;islices[i].node.sort = CES_SLICE; + node = (DCEnode*)target; + } break; + + case CES_CONST: { + DCEconstant* target = (DCEconstant*)calloc(1,sizeof(DCEconstant)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + target->discrim = CES_NIL; + } break; + + case CES_VALUE: { + DCEvalue* target = (DCEvalue*)calloc(1,sizeof(DCEvalue)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + target->discrim = CES_NIL; + } break; + + case CES_VAR: { + DCEvar* target = (DCEvar*)calloc(1,sizeof(DCEvar)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + } break; + + case CES_FCN: { + DCEfcn* target = (DCEfcn*)calloc(1,sizeof(DCEfcn)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + } break; + + case CES_PROJECT: { + DCEprojection* target = (DCEprojection*)calloc(1,sizeof(DCEprojection)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + } break; + + case CES_SELECT: { + DCEselection* target = (DCEselection*)calloc(1,sizeof(DCEselection)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + target->operator = CEO_NIL; + } break; + + case CES_CONSTRAINT: { + DCEconstraint* target = (DCEconstraint*)calloc(1,sizeof(DCEconstraint)); + if(target == NULL) return NULL; + node = (DCEnode*)target; + } break; + + default: + assert(0); + } + + /* final action */ + node->sort = sort; + return node; +} + +int +dceiswholeslice(DCEslice* slice) +{ + if(slice->first != 0 + || slice->stride != 1 + || slice->stop != slice->declsize) return 0; + return 1; +} + +int +dceiswholesegment(DCEsegment* seg) +{ + int i,whole; + + if(!seg->slicesdefined) return 0; /* actually, we don't know */ + whole = 1; /* assume so */ + for(i=0;irank;i++) { + if(!dceiswholeslice(&seg->slices[i])) {whole = 0; break;} + } + return whole; +} + +void +dcemakewholeslice(DCEslice* slice, size_t declsize) +{ + slice->first = 0; + slice->stride = 1; + slice->length = declsize; + slice->stop = declsize; + slice->declsize = declsize; + slice->count = declsize; +} + +/* Remove slicing from terminal segment of p */ +void +dcemakewholeprojection(DCEprojection* p) +{ + /* Remove the slicing (if any) from the last segment */ + if(p->discrim == CES_VAR && p->var != NULL && p->var->segments != NULL) { + int lastindex = nclistlength(p->var->segments) - 1; + DCEsegment* lastseg = (DCEsegment*)nclistget(p->var->segments,lastindex); + lastseg->rank = 0; + } +} + +int +dcesamepath(NClist* list1, NClist* list2) +{ + int i; + int len = nclistlength(list1); + if(len != nclistlength(list2)) return 0; + for(i=0;iname,s2->name) != 0) return 0; + } + return 1; +} diff --git a/extern/src_netcdf4/dceconstraints.h b/extern/src_netcdf4/dceconstraints.h new file mode 100644 index 0000000..160db42 --- /dev/null +++ b/extern/src_netcdf4/dceconstraints.h @@ -0,0 +1,122 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + *********************************************************************/ +/* $Header$ */ + +#ifndef DCECONSTRAINTS_H +#define DCECONSTRAINTS_H 1 + +#include "ceconstraints.h" + +/* Provide a universal cast type containing common fields */ + +/* Define the common "supertype */ +typedef struct DCEnode { + CEsort sort; +} DCEnode; + +/* The slice structure is assumed common to all uses */ +typedef struct DCEslice { + DCEnode node; + size_t first; + size_t count; + size_t length; /* count*stride */ + size_t stride; + size_t stop; /* == first + count*/ + size_t declsize; /* from defining dimension, if any.*/ +} DCEslice; + +typedef struct DCEsegment { + DCEnode node; + char* name; + int slicesdefined; /*1=>slice counts defined, except declsize*/ + int slicesdeclized; /*1=>slice declsize defined */ + size_t rank; + DCEslice slices[NC_MAX_VAR_DIMS]; + void* annotation; +} DCEsegment; + +typedef struct DCEfcn { + DCEnode node; + char* name; + NClist* args; +} DCEfcn; + +typedef struct DCEvar { + DCEnode node; + NClist* segments; + void* annotation; +} DCEvar; + +typedef struct DCEconstant { + DCEnode node; + CEsort discrim; + char* text; + long long intvalue; + double floatvalue; +} DCEconstant; + +typedef struct DCEvalue { + DCEnode node; + CEsort discrim; + /* Do not bother with a union */ + DCEconstant* constant; + DCEvar* var; + DCEfcn* fcn; +} DCEvalue; + +typedef struct DCEselection { + DCEnode node; + CEsort operator; + DCEvalue* lhs; + NClist* rhs; +} DCEselection; + +typedef struct DCEprojection { + DCEnode node; + CEsort discrim; + /* Do not bother with a union */ + DCEvar* var; + DCEfcn* fcn; +} DCEprojection; + +typedef struct DCEconstraint { + DCEnode node; + NClist* projections; + NClist* selections; +} DCEconstraint; + + +extern int dceparseconstraints(char* constraints, DCEconstraint* DCEonstraint); +extern int dceslicemerge(DCEslice* dst, DCEslice* src); +extern int dcemergeprojectionlists(NClist* dst, NClist* src); + +extern DCEnode* dceclone(DCEnode* node); +extern NClist* dceclonelist(NClist* list); + +extern void dcefree(DCEnode* node); +extern void dcefreelist(NClist* list); + +extern char* dcetostring(DCEnode* node); +extern char* dcelisttostring(NClist* list,char*); +extern void dcetobuffer(DCEnode* node, NCbytes* buf); +extern void dcelisttobuffer(NClist* list, NCbytes* buf,char*); + +extern NClist* dceallnodes(DCEnode* node, CEsort which); + +extern DCEnode* dcecreate(CEsort sort); + +extern void dcemakewholeslice(DCEslice* slice, size_t declsize); +extern void dcemakewholeprojection(DCEprojection*); + +extern int dceiswholesegment(DCEsegment*); +extern int dceiswholeslice(DCEslice*); +extern int dceiswholeseglist(NClist*); +extern int dceiswholeprojection(DCEprojection*); +extern int dcesamepath(NClist* list1, NClist* list2); +extern int dcemergeprojections(DCEprojection* dst, DCEprojection* src); + +extern int dceverbose; + +#endif /*DCECONSTRAINTS_H*/ diff --git a/extern/src_netcdf4/dcelex.c b/extern/src_netcdf4/dcelex.c new file mode 100644 index 0000000..456e520 --- /dev/null +++ b/extern/src_netcdf4/dcelex.c @@ -0,0 +1,216 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include +#include +#include +#include + +#include "netcdf.h" + +#include "nclist.h" +#include "ncbytes.h" +#include "dceconstraints.h" +#include "dceparselex.h" + +/* Forward */ +static void dumptoken(DCElexstate* lexstate); +static int tohex(int c); +static void ceaddyytext(DCElexstate* lex, int c); + +/****************************************************/ +/* Define 1 and > 1st legal characters */ +static char* wordchars1 = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\"; +static char* wordcharsn = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-+_/%\\"; + +/* Number characters */ +static char* numchars1="+-0123456789"; +static char* numcharsn="Ee.+-0123456789"; + +/**************************************************/ + +int +dcelex(YYSTYPE* lvalp, DCEparsestate* state) +{ + DCElexstate* lexstate = state->lexstate; + int token; + int c; + int len; + char* p=lexstate->next; + token = 0; + ncbytesclear(lexstate->yytext); + ncbytesnull(lexstate->yytext); + p=lexstate->next; + while(token == 0 && (c=*p)) { + if(c <= ' ' || c >= '\177') {p++; continue;} + if(c == '"') { + int more = 1; + /* We have a SCAN_STRINGCONST */ + while(more && (c=*(++p))) { + switch (c) { + case '"': p++; more=0; break; + case '\\': + c=*(++p); + switch (c) { + case 'r': c = '\r'; break; + case 'n': c = '\n'; break; + case 'f': c = '\f'; break; + case 't': c = '\t'; break; + case 'x': { + int d1,d2; + c = '?'; + ++p; + d1 = tohex(*p++); + if(d1 < 0) { + dceerror(state,"Illegal \\xDD in SCAN_STRING"); + } else { + d2 = tohex(*p++); + if(d2 < 0) { + dceerror(state,"Illegal \\xDD in SCAN_STRING"); + } else { + c=(((unsigned int)d1)<<4) | (unsigned int)d2; + } + } + } break; + default: break; + } + break; + default: break; + } + ceaddyytext(lexstate,c); + } + token=SCAN_STRINGCONST; + } else if(strchr(numchars1,c) != NULL) { + /* we might have a SCAN_NUMBERCONST */ + int isnumber = 0; + char* yytext; + char* endpoint; + ceaddyytext(lexstate,c); + for(p++;(c=*p);p++) { + if(strchr(numcharsn,c) == NULL) break; + ceaddyytext(lexstate,c); + } + /* See if this is a number */ + ncbytesnull(lexstate->yytext); + yytext = ncbytescontents(lexstate->yytext); + (void)strtoll(yytext,&endpoint,10); + if(*yytext != '\0' && *endpoint == '\0') + isnumber = 1; + else { + (void)strtod(yytext,&endpoint); + if(*yytext != '\0' && *endpoint == '\0') + isnumber = 1; /* maybe */ + } + /* A number followed by an id char is assumed to just be + a funny id */ + if(isnumber && (*p == '\0' || strchr(wordcharsn,*p) == NULL)) { + token = SCAN_NUMBERCONST; + } else { + /* Now, if the funny word has a "." in it, + we have to back up to that dot */ + char* dotpoint = strchr(yytext,'.'); + if(dotpoint != NULL) { + p = dotpoint; + *dotpoint = '\0'; + } + token = SCAN_WORD; + } + } else if(strchr(wordchars1,c) != NULL) { + /* we have a SCAN_WORD */ + ceaddyytext(lexstate,c); + for(p++;(c=*p);p++) { + if(strchr(wordcharsn,c) == NULL) break; + ceaddyytext(lexstate,c); + } + token=SCAN_WORD; + } else { + /* we have a single char token */ + token = c; + ceaddyytext(lexstate,c); + p++; + } + } + lexstate->next = p; + len = ncbyteslength(lexstate->yytext); + if(len > MAX_TOKEN_LENGTH) len = MAX_TOKEN_LENGTH; + strncpy(lexstate->lasttokentext,ncbytescontents(lexstate->yytext),len); + lexstate->lasttokentext[len] = '\0'; + lexstate->lasttoken = token; + if(dcedebug) dumptoken(lexstate); + + /*Put return value onto Bison stack*/ + + if(ncbyteslength(lexstate->yytext) == 0) + *lvalp = NULL; + else { + *lvalp = ncbytesdup(lexstate->yytext); + nclistpush(lexstate->reclaim,(ncelem)*lvalp); + } + + return token; +} + +static void +ceaddyytext(DCElexstate* lex, int c) +{ + ncbytesappend(lex->yytext,(char)c); +} + +static int +tohex(int c) +{ + if(c >= 'a' && c <= 'f') return (c - 'a') + 0xa; + if(c >= 'A' && c <= 'F') return (c - 'A') + 0xa; + if(c >= '0' && c <= '9') return (c - '0'); + return -1; +} + +static void +dumptoken(DCElexstate* lexstate) +{ + switch (lexstate->lasttoken) { + case SCAN_STRINGCONST: + fprintf(stderr,"TOKEN = |\"%s\"|\n",lexstate->lasttokentext); + break; + case SCAN_WORD: + case SCAN_NUMBERCONST: + default: + fprintf(stderr,"TOKEN = |%s|\n",lexstate->lasttokentext); + break; + } +} + +void +dcelexinit(char* input, DCElexstate** lexstatep) +{ + DCElexstate* lexstate = (DCElexstate*)malloc(sizeof(DCElexstate)); + if(lexstatep) *lexstatep = lexstate; + if(lexstate == NULL) return; + memset((void*)lexstate,0,sizeof(DCElexstate)); + lexstate->input = strdup(input); + lexstate->next = lexstate->input; + lexstate->yytext = ncbytesnew(); + lexstate->reclaim = nclistnew(); +} + +void +dcelexcleanup(DCElexstate** lexstatep) +{ + DCElexstate* lexstate = *lexstatep; + if(lexstate == NULL) return; + if(lexstate->input != NULL) free(lexstate->input); + if(lexstate->reclaim != NULL) { + while(nclistlength(lexstate->reclaim) > 0) { + char* word = (char*)nclistpop(lexstate->reclaim); + if(word) free(word); + } + nclistfree(lexstate->reclaim); + } + ncbytesfree(lexstate->yytext); + free(lexstate); + *lexstatep = NULL; +} + diff --git a/extern/src_netcdf4/dceparse.c b/extern/src_netcdf4/dceparse.c new file mode 100644 index 0000000..9e7c941 --- /dev/null +++ b/extern/src_netcdf4/dceparse.c @@ -0,0 +1,397 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +/* Parser actions for constraint expressions */ + +/* Since oc does not use the constraint parser, + they functions all just abort if called. +*/ + +#include "config.h" +#include +#include +#include +#include + +#include "netcdf.h" + +#include "nclist.h" +#include "ncbytes.h" +#include "dceconstraints.h" +#include "dceparselex.h" + +static Object collectlist(Object list0, Object decl); + +void +projections(DCEparsestate* state, Object list0) +{ + NClist* list = (NClist*)list0; + if(list != NULL) { + nclistfree(state->constraint->projections); + state->constraint->projections = list; + } +#ifdef DEBUG +fprintf(stderr," ce.projections: %s\n", + dcetostring((DCEnode*)state->constraint->projections)); +#endif +} + +void +selections(DCEparsestate* state, Object list0) +{ + NClist* list = (NClist*)list0; + if(list != NULL) { + nclistfree(state->constraint->selections); + state->constraint->selections = list; + } +#ifdef DEBUG +fprintf(stderr," ce.selections: %s\n", + dcetostring((DCEnode*)state->constraint->selections)); +#endif +} + + +Object +projectionlist(DCEparsestate* state, Object list0, Object decl) +{ + return collectlist(list0,decl); +} + +Object +projection(DCEparsestate* state, Object varorfcn) +{ + DCEprojection* p = (DCEprojection*)dcecreate(CES_PROJECT); + CEsort tag = *(CEsort*)varorfcn; + if(tag == CES_FCN) + p->fcn = varorfcn; + else + p->var = varorfcn; + p->discrim = tag; +#ifdef DEBUG +fprintf(stderr," ce.projection: %s\n", + dcetostring((DCEnode*)p)); +#endif + return p; +} + +Object +segmentlist(DCEparsestate* state, Object var0, Object decl) +{ + /* watch out: this is non-standard */ + NClist* list; + DCEvar* v = (DCEvar*)var0; + if(v==NULL) v = (DCEvar*)dcecreate(CES_VAR); + list = v->segments; + if(list == NULL) list = nclistnew(); + nclistpush(list,(ncelem)decl); + v->segments = list; + return v; +} + +Object +segment(DCEparsestate* state, Object name, Object slices0) +{ + int i; + DCEsegment* segment = (DCEsegment*)dcecreate(CES_SEGMENT); + NClist* slices = (NClist*)slices0; + segment->name = strdup((char*)name); + if(slices != NULL && nclistlength(slices) > 0) { + segment->rank = nclistlength(slices); + segment->slicesdefined = 1; /* but not declsizes */ + for(i=0;islices[i] = *slice; + free(slice); + } + nclistfree(slices); + } else + segment->slicesdefined = 0; +#ifdef DEBUG +fprintf(stderr," ce.segment: %s\n", + dumpsegment(segment)); +#endif + return segment; +} + + +Object +rangelist(DCEparsestate* state, Object list0, Object decl) +{ + return collectlist(list0,decl); +} + +Object +range(DCEparsestate* state, Object sfirst, Object sstride, Object slast) +{ + DCEslice* slice = (DCEslice*)dcecreate(CES_SLICE); + unsigned long first,stride,last; + + /* Note: that incoming arguments are strings; we must convert to size_t; + but we do know they are legal integers or NULL */ + sscanf((char*)sfirst,"%lu",&first); /* always defined */ + if(slast != NULL) + sscanf((char*)slast,"%lu",&last); + else + last = first; + if(sstride != NULL) + sscanf((char*)sstride,"%lu",&stride); + else + stride = 1; /* default */ + + if(stride == 0) + dceerror(state,"Illegal index for range stride"); + if(last < first) + dceerror(state,"Illegal index for range last index"); + slice->first = first; + slice->stride = stride; + slice->stop = last + 1; + slice->length = slice->stop - slice->first; + slice->count = slice->length / slice->stride; +#ifdef DEBUG +fprintf(stderr," ce.slice: %s\n", + dumpslice(slice)); +#endif + return slice; +} + +Object +range1(DCEparsestate* state, Object rangenumber) +{ + int range = -1; + sscanf((char*)rangenumber,"%u",&range); + if(range < 0) { + dceerror(state,"Illegal range index"); + } + return rangenumber; +} + +Object +clauselist(DCEparsestate* state, Object list0, Object decl) +{ + return collectlist(list0,decl); +} + +Object +sel_clause(DCEparsestate* state, int selcase, + Object lhs, Object relop0, Object values) +{ + DCEselection* sel = (DCEselection*)dcecreate(CES_SELECT); + sel->operator = (CEsort)relop0; + sel->lhs = (DCEvalue*)lhs; + if(selcase == 2) {/*singleton value*/ + sel->rhs = nclistnew(); + nclistpush(sel->rhs,(ncelem)values); + } else + sel->rhs = (NClist*)values; + return sel; +} + +Object +indexpath(DCEparsestate* state, Object list0, Object index) +{ + return collectlist(list0,index); +} + +Object +array_indices(DCEparsestate* state, Object list0, Object indexno) +{ + DCEslice* slice; + long long start = -1; + NClist* list = (NClist*)list0; + if(list == NULL) list = nclistnew(); + sscanf((char*)indexno,"%lld",&start); + if(start < 0) { + dceerror(state,"Illegal array index"); + start = 1; + } + slice = (DCEslice*)dcecreate(CES_SLICE); + slice->first = start; + slice->stride = 1; + slice->count = 1; + slice->length = 1; + slice->stop = start+1; + nclistpush(list,(ncelem)slice); + return list; +} + +Object +indexer(DCEparsestate* state, Object name, Object indices) +{ + int i; + NClist* list = (NClist*)indices; + DCEsegment* seg = (DCEsegment*)dcecreate(CES_SEGMENT); + seg->name = strdup((char*)name); + for(i=0;islices[i] = *slice; + free(slice); + } + nclistfree(indices); + return seg; +} + +Object +function(DCEparsestate* state, Object fcnname, Object args) +{ + DCEfcn* fcn = (DCEfcn*)dcecreate(CES_FCN); + fcn->name = nulldup((char*)fcnname); + fcn->args = args; + return fcn; +} + +Object +arg_list(DCEparsestate* state, Object list0, Object decl) +{ + return collectlist(list0,decl); +} + + +Object +value_list(DCEparsestate* state, Object list0, Object decl) +{ + return collectlist(list0,decl); +} + +Object +value(DCEparsestate* state, Object val) +{ + DCEvalue* ncvalue = (DCEvalue*)dcecreate(CES_VALUE); + CEsort tag = *(CEsort*)val; + switch (tag) { + case CES_VAR: ncvalue->var = (DCEvar*)val; break; + case CES_FCN: ncvalue->fcn = (DCEfcn*)val; break; + case CES_CONST: ncvalue->constant = (DCEconstant*)val; break; + default: abort(); break; + } + ncvalue->discrim = tag; + return ncvalue; +} + +Object +var(DCEparsestate* state, Object indexpath) +{ + DCEvar* v = (DCEvar*)dcecreate(CES_VAR); + v->segments = (NClist*)indexpath; + return v; +} + +Object +constant(DCEparsestate* state, Object val, int tag) +{ + DCEconstant* con = (DCEconstant*)dcecreate(CES_CONST); + char* text = (char*)val; + char* endpoint = NULL; + switch (tag) { + case SCAN_STRINGCONST: + con->discrim = CES_STR; + con->text = nulldup(text); + break; + case SCAN_NUMBERCONST: + con->intvalue = strtoll(text,&endpoint,10); + if(*text != '\0' && *endpoint == '\0') { + con->discrim = CES_INT; + } else { + con->floatvalue = strtod(text,&endpoint); + if(*text != '\0' && *endpoint == '\0') + con->discrim = CES_FLOAT; + else abort(); + } + break; + default: abort(); break; + } + return con; +} + +static Object +collectlist(Object list0, Object decl) +{ + NClist* list = (NClist*)list0; + if(list == NULL) list = nclistnew(); + nclistpush(list,(ncelem)decl); + return list; +} + +Object +makeselectiontag(CEsort tag) +{ + return (Object) tag; +} + +int +dceerror(DCEparsestate* state, char* msg) +{ + strcpy(state->errorbuf,msg); + state->errorcode=1; + return 0; +} + +static void +dce_parse_cleanup(DCEparsestate* state) +{ + dcelexcleanup(&state->lexstate); /* will free */ +} + +static DCEparsestate* +ce_parse_init(char* input, DCEconstraint* constraint) +{ + DCEparsestate* state = NULL; + if(input==NULL) { + dceerror(state,"ce_parse_init: no input buffer"); + } else { + state = (DCEparsestate*)calloc(1,sizeof(DCEparsestate)); + if(state==NULL) return (DCEparsestate*)NULL; + state->errorbuf[0] = '\0'; + state->errorcode = 0; + dcelexinit(input,&state->lexstate); + state->constraint = constraint; + } + return state; +} + +#ifdef PARSEDEBUG +extern int dcedebug; +#endif + +/* Wrapper for ceparse */ +int +dapceparse(char* input, DCEconstraint* constraint, char** errmsgp) +{ + DCEparsestate* state; + int errcode = 0; + +#ifdef PARSEDEBUG +dcedebug = 1; +#endif + + if(input != NULL) { +#ifdef DEBUG +fprintf(stderr,"dceeparse: input=%s\n",input); +#endif + state = ce_parse_init(input,constraint); + if(dceparse(state) == 0) { +#ifdef DEBUG +if(nclistlength(constraint->projections) > 0) +fprintf(stderr,"dceeparse: projections=%s\n", + dcetostring((DCEnode*)constraint->projections)); +#endif +#ifdef DEBUG +if(nclistlength(constraint->selections) > 0) +fprintf(stderr,"dceeparse: selections=%s\n", + dumpselections(constraint->selections)); +#endif + } else { + if(errmsgp) *errmsgp = nulldup(state->errorbuf); + } + errcode = state->errorcode; + dce_parse_cleanup(state); + } + return errcode; +} + +#ifdef PARSEDEBUG +Object +debugobject(Object o) +{ + return o; +} +#endif diff --git a/extern/src_netcdf4/dceparselex.h b/extern/src_netcdf4/dceparselex.h new file mode 100644 index 0000000..07f19d5 --- /dev/null +++ b/extern/src_netcdf4/dceparselex.h @@ -0,0 +1,100 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef DCEPARSELEX_H +#define DCEPARSELEX_H + +#include "config.h" +#include "dcetab.h" + +#ifdef WIN32 +#define strcasecmp stricmp +#define snprintf _snprintf +#endif + +/* For consistency with Java parser */ +#ifndef null +#define null NULL +#endif + +typedef void* Object; + +#define YYSTYPE Object + +#define MAX_TOKEN_LENGTH 1024 + +/*! Specifies DCElexstate. */ +typedef struct DCElexstate { + char* input; + char* next; /* next char in uri.query */ + NCbytes* yytext; + /*! Specifies the Lasttoken. */ + int lasttoken; + char lasttokentext[MAX_TOKEN_LENGTH+1]; /* leave room for trailing null */ + NClist* reclaim; /* reclaim SCAN_WORD instances */ +} DCElexstate; + +/*! Specifies DCEparsestate. */ +typedef struct DCEparsestate { + DCEconstraint* constraint; + char errorbuf[1024]; + int errorcode; + DCElexstate* lexstate; +} DCEparsestate; + +/* Define a generic object carrier; this serves + essentially the same role as the typical bison %union + declaration +*/ + + +extern int ceerror(DCEparsestate*,char*); +extern void ce_parse_error(DCEparsestate*,const char *fmt, ...); + +/* bison parse entry point */ +extern int dceparse(DCEparsestate*); + +extern int dceerror(DCEparsestate* state, char* msg); +extern void projections(DCEparsestate* state, Object list0); +extern void selections(DCEparsestate* state, Object list0); +extern Object projectionlist(DCEparsestate* state, Object list0, Object decl); +extern Object projection(DCEparsestate* state, Object segmentlist); +extern Object segmentlist(DCEparsestate* state, Object list0, Object decl); +extern Object segment(DCEparsestate* state, Object name, Object slices0); +extern Object array_indices(DCEparsestate* state, Object list0, Object decl); +extern Object range(DCEparsestate* state, Object, Object, Object); +extern Object selectionlist(DCEparsestate* state, Object list0, Object decl); +extern Object sel_clause(DCEparsestate* state, int selcase, Object path0, Object relop0, Object values); +extern Object selectionpath(DCEparsestate* state, Object list0, Object text); +extern Object arrayelement(DCEparsestate* state, Object name, Object index); +extern Object function(DCEparsestate* state, Object fcnname, Object args); +extern Object arg_list(DCEparsestate* state, Object list0, Object decl); +extern Object value_list(DCEparsestate* state, Object list0, Object decl); +extern Object value(DCEparsestate* state, Object value); +extern Object makeselectiontag(CEsort); +extern Object indexer(DCEparsestate* state, Object name, Object indices); +extern Object indexpath(DCEparsestate* state, Object list0, Object index); +extern Object var(DCEparsestate* state, Object indexpath); +extern Object constant(DCEparsestate* state, Object val, int tag); +extern Object clauselist(DCEparsestate* state, Object list0, Object decl); +extern Object range1(DCEparsestate* state, Object rangenumber); +extern Object rangelist(DCEparsestate* state, Object list0, Object decl); + +/* lexer interface */ +extern int dcelex(YYSTYPE*, DCEparsestate*); +extern void dcelexinit(char* input, DCElexstate** lexstatep); +extern void dcelexcleanup(DCElexstate** lexstatep); + +extern int dcedebug; + +#ifdef PARSEDEBUG +extern Object debugobject(Object); +#define checkobject(x) debugobject(x) +#else +#define checkobject(x) (x) +#endif + +extern int dapceparse(char* input, DCEconstraint*, char**); + +#endif /*DCEPARSELEX_H*/ + diff --git a/extern/src_netcdf4/dcetab.c b/extern/src_netcdf4/dcetab.c new file mode 100644 index 0000000..d618a90 --- /dev/null +++ b/extern/src_netcdf4/dcetab.c @@ -0,0 +1,1997 @@ +/* A Bison parser, made by GNU Bison 2.4.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2009, 2010 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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.4.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse dceparse +#define yylex dcelex +#define yyerror dceerror +#define yylval dcelval +#define yychar dcechar +#define yydebug dcedebug +#define yynerrs dcenerrs + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 11 "dce.y" + +#include "config.h" +#include +#include "netcdf.h" +#include "ncbytes.h" +#include "nclist.h" +#include "dceconstraints.h" +#include "dceparselex.h" + + +/* Line 189 of yacc.c */ +#line 93 "dce.tab.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#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 + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + SCAN_WORD = 258, + SCAN_STRINGCONST = 259, + SCAN_NUMBERCONST = 260 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 140 "dce.tab.c" + +#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 /* 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 defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* 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 yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#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 /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* 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 /* 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 /* 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_alloc; + YYSTYPE yyvs_alloc; +}; + +/* 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_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 83 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 22 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 29 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 59 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 87 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 260 + +#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, 20, 2, 2, 2, 2, 14, 2, + 8, 9, 2, 2, 7, 2, 10, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, + 19, 17, 18, 6, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 11, 2, 12, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 15, 2, 16, 21, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 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 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 6, 9, 13, 14, 16, 17, 19, + 21, 23, 27, 29, 31, 35, 40, 42, 46, 48, + 51, 53, 56, 60, 66, 74, 78, 80, 83, 90, + 95, 98, 100, 104, 106, 108, 110, 112, 114, 116, + 118, 122, 124, 127, 129, 132, 136, 141, 143, 147, + 149, 151, 153, 156, 159, 162, 165, 167, 169, 171 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 23, 0, -1, 24, 25, -1, 24, 26, -1, 24, + 25, 26, -1, -1, 6, -1, -1, 27, -1, 35, + -1, 28, -1, 27, 7, 28, -1, 30, -1, 29, + -1, 47, 8, 9, -1, 47, 8, 45, 9, -1, + 31, -1, 30, 10, 31, -1, 48, -1, 48, 32, + -1, 33, -1, 32, 33, -1, 11, 49, 12, -1, + 11, 49, 13, 49, 12, -1, 11, 49, 13, 49, + 13, 49, 12, -1, 11, 49, 12, -1, 36, -1, + 35, 36, -1, 14, 38, 46, 15, 37, 16, -1, + 14, 38, 46, 38, -1, 14, 44, -1, 38, -1, + 37, 7, 38, -1, 40, -1, 29, -1, 39, -1, + 49, -1, 50, -1, 41, -1, 42, -1, 41, 10, + 42, -1, 48, -1, 48, 43, -1, 34, -1, 43, + 34, -1, 47, 8, 9, -1, 47, 8, 45, 9, + -1, 38, -1, 37, 7, 38, -1, 17, -1, 18, + -1, 19, -1, 20, 17, -1, 18, 17, -1, 19, + 17, -1, 17, 21, -1, 48, -1, 3, -1, 5, + -1, 4, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 34, 34, 35, 36, 37, 40, 40, 43, 47, + 51, 53, 58, 60, 65, 67, 72, 74, 79, 81, + 86, 88, 93, 95, 97, 101, 107, 109, 114, 116, + 118, 123, 125, 130, 132, 134, 139, 141, 146, 151, + 153, 158, 160, 165, 167, 172, 174, 179, 181, 186, + 187, 188, 189, 190, 191, 192, 195, 199, 203, 207 +}; +#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", "SCAN_WORD", "SCAN_STRINGCONST", + "SCAN_NUMBERCONST", "'?'", "','", "'('", "')'", "'.'", "'['", "']'", + "':'", "'&'", "'{'", "'}'", "'='", "'>'", "'<'", "'!'", "'~'", "$accept", + "constraints", "optquestionmark", "projections", "selections", + "projectionlist", "projection", "function", "segmentlist", "segment", + "rangelist", "range", "range1", "clauselist", "sel_clause", "value_list", + "value", "constant", "var", "indexpath", "index", "array_indices", + "boolfunction", "arg_list", "rel_op", "ident", "word", "number", + "string", 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, 63, 44, 40, 41, + 46, 91, 93, 58, 38, 123, 125, 61, 62, 60, + 33, 126 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 22, 23, 23, 23, 23, 24, 24, 25, 26, + 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, + 32, 32, 33, 33, 33, 34, 35, 35, 36, 36, + 36, 37, 37, 38, 38, 38, 39, 39, 40, 41, + 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, + 46, 46, 46, 46, 46, 46, 47, 48, 49, 50 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 2, 3, 0, 1, 0, 1, 1, + 1, 3, 1, 1, 3, 4, 1, 3, 1, 2, + 1, 2, 3, 5, 7, 3, 1, 2, 6, 4, + 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 2, 1, 2, 3, 4, 1, 3, 1, + 1, 1, 2, 2, 2, 2, 1, 1, 1, 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 yytype_uint8 yydefact[] = +{ + 7, 6, 0, 0, 1, 57, 0, 2, 3, 8, + 10, 13, 12, 16, 9, 26, 0, 18, 59, 58, + 34, 0, 35, 33, 38, 39, 30, 0, 41, 36, + 37, 4, 0, 0, 27, 0, 0, 19, 20, 49, + 50, 51, 0, 0, 0, 0, 0, 43, 42, 11, + 17, 18, 14, 0, 31, 0, 0, 21, 55, 53, + 54, 52, 0, 29, 40, 41, 14, 0, 0, 44, + 0, 15, 22, 0, 0, 31, 15, 25, 32, 0, + 0, 28, 23, 0, 32, 0, 24 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 7, 8, 9, 10, 20, 12, 13, + 37, 38, 47, 14, 15, 53, 54, 22, 23, 24, + 25, 48, 26, 55, 43, 16, 28, 29, 30 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -36 +static const yytype_int8 yypact[] = +{ + 10, -36, 8, 4, -36, -36, 46, 12, -36, 23, + -36, -36, 44, -36, 12, -36, 7, -2, -36, -36, + -36, 27, -36, -36, 45, -36, -36, 49, 17, -36, + -36, -36, 36, 36, -36, 18, 53, 48, -36, 39, + 50, 51, 52, 9, 36, 31, 53, -36, 54, -36, + -36, 48, -36, 55, 57, 61, 29, -36, -36, -36, + -36, -36, 46, -36, -36, 54, 3, 62, 60, -36, + 46, -36, -36, 53, 13, -36, 5, -36, 64, 40, + 46, -36, -36, 53, -36, 63, -36 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -36, -36, -36, -36, 56, -36, 47, 1, -36, 28, + -36, 41, 32, -36, 67, 14, -6, -36, -36, -36, + 33, -36, -36, 37, -36, 77, -1, -35, -36 +}; + +/* 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 -57 +static const yytype_int8 yytable[] = +{ + 21, 56, 17, -45, 11, -46, -56, 5, 4, 36, + -5, 68, 5, 18, 19, 35, 1, -45, 6, -46, + 80, 5, 18, 19, 62, -56, 6, 52, 46, 81, + 32, 17, 51, 11, 5, 18, 19, 63, 79, 5, + 66, 72, 73, 65, 39, 40, 41, 42, 85, 5, + 18, 19, 82, 83, 33, 44, 75, 45, 19, 36, + 58, 50, 70, 31, 78, 46, -47, 59, 60, 61, + 71, 76, 77, -48, 84, 86, 74, 64, 57, 49, + 69, 34, 67, 27 +}; + +static const yytype_uint8 yycheck[] = +{ + 6, 36, 3, 0, 3, 0, 8, 3, 0, 11, + 0, 46, 3, 4, 5, 8, 6, 14, 14, 14, + 7, 3, 4, 5, 15, 8, 14, 9, 11, 16, + 7, 32, 33, 32, 3, 4, 5, 43, 73, 3, + 9, 12, 13, 44, 17, 18, 19, 20, 83, 3, + 4, 5, 12, 13, 10, 10, 62, 8, 5, 11, + 21, 33, 7, 7, 70, 11, 9, 17, 17, 17, + 9, 9, 12, 9, 80, 12, 62, 44, 37, 32, + 48, 14, 45, 6 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 6, 23, 24, 0, 3, 14, 25, 26, 27, + 28, 29, 30, 31, 35, 36, 47, 48, 4, 5, + 29, 38, 39, 40, 41, 42, 44, 47, 48, 49, + 50, 26, 7, 10, 36, 8, 11, 32, 33, 17, + 18, 19, 20, 46, 10, 8, 11, 34, 43, 28, + 31, 48, 9, 37, 38, 45, 49, 33, 21, 17, + 17, 17, 15, 38, 42, 48, 9, 45, 49, 34, + 7, 9, 12, 13, 37, 38, 9, 12, 38, 49, + 7, 16, 12, 13, 38, 49, 12 +}; + +#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. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif + +#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 (parsestate, 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 defined YYLTYPE_IS_TRIVIAL && 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 (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, parsestate) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* 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, parsestate); \ + 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, DCEparsestate* parsestate) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, parsestate) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + DCEparsestate* parsestate; +#endif +{ + if (!yyvaluep) + return; + YYUSE (parsestate); +# 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, DCEparsestate* parsestate) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, parsestate) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + DCEparsestate* parsestate; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, parsestate); + 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 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + 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, DCEparsestate* parsestate) +#else +static void +yy_reduce_print (yyvsp, yyrule, parsestate) + YYSTYPE *yyvsp; + int yyrule; + DCEparsestate* parsestate; +#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++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , parsestate); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule, parsestate); \ +} 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 + + + +#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 */ + + +/*-----------------------------------------------. +| 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, DCEparsestate* parsestate) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, parsestate) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + DCEparsestate* parsestate; +#endif +{ + YYUSE (yyvaluep); + YYUSE (parsestate); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* 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 (DCEparsestate* parsestate); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#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 (DCEparsestate* parsestate) +#else +int +yyparse (parsestate) + DCEparsestate* parsestate; +#endif +#endif +{ +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + 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_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, 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)); + + if (yystate == YYFINAL) + YYACCEPT; + + 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. */ + + /* 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); + 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; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + 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 8: + +/* Line 1464 of yacc.c */ +#line 43 "dce.y" + {projections(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 9: + +/* Line 1464 of yacc.c */ +#line 47 "dce.y" + {selections(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 10: + +/* Line 1464 of yacc.c */ +#line 52 "dce.y" + {(yyval)=projectionlist(parsestate,(Object)null,(yyvsp[(1) - (1)]));;} + break; + + case 11: + +/* Line 1464 of yacc.c */ +#line 54 "dce.y" + {(yyval)=projectionlist(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]));;} + break; + + case 12: + +/* Line 1464 of yacc.c */ +#line 59 "dce.y" + {(yyval)=projection(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 13: + +/* Line 1464 of yacc.c */ +#line 61 "dce.y" + {(yyval)=(yyvsp[(1) - (1)]);;} + break; + + case 14: + +/* Line 1464 of yacc.c */ +#line 66 "dce.y" + {(yyval)=function(parsestate,(yyvsp[(1) - (3)]),null);;} + break; + + case 15: + +/* Line 1464 of yacc.c */ +#line 68 "dce.y" + {(yyval)=function(parsestate,(yyvsp[(1) - (4)]),(yyvsp[(3) - (4)]));;} + break; + + case 16: + +/* Line 1464 of yacc.c */ +#line 73 "dce.y" + {(yyval)=segmentlist(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 17: + +/* Line 1464 of yacc.c */ +#line 75 "dce.y" + {(yyval)=segmentlist(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]));;} + break; + + case 18: + +/* Line 1464 of yacc.c */ +#line 80 "dce.y" + {(yyval)=segment(parsestate,(yyvsp[(1) - (1)]),null);;} + break; + + case 19: + +/* Line 1464 of yacc.c */ +#line 82 "dce.y" + {(yyval)=segment(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 20: + +/* Line 1464 of yacc.c */ +#line 87 "dce.y" + {(yyval)=rangelist(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 21: + +/* Line 1464 of yacc.c */ +#line 89 "dce.y" + {(yyval)=rangelist(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 22: + +/* Line 1464 of yacc.c */ +#line 94 "dce.y" + {(yyval)=range(parsestate,(yyvsp[(2) - (3)]),null,null);;} + break; + + case 23: + +/* Line 1464 of yacc.c */ +#line 96 "dce.y" + {(yyval)=range(parsestate,(yyvsp[(2) - (5)]),null,(yyvsp[(4) - (5)]));;} + break; + + case 24: + +/* Line 1464 of yacc.c */ +#line 98 "dce.y" + {(yyval)=range(parsestate,(yyvsp[(2) - (7)]),(yyvsp[(4) - (7)]),(yyvsp[(6) - (7)]));;} + break; + + case 25: + +/* Line 1464 of yacc.c */ +#line 102 "dce.y" + {(yyval) = range1(parsestate,(yyvsp[(2) - (3)]));;} + break; + + case 26: + +/* Line 1464 of yacc.c */ +#line 108 "dce.y" + {(yyval)=clauselist(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 27: + +/* Line 1464 of yacc.c */ +#line 110 "dce.y" + {(yyval)=clauselist(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 28: + +/* Line 1464 of yacc.c */ +#line 115 "dce.y" + {(yyval)=sel_clause(parsestate,1,(yyvsp[(2) - (6)]),(yyvsp[(3) - (6)]),(yyvsp[(5) - (6)]));;} + break; + + case 29: + +/* Line 1464 of yacc.c */ +#line 117 "dce.y" + {(yyval)=sel_clause(parsestate,2,(yyvsp[(2) - (4)]),(yyvsp[(3) - (4)]),(yyvsp[(4) - (4)]));;} + break; + + case 30: + +/* Line 1464 of yacc.c */ +#line 119 "dce.y" + {(yyval)=(yyvsp[(1) - (2)]);;} + break; + + case 31: + +/* Line 1464 of yacc.c */ +#line 124 "dce.y" + {(yyval)=value_list(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 32: + +/* Line 1464 of yacc.c */ +#line 126 "dce.y" + {(yyval)=value_list(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]));;} + break; + + case 33: + +/* Line 1464 of yacc.c */ +#line 131 "dce.y" + {(yyval)=value(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 34: + +/* Line 1464 of yacc.c */ +#line 133 "dce.y" + {(yyval)=value(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 35: + +/* Line 1464 of yacc.c */ +#line 135 "dce.y" + {(yyval)=value(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 36: + +/* Line 1464 of yacc.c */ +#line 140 "dce.y" + {(yyval)=constant(parsestate,(yyvsp[(1) - (1)]),SCAN_NUMBERCONST);;} + break; + + case 37: + +/* Line 1464 of yacc.c */ +#line 142 "dce.y" + {(yyval)=constant(parsestate,(yyvsp[(1) - (1)]),SCAN_STRINGCONST);;} + break; + + case 38: + +/* Line 1464 of yacc.c */ +#line 147 "dce.y" + {(yyval)=var(parsestate,(yyvsp[(1) - (1)]));;} + break; + + case 39: + +/* Line 1464 of yacc.c */ +#line 152 "dce.y" + {(yyval)=indexpath(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 40: + +/* Line 1464 of yacc.c */ +#line 154 "dce.y" + {(yyval)=indexpath(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]));;} + break; + + case 41: + +/* Line 1464 of yacc.c */ +#line 159 "dce.y" + {(yyval)=indexer(parsestate,(yyvsp[(1) - (1)]),null);;} + break; + + case 42: + +/* Line 1464 of yacc.c */ +#line 161 "dce.y" + {(yyval)=indexer(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 43: + +/* Line 1464 of yacc.c */ +#line 166 "dce.y" + {(yyval)=array_indices(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 44: + +/* Line 1464 of yacc.c */ +#line 168 "dce.y" + {(yyval)=array_indices(parsestate,(yyvsp[(1) - (2)]),(yyvsp[(2) - (2)]));;} + break; + + case 45: + +/* Line 1464 of yacc.c */ +#line 173 "dce.y" + {(yyval)=function(parsestate,(yyvsp[(1) - (3)]),null);;} + break; + + case 46: + +/* Line 1464 of yacc.c */ +#line 175 "dce.y" + {(yyval)=function(parsestate,(yyvsp[(1) - (4)]),(yyvsp[(3) - (4)]));;} + break; + + case 47: + +/* Line 1464 of yacc.c */ +#line 180 "dce.y" + {(yyval)=arg_list(parsestate,null,(yyvsp[(1) - (1)]));;} + break; + + case 48: + +/* Line 1464 of yacc.c */ +#line 182 "dce.y" + {(yyval)=arg_list(parsestate,(yyvsp[(1) - (3)]),(yyvsp[(3) - (3)]));;} + break; + + case 49: + +/* Line 1464 of yacc.c */ +#line 186 "dce.y" + {(yyval)=makeselectiontag(CEO_EQ);;} + break; + + case 50: + +/* Line 1464 of yacc.c */ +#line 187 "dce.y" + {(yyval)=makeselectiontag(CEO_GT);;} + break; + + case 51: + +/* Line 1464 of yacc.c */ +#line 188 "dce.y" + {(yyval)=makeselectiontag(CEO_LT);;} + break; + + case 52: + +/* Line 1464 of yacc.c */ +#line 189 "dce.y" + {(yyval)=makeselectiontag(CEO_NEQ);;} + break; + + case 53: + +/* Line 1464 of yacc.c */ +#line 190 "dce.y" + {(yyval)=makeselectiontag(CEO_GE);;} + break; + + case 54: + +/* Line 1464 of yacc.c */ +#line 191 "dce.y" + {(yyval)=makeselectiontag(CEO_LE);;} + break; + + case 55: + +/* Line 1464 of yacc.c */ +#line 192 "dce.y" + {(yyval)=makeselectiontag(CEO_RE);;} + break; + + case 56: + +/* Line 1464 of yacc.c */ +#line 196 "dce.y" + {(yyval) = (yyvsp[(1) - (1)]);;} + break; + + case 57: + +/* Line 1464 of yacc.c */ +#line 200 "dce.y" + {(yyval) = checkobject((yyvsp[(1) - (1)]));;} + break; + + case 58: + +/* Line 1464 of yacc.c */ +#line 204 "dce.y" + {(yyval) = checkobject((yyvsp[(1) - (1)]));;} + break; + + case 59: + +/* Line 1464 of yacc.c */ +#line 208 "dce.y" + {(yyval) = checkobject((yyvsp[(1) - (1)]));;} + break; + + + +/* Line 1464 of yacc.c */ +#line 1786 "dce.tab.c" + 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 (parsestate, 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 (parsestate, yymsg); + } + else + { + yyerror (parsestate, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead 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, parsestate); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead 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, parsestate); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++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; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (parsestate, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, parsestate); + /* 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, parsestate); + 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 1684 of yacc.c */ +#line 211 "dce.y" + + diff --git a/extern/src_netcdf4/dcetab.h b/extern/src_netcdf4/dcetab.h new file mode 100644 index 0000000..b7336bd --- /dev/null +++ b/extern/src_netcdf4/dcetab.h @@ -0,0 +1,58 @@ +/* A Bison parser, made by GNU Bison 2.4.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2009, 2010 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 { + SCAN_WORD = 258, + SCAN_STRINGCONST = 259, + SCAN_NUMBERCONST = 260 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + diff --git a/extern/src_netcdf4/dcompound.c b/extern/src_netcdf4/dcompound.c new file mode 100644 index 0000000..83385cd --- /dev/null +++ b/extern/src_netcdf4/dcompound.c @@ -0,0 +1,489 @@ +/*! \file + Functions for Compound Types + + Copyright 2011 University Corporation for Atmospheric + Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Compound Types + Functions to create and learn about compound types. */ +/*! \{ */ /* All these functions are part of this named group... */ + + +/** \ingroup user_types + +Create a compound type. Provide an ncid, a name, and a total size (in +bytes) of one element of the completed compound type. + +After calling this function, fill out the type with repeated calls to +nc_insert_compound(). Call nc_insert_compound() once for each field +you wish to insert into the compound type. + +\param ncid \ref ncid +\param size The size, in bytes, of the compound type. +\param name \ref object_name of the created type. +\param typeidp The type ID of the new type is copied here. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_ESTRICTNC3 Attempting a netCDF-4 operation on a netCDF-3 file. +\returns ::NC_ENOTNC4 This file was created with the strict netcdf-3 flag, therefore netcdf-4 operations are not allowed. (see nc_open). +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. + +\section Example + +\code +struct s1 +{ +int i1; +int i2; +}; +struct s1 data[DIM_LEN], data_in[DIM_LEN]; + +if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR; +if (nc_def_compound(ncid, sizeof(struct s1), SVC_REC, &typeid)) ERR; +if (nc_insert_compound(ncid, typeid, BATTLES_WITH_KLINGONS, +HOFFSET(struct s1, i1), NC_INT)) ERR; +if (nc_insert_compound(ncid, typeid, DATES_WITH_ALIENS, +HOFFSET(struct s1, i2), NC_INT)) ERR; +if (nc_def_dim(ncid, STARDATE, DIM_LEN, &dimid)) ERR; +if (nc_def_var(ncid, SERVICE_RECORD, typeid, 1, dimids, &varid)) ERR; +if (nc_put_var(ncid, varid, data)) ERR; +if (nc_close(ncid)) ERR; +\endcode +*/ +int +nc_def_compound(int ncid, size_t size, const char *name, + nc_type *typeidp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_compound(ncid,size,name,typeidp); +} + +/** \ingroup user_types +Insert a named field into a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param name The \ref object_name of the new field. + +\param offset Offset in byte from the beginning of the compound type +for this field. + +\param field_typeid The type of the field to be inserted. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. +*/ +int +nc_insert_compound(int ncid, nc_type xtype, const char *name, + size_t offset, nc_type field_typeid) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->insert_compound(ncid, xtype, name, + offset, field_typeid); +} + +/** \ingroup user_types +Insert a named array field into a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param name The \ref object_name of the new field. + +\param offset Offset in byte from the beginning of the compound type +for this field. + +\param field_typeid The type of the field to be inserted. + + \param ndims Number of dimensions in array. + + \param dim_sizes Array of dimension sizes. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_ESTRICTNC3 Attempting a netCDF-4 operation on a netCDF-3 file. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. +*/ +int +nc_insert_array_compound(int ncid, nc_type xtype, const char *name, + size_t offset, nc_type field_typeid, + int ndims, const int *dim_sizes) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->insert_array_compound(ncid,xtype,name,offset,field_typeid,ndims,dim_sizes); +} + +/** \ingroup user_types +Learn about a compound type. Get the number of fields, len, and +name of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param name Returned \ref object_name of compound type. \ref +ignored_if_null. + +\param sizep Returned size of compound type in bytes. \ref ignored_if_null. + +\param nfieldsp The number of fields in the compound type will be +placed here. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound(int ncid, nc_type xtype, char *name, + size_t *sizep, size_t *nfieldsp) +{ + int class = 0; + int stat = nc_inq_user_type(ncid,xtype,name,sizep,NULL,nfieldsp,&class); + if(stat != NC_NOERR) return stat; + if(class != NC_COMPOUND) stat = NC_EBADTYPE; + return stat; +} + +/** \ingroup user_types +Learn the name of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param name Returned \ref object_name of compound type. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_name(int ncid, nc_type xtype, char *name) +{ + return nc_inq_compound(ncid,xtype,name,NULL,NULL); +} + +/** \ingroup user_types +Learn the size of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param sizep Returned size of compound type in bytes. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_size(int ncid, nc_type xtype, size_t *sizep) +{ + return nc_inq_compound(ncid,xtype,NULL,sizep,NULL); +} + +/** \ingroup user_types +Learn the number of fields in a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param nfieldsp The number of fields in the compound type will be +placed here. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_nfields(int ncid, nc_type xtype, size_t *nfieldsp) +{ + return nc_inq_compound(ncid,xtype,NULL,NULL,nfieldsp); +} + +/** \ingroup user_types +Get information about one of the fields of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param fieldid A zero-based index number specifying a field in the +compound type. + +\param name Returned \ref object_name of the field. \ref +ignored_if_null. + +\param offsetp A pointer which will get the offset of the field. \ref +ignored_if_null. + +\param field_typeidp A pointer which will get the typeid of the +field. \ref ignored_if_null. + +\param ndimsp A pointer which will get the number of dimensions of the +field. \ref ignored_if_null. + +\param dim_sizesp A pointer which will get the dimension sizes of the +field. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_field(int ncid, nc_type xtype, int fieldid, + char *name, size_t *offsetp, + nc_type *field_typeidp, int *ndimsp, + int *dim_sizesp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_field(ncid, xtype, fieldid, + name, offsetp, field_typeidp, + ndimsp, dim_sizesp); +} + +/** \ingroup user_types +Get information about one of the fields of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param fieldid A zero-based index number specifying a field in the +compound type. + +\param name Returned \ref object_name of the field. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_fieldname(int ncid, nc_type xtype, int fieldid, + char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_field(ncid, xtype, fieldid, + name, NULL, NULL, NULL, + NULL); +} + +/** \ingroup user_types +Get information about one of the fields of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param fieldid A zero-based index number specifying a field in the +compound type. + +\param offsetp A pointer which will get the offset of the field. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_fieldoffset(int ncid, nc_type xtype, int fieldid, + size_t *offsetp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_field(ncid,xtype,fieldid,NULL,offsetp,NULL,NULL,NULL); +} + +/** \ingroup user_types +Get information about one of the fields of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param fieldid A zero-based index number specifying a field in the +compound type. + +\param field_typeidp A pointer which will get the typeid of the +field. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_fieldtype(int ncid, nc_type xtype, int fieldid, + nc_type *field_typeidp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_field(ncid,xtype,fieldid,NULL,NULL,field_typeidp,NULL,NULL); +} + +/** \ingroup user_types +Get information about one of the fields of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param fieldid A zero-based index number specifying a field in the +compound type. + +\param ndimsp A pointer which will get the number of dimensions of the +field. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_fieldndims(int ncid, nc_type xtype, int fieldid, + int *ndimsp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_field(ncid,xtype,fieldid,NULL,NULL,NULL,ndimsp,NULL); +} + +/** \ingroup user_types +Get information about one of the fields of a compound type. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param fieldid A zero-based index number specifying a field in the +compound type. + +\param dim_sizesp A pointer which will get the dimension sizes of the +field. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_fielddim_sizes(int ncid, nc_type xtype, int fieldid, + int *dim_sizesp) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_field(ncid, xtype, fieldid, + NULL, NULL, NULL, NULL, + dim_sizesp); +} + +/** \ingroup user_types +Learn the Index of a Named Field in a Compound Type. Get the index + * of a field in a compound type from the name. + +\param ncid \ref ncid + +\param xtype The typeid for this compound type, as returned by +nc_def_compound(), or nc_inq_var(). + +\param name \ref object_name of the field. \ref ignored_if_null. + +\param fieldidp A pointer which will get the index of the named +field. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_compound_fieldindex(int ncid, nc_type xtype, const char *name, + int *fieldidp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_compound_fieldindex(ncid,xtype,name,fieldidp); +} +/*! \} */ /* End of named group ...*/ + + + + + + diff --git a/extern/src_netcdf4/dcopy.c b/extern/src_netcdf4/dcopy.c new file mode 100644 index 0000000..5ca5780 --- /dev/null +++ b/extern/src_netcdf4/dcopy.c @@ -0,0 +1,619 @@ +/* Copyright 2010 University Corporation for Atmospheric + Research/Unidata. See COPYRIGHT file for more info. + + This file has the var and att copy functions. + + "$Id: copy.c,v 1.1 2010/06/01 15:46:49 ed Exp $" +*/ + +#include "ncdispatch.h" +#include + +#ifdef USE_NETCDF4 +/* Compare two netcdf types for equality. Must have the ncids as well, + to find user-defined types. */ +static int +NC_compare_nc_types(int ncid1, int typeid1, int ncid2, int typeid2, + int *equalp) +{ + int ret = NC_NOERR; + + /* If you don't care about the answer, neither do I! */ + if(equalp == NULL) + return NC_NOERR; + + /* Assume the types are not equal. If we find any inequality, then + exit with NC_NOERR and we're done. */ + *equalp = 0; + + /* Atomic types are so easy! */ + if (typeid1 <= NC_MAX_ATOMIC_TYPE) + { + if (typeid2 != typeid1) + return NC_NOERR; + *equalp = 1; + } + else + { + int i, ret, equal1; + char name1[NC_MAX_NAME]; + char name2[NC_MAX_NAME]; + size_t size1, size2; + nc_type base1, base2; + size_t nelems1, nelems2; + int class1, class2; + void* value1 = NULL; + void* value2 = NULL; + size_t offset1, offset2; + nc_type ftype1, ftype2; + int ndims1, ndims2; + int dimsizes1[NC_MAX_VAR_DIMS]; + int dimsizes2[NC_MAX_VAR_DIMS]; + + /* Find out about the two types. */ + if ((ret = nc_inq_user_type(ncid1, typeid1, name1, &size1, + &base1, &nelems1, &class1))) + return ret; + if ((ret = nc_inq_user_type(ncid2, typeid2, name2, &size2, + &base2, &nelems2, &class2))) + return ret; + + /* Check the obvious. */ + if(size1 != size2 || class1 != class2 || strcmp(name1,name2)) + return NC_NOERR; + + /* Check user-defined types in detail. */ + switch(class1) + { + case NC_VLEN: + if((ret = NC_compare_nc_types(ncid1, base1, ncid2, + base1, &equal1))) + return ret; + if(!equal1) + return NC_NOERR; + break; + case NC_OPAQUE: + /* Already checked size above. */ + break; + case NC_ENUM: + if(base1 != base2 || nelems1 != nelems2) return NC_NOERR; + + if (!(value1 = malloc(size1))) + return NC_ENOMEM; + if (!(value2 = malloc(size2))) + return NC_ENOMEM; + + for(i = 0; i < nelems1; i++) + { + if ((ret = nc_inq_enum_member(ncid1, typeid1, i, name1, + value1)) || + (ret = nc_inq_enum_member(ncid2, typeid2, i, name2, + value2)) || + strcmp(name1, name2) || memcmp(value1, value2, size1)) + { + free(value1); + free(value2); + return ret; + } + } + free(value1); + free(value2); + break; + case NC_COMPOUND: + if(nelems1 != nelems2) + return NC_NOERR; + + /* Compare each field. Each must be equal! */ + for(i = 0; i < nelems1; i++) + { + int j; + if ((ret = nc_inq_compound_field(ncid1, typeid1, i, name1, &offset1, + &ftype1, &ndims1, dimsizes1))) + return ret; + if ((ret = nc_inq_compound_field(ncid2, typeid2, i, name2, &offset2, + &ftype2, &ndims2, dimsizes2))) + return ret; + if(ndims1 != ndims2) + return NC_NOERR; + for(j = 0; j < ndims1;j++) + if(dimsizes1[j] != dimsizes2[j]) + return NC_NOERR; + + /* Compare user-defined field types. */ + if((ret = NC_compare_nc_types(ncid1, ftype1, ncid2, ftype2, + &equal1))) + return ret; + if(!equal1) + return NC_NOERR; + } + break; + default: + return NC_EINVAL; + } + *equalp = 1; + } + return ret; +} + +/* Recursively hunt for a netCDF type id. (Code from nc4internal.c); + Return matching typeid or 0 if not found. */ +static int +NC_rec_find_nc_type(int ncid1, nc_type tid1, int ncid2, nc_type* tid2) +{ + int i,ret = NC_NOERR; + int nids; + int* ids = NULL; + + /* Get all types in grp ncid2 */ + if(tid2) + *tid2 = 0; + if ((ret = nc_inq_typeids(ncid2, &nids, NULL))) + return ret; + if (nids) + { + if (!(ids = (int *)malloc(nids * sizeof(int)))) + return NC_ENOMEM; + if ((ret = nc_inq_typeids(ncid2, &nids, ids))) + return ret; + for(i = 0; i < nids; i++) + { + int equal = 0; + if ((ret = NC_compare_nc_types(ncid1, tid1, ncid2, ids[i], &equal))) + return ret; + if(equal) + { + if(tid2) + *tid2 = ids[i]; + free(ids); + return NC_NOERR; + } + } + free(ids); + } + + /* recurse */ + if ((ret = nc_inq_grps(ncid1, &nids, NULL))) + return ret; + if (nids) + { + if (!(ids = (int *)malloc(nids * sizeof(int)))) + return NC_ENOMEM; + if ((ret = nc_inq_grps(ncid1, &nids, ids))) + { + free(ids); + return ret; + } + for (i = 0; i < nids; i++) + { + ret = NC_rec_find_nc_type(ncid1, tid1, ids[i], tid2); + if (ret && ret != NC_EBADTYPE) + break; + if (tid2 && *tid2 != 0) /* found */ + { + free(ids); + return NC_NOERR; + } + } + free(ids); + } + return NC_EBADTYPE; /* not found */ +} + +/* Given a type in one file, find its equal (if any) in another + * file. It sounds so simple, but it's a real pain! */ +static int +NC_find_equal_type(int ncid1, nc_type xtype1, int ncid2, nc_type *xtype2) +{ + int ret = NC_NOERR; + + /* Check input */ + if(xtype1 <= NC_NAT) + return NC_EINVAL; + + /* Handle atomic types. */ + if (xtype1 <= NC_MAX_ATOMIC_TYPE) + { + if(xtype2) + *xtype2 = xtype1; + return NC_NOERR; + } + + /* Recursively search group ncid2 and its children + to find a type that is equal (using compare_type) + to xtype1. */ + ret = NC_rec_find_nc_type(ncid1, xtype1 , ncid2, xtype2); + return ret; +} + +#endif /* USE_NETCDF4 */ + +/* This will copy a variable from one file to another, assuming + dimensions in output file are already defined and have same + dimension ids. + + This function must work even if the files are different formats, + (i.e. one old netcdf, the other hdf5-netcdf.) + + But if you're copying into a netcdf-3 file, from a netcdf-4 file, + you must be copying a var of one of the six netcdf-3 + types. Similarly for the attributes. */ +int +nc_copy_var(int ncid_in, int varid_in, int ncid_out) +{ + char name[NC_MAX_NAME + 1]; + char att_name[NC_MAX_NAME + 1]; + nc_type xtype; + int ndims, dimids[NC_MAX_VAR_DIMS], natts, real_ndims; + int varid_out; + int a, d; + void *data = NULL; + size_t *count = NULL, *start = NULL; + size_t reclen = 1; + size_t *dimlen = NULL; + int retval = NC_NOERR; + size_t type_size; + int src_format, dest_format; + char type_name[NC_MAX_NAME+1]; + + /* Learn about this var. */ + if ((retval = nc_inq_var(ncid_in, varid_in, name, &xtype, + &ndims, dimids, &natts))) + return retval; + +#ifdef USE_NETCDF4 + LOG((2, "nc_copy_var: ncid_in 0x%x varid_in %d ncid_out 0x%x", + ncid_in, varid_in, ncid_out)); +#endif + + /* Make sure we are not trying to write into a netcdf-3 file + * anything that won't fit in netcdf-3. */ + if ((retval = nc_inq_format(ncid_in, &src_format))) + return retval; + if ((retval = nc_inq_format(ncid_out, &dest_format))) + return retval; + if ((dest_format == NC_FORMAT_CLASSIC || dest_format == NC_FORMAT_64BIT) && + src_format == NC_FORMAT_NETCDF4 && xtype > NC_DOUBLE) + return NC_ENOTNC4; + + /* Later on, we will need to know the size of this type. */ + if ((retval = nc_inq_type(ncid_in, xtype, type_name, &type_size))) + return retval; +#ifdef USE_NETCDF4 + LOG((3, "type %s has size %d", type_name, type_size)); +#endif + + /* Switch back to define mode, and create the output var. */ + retval = nc_redef(ncid_out); + if (retval && retval != NC_EINDEFINE) + BAIL(retval); + if ((retval = nc_def_var(ncid_out, name, xtype, + ndims, dimids, &varid_out))) + BAIL(retval); + + /* Copy the attributes. */ + for (a=0; a + ... + int status, ncid, latid, recid; + ... + status = nc_create("foo.nc", NC_NOCLOBBER, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_def_dim(ncid, "lat", 18L, &latid); + if (status != NC_NOERR) handle_error(status); + status = nc_def_dim(ncid, "rec", NC_UNLIMITED, &recid); + if (status != NC_NOERR) handle_error(status); +\endcode + + */ +int +nc_def_dim(int ncid, const char *name, size_t len, int *idp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_dim(ncid, name, len, idp); +} + +/*! +Find the ID of a dimension from the name. + +The function nc_inq_dimid returns (as an argument) the ID of a netCDF +dimension, given the name of the dimension. If ndims is the number of +dimensions defined for a netCDF dataset, each dimension has an ID +between 0 and ndims-1. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param name Name of the dimension. + +\param idp Pointer where dimension ID will be stored. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. +\returns ::NC_EBADDIM Invalid dimension ID or name. + */ +int +nc_inq_dimid(int ncid, const char *name, int *idp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_dimid(ncid,name,idp); +} + +/*! +Find the name and length of a dimension. + +The length for the unlimited dimension, if any, is the number of +records written so far. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param dimid Dimension ID, from a previous call to nc_inq_dimid() or +nc_def_dim(). + +\param name Returned dimension name. The caller must allocate space +for the returned name. The maximum possible length, in characters, of +a dimension name is given by the predefined constant +NC_MAX_NAME. (This doesn't include the null terminator, so declare +your array to be size NC_MAX_NAME+1). The returned character array +will be null-terminated. + +\param lenp Pointer to location for returned length of dimension. For +the unlimited dimension, this is the number of records written so far. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. +\returns ::NC_EBADDIM Invalid dimension ID or name. + +\section Example + +Here is an example using nc_inq_dim() to determine the length of a +dimension named lat, and the name and current maximum length of the +unlimited dimension for an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status, ncid, latid, recid; + size_t latlength, recs; + char recname[NC_MAX_NAME+1]; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_unlimdim(ncid, &recid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_dimid(ncid, "lat", &latid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_dimlen(ncid, latid, &latlength); + if (status != NC_NOERR) handle_error(status); + + status = nc_inq_dim(ncid, recid, recname, &recs); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_inq_dim(int ncid, int dimid, char *name, size_t *lenp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_dim(ncid,dimid,name,lenp); +} + +/*! +Rename a dimension. + +This function renames an existing dimension in a netCDF dataset open +for writing. You cannot rename a dimension to have the same name as +another dimension. + +For netCDF classic and 64-bit offset files, if the new name is longer +than the old name, the netCDF dataset must be in define mode. + +For netCDF-4 files the dataset is switched to define more for the +rename, regardless of the name length. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param dimid Dimension ID, from a previous call to nc_inq_dimid() or +nc_def_dim(). + +\param name New name for dimension. Must be a null-terminated string +with length less than NC_MAX_NAME. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. +\returns ::NC_EBADDIM Invalid dimension ID or name. +\returns ::NC_ENAMEINUSE String match to name in use +\returns ::NC_ENOMEM Memory allocation (malloc) failure +\returns ::NC_EPERM Write to read only +\section Example + +Here is an example using nc_rename_dim to rename the dimension lat to +latitude in an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status, ncid, latid; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_redef(ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_dimid(ncid, "lat", &latid); + if (status != NC_NOERR) handle_error(status); + status = nc_rename_dim(ncid, latid, "latitude"); + if (status != NC_NOERR) handle_error(status); + status = nc_enddef(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_rename_dim(int ncid, int dimid, const char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->rename_dim(ncid,dimid,name); +} + +/*! +Find the number of dimensions. + +In a classic model netCDF file, this funtion returns the number of +defined dimensions. In a netCDF-4/HDF5 file, this function returns the +number of dimensions available in the group specified by ncid, which +may be less than the total number of dimensions in a file. In a +netCDF-4/HDF5 file, dimensions are in all sub-groups, sub-sub-groups, +etc. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param ndimsp Pointer where number of dimensions will be +written. Ignored if NULL. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. + + */ +int +nc_inq_ndims(int ncid, int *ndimsp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + if(ndimsp == NULL) return NC_NOERR; + return ncp->dispatch->inq(ncid,ndimsp,NULL,NULL,NULL); +} + +/*! +Find the ID of the unlimited dimension. + +This function finds the ID of the unlimited dimension. For +netCDF-4/HDF5 files (which may have more than one unlimited +dimension), the ID of the first unlimited dimesnion is returned. For +these files, nc_inq_unlimdims() will return all the unlimited dimension IDs. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param unlimdimidp Pointer where unlimited dimension ID will be +stored. If there is no unlimited dimension, -1 will be stored +here. Ignored if NULL. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. + + */ +int +nc_inq_unlimdim(int ncid, int *unlimdimidp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_unlimdim(ncid,unlimdimidp); +} + +/*! +Find out the name of a dimension. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param dimid Dimension ID, from a previous call to nc_inq_dimid() or +nc_def_dim(). + +\param name Returned dimension name. The caller must allocate space +for the returned name. The maximum possible length, in characters, of +a dimension name is given by the predefined constant +NC_MAX_NAME. (This doesn't include the null terminator, so declare +your array to be size NC_MAX_NAME+1). The returned character array +will be null-terminated. Ignored if NULL. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. +\returns ::NC_EBADDIM Invalid dimension ID or name. + +\section Example + +Here is an example using nc_inq_dim() to determine the length of a +dimension named lat, and the name and current maximum length of the +unlimited dimension for an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status, ncid, latid, recid; + size_t latlength, recs; + char recname[NC_MAX_NAME+1]; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_unlimdim(ncid, &recid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_dimid(ncid, "lat", &latid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_dimlen(ncid, latid, &latlength); + if (status != NC_NOERR) handle_error(status); + + status = nc_inq_dim(ncid, recid, recname, &recs); + if (status != NC_NOERR) handle_error(status); +\endcode + + */ +int +nc_inq_dimname(int ncid, int dimid, char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + if(name == NULL) return NC_NOERR; + return ncp->dispatch->inq_dim(ncid,dimid,name,NULL); +} + +/*! +Find the length of a dimension. + +The length for the unlimited dimension, if any, is the number of +records written so far. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param dimid Dimension ID, from a previous call to nc_inq_dimid() or +nc_def_dim(). + +\param lenp Pointer where the length will be stored. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Not a valid ID. +\returns ::NC_EBADDIM Invalid dimension ID or name. + +\section Example + +Here is an example using nc_inq_dim() to determine the length of a +dimension named lat, and the name and current maximum length of the +unlimited dimension for an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status, ncid, latid, recid; + size_t latlength, recs; + char recname[NC_MAX_NAME+1]; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_unlimdim(ncid, &recid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_dimid(ncid, "lat", &latid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_dimlen(ncid, latid, &latlength); + if (status != NC_NOERR) handle_error(status); + + status = nc_inq_dim(ncid, recid, recname, &recs); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_inq_dimlen(int ncid, int dimid, size_t *lenp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + if(lenp == NULL) return NC_NOERR; + return ncp->dispatch->inq_dim(ncid,dimid,NULL,lenp); +} +/**@}*/ diff --git a/extern/src_netcdf4/ddispatch.c b/extern/src_netcdf4/ddispatch.c new file mode 100644 index 0000000..dcea514 --- /dev/null +++ b/extern/src_netcdf4/ddispatch.c @@ -0,0 +1,213 @@ +#include "ncdispatch.h" +#include "nc_uri.h" + +extern int NCSUBSTRATE_intialize(void); + +/* Define vectors of zeros and ones for use with various nc_get_varX function*/ +size_t nc_sizevector0[NC_MAX_DIMS]; +size_t nc_sizevector1[NC_MAX_DIMS]; +ptrdiff_t nc_ptrdiffvector1[NC_MAX_DIMS]; + +/* Define the known protocols and their manipulations */ +static struct NCPROTOCOLLIST { + char* protocol; + char* substitute; + int modelflags; +} ncprotolist[] = { + {"http",NULL,0}, + {"https",NULL,0}, + {"file",NULL,NC_DISPATCH_NCD}, + {"dods","http",NC_DISPATCH_NCD}, + {"dodss","https",NC_DISPATCH_NCD}, + {"cdmr","http",NC_DISPATCH_NCR|NC_DISPATCH_NC4}, + {"cdmrs","https",NC_DISPATCH_NCR|NC_DISPATCH_NC4}, + {"cdmremote","http",NC_DISPATCH_NCR|NC_DISPATCH_NC4}, + {"cdmremotes","https",NC_DISPATCH_NCR|NC_DISPATCH_NC4}, + {NULL,NULL,0} /* Terminate search */ +}; + +/* Define the server to ping in order; + make the order attempt to optimize + against future changes. +*/ +static const char* servers[] = { +"http://motherlode.ucar.edu:8081", /* try this first */ +"http://remotetest.unidata.ucar.edu", +"http://remotetest.ucar.edu", +"http://motherlode.ucar.edu:8080", +"http://motherlode.ucar.edu", +"http://remotetests.unidata.ucar.edu", +"http://remotetests.ucar.edu", +NULL +}; + +/* +static nc_type longtype = (sizeof(long) == sizeof(int)?NC_INT:NC_INT64); +static nc_type ulongtype = (sizeof(unsigned long) == sizeof(unsigned int)?NC_UINT:NC_UINT64); +*/ + +/* Allow dispatch to do initialization */ +int +NCDISPATCH_initialize(void) +{ + extern int NCSUBSTRATE_initialize(void); + int i; + NCSUBSTRATE_initialize(); + for(i=0;iprotocol;protolist++) { + if(strcmp(tmpurl->protocol,protolist->protocol) == 0) { + isurl=1; + break; + } + } + nc_urifree(tmpurl); + return isurl; + } + return 0; +} + +/* +Return the OR of some of the NC_DISPATCH flags +Assumes that the path is known to be a url +*/ + +int +NC_urlmodel(const char* path) +{ + int model = 0; + NC_URI* tmpurl = NULL; + struct NCPROTOCOLLIST* protolist; + + if(!nc_uriparse(path,&tmpurl)) goto done; + + /* Look at any prefixed parameters */ + if(nc_urilookup(tmpurl,"netcdf4",NULL) + || nc_urilookup(tmpurl,"netcdf-4",NULL)) { + model = (NC_DISPATCH_NC4|NC_DISPATCH_NCD); + } else if(nc_urilookup(tmpurl,"netcdf3",NULL) + || nc_urilookup(tmpurl,"netcdf-3",NULL)) { + model = (NC_DISPATCH_NC3|NC_DISPATCH_NCD); + } else if(nc_urilookup(tmpurl,"cdmremote",NULL) + || nc_urilookup(tmpurl,"cdmr",NULL)) { + model = (NC_DISPATCH_NCR|NC_DISPATCH_NC4); + } + + if(model == 0) { + /* Now look at the protocol */ + for(protolist=ncprotolist;protolist->protocol;protolist++) { + if(strcmp(tmpurl->protocol,protolist->protocol) == 0) { + model |= protolist->modelflags; + if(protolist->substitute) { + if(tmpurl->protocol) free(tmpurl->protocol); + tmpurl->protocol = strdup(protolist->substitute); + } + break; + } + } + } + + /* Force NC_DISPATCH_NC3 if necessary */ + if((model & NC_DISPATCH_NC4) == 0) + model |= (NC_DISPATCH_NC3 | NC_DISPATCH_NCD); + +done: + nc_urifree(tmpurl); + return model; +} + +/* Override dispatch table management */ +static NC_Dispatch* NC_dispatch_override = NULL; + +/* Override dispatch table management */ +NC_Dispatch* +NC_get_dispatch_override(void) { + return NC_dispatch_override; +} + +void NC_set_dispatch_override(NC_Dispatch* d) +{ + NC_dispatch_override = d; +} + +/* Overlay by treating the tables as arrays of void*. + Overlay rules are: + overlay base merge + ------- ---- ----- + null null null + null y y + x null x + x y x +*/ + +int +NC_dispatch_overlay(const NC_Dispatch* overlay, const NC_Dispatch* base, NC_Dispatch* merge) +{ + void** voverlay = (void**)overlay; + void** vmerge; + int i, count = sizeof(NC_Dispatch) / sizeof(void*); + /* dispatch table must be exact multiple of sizeof(void*) */ + assert(count * sizeof(void*) == sizeof(NC_Dispatch)); + *merge = *base; + vmerge = (void**)merge; + for(i=0;imodel = overlay->model; + return NC_NOERR; +} diff --git a/extern/src_netcdf4/denum.c b/extern/src_netcdf4/denum.c new file mode 100644 index 0000000..dc8a2b0 --- /dev/null +++ b/extern/src_netcdf4/denum.c @@ -0,0 +1,176 @@ +/*! \file + Functions for Enum Types + + Copyright 2011 University Corporation for Atmospheric + Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Enum Types + Functions to create and learn about enum types. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** \ingroup user_types +Create an enum type. Provide an ncid, a name, and a base integer type. + +After calling this function, fill out the type with repeated calls to +nc_insert_enum(). Call nc_insert_enum() once for each value you wish +to make part of the enumeration. + +\param ncid \ref ncid + +\param base_typeid The base integer type for this enum. Must be one +of: ::NC_BYTE, ::NC_UBYTE, ::NC_SHORT, ::NC_USHORT, ::NC_INT, +::NC_UINT, ::NC_INT64, ::NC_UINT64. + +\param name \ref object_name of new type. + +\param typeidp A pointer to an nc_type. The typeid of the new type +will be placed there. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. + */ +int +nc_def_enum(int ncid, nc_type base_typeid, const char *name, nc_type *typeidp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_enum(ncid,base_typeid,name,typeidp); +} + +/** \ingroup user_types +Insert a named member into a enum type. + +\param ncid \ref ncid +\param xtype +\param name The identifier (\ref object_name) of the new member. +\param value The value that is to be associated with this member. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. + */ +int +nc_insert_enum(int ncid, nc_type xtype, const char *name, + const void *value) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->insert_enum(ncid, xtype, name, + value); +} + +/** \ingroup user_types +Learn about a user-define enumeration type. + +\param ncid \ref ncid + +\param xtype Typeid to inquire about. + +\param name \ref object_name of type will be copied here. \ref +ignored_if_null. + +\param base_nc_typep Typeid if the base type of the enum.\ref +ignored_if_null. + +\param base_sizep Pointer that will get the size in bytes of the base +type. \ref ignored_if_null. + +\param num_membersp Pointer that will get the number of members +defined for this enum type. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_enum(int ncid, nc_type xtype, char *name, nc_type *base_nc_typep, + size_t *base_sizep, size_t *num_membersp) +{ + int class = 0; + int stat = nc_inq_user_type(ncid, xtype, name, base_sizep, + base_nc_typep, num_membersp, &class); + if(stat != NC_NOERR) return stat; + if(class != NC_ENUM) stat = NC_EBADTYPE; + return stat; +} + +/** \ingroup user_types +Learn about a about a member of an enum type. + +\param ncid \ref ncid + +\param xtype Typeid of the enum type. + +\param idx Index to the member to inquire about. + +\param name The identifier (\ref object_name) of this member will be +copied here. \ref ignored_if_null. + +\param value The value of this member will be copied here. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_enum_member(int ncid, nc_type xtype, int idx, char *name, + void *value) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_enum_member(ncid, xtype, idx, name, value); +} + +/** \ingroup user_types +Get the name which is associated with an enum member value. + +\param ncid \ref ncid + +\param xtype Typeid of the enum type. + +\param value Value of interest. + +\param identifier The identifier (\ref object_name) of this value will +be copied here. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_enum_ident(int ncid, nc_type xtype, long long value, + char *identifier) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_enum_ident(ncid,xtype,value,identifier); +} +/*! \} */ /* End of named group ...*/ diff --git a/extern/src_netcdf4/derror.c b/extern/src_netcdf4/derror.c new file mode 100644 index 0000000..a9c4e60 --- /dev/null +++ b/extern/src_netcdf4/derror.c @@ -0,0 +1,255 @@ +/** \file +Error messages and library version. + +These functions return the library version, and error messages. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include "ncdispatch.h" + +/* Tell the user the version of netCDF. */ +static const char nc_libvers[] = PACKAGE_VERSION " of "__DATE__" "__TIME__" $"; + +/** \defgroup lib_version Library Version + +*/ + +/** +\ingroup lib_version +Return the library version. + +\returns short string that contains the version information for the +library. + */ +const char * +nc_inq_libvers(void) +{ + return nc_libvers; +} + +/** \defgroup error Error Handling +NetCDF functions non-zero status codes on error. + +Each netCDF function returns an integer status value. If the returned +status value indicates an error, you may handle it in any way desired, +from printing an associated error message and exiting to ignoring the +error indication and proceeding (not recommended!). For simplicity, +the examples in this guide check the error status and call a separate +function, handle_err(), to handle any errors. One possible definition +of handle_err() can be found within the documentation of +nc_strerror(). + +The nc_strerror() function is available to convert a returned integer +error status into an error message string. + +Occasionally, low-level I/O errors may occur in a layer below the +netCDF library. For example, if a write operation causes you to exceed +disk quotas or to attempt to write to a device that is no longer +available, you may get an error from a layer below the netCDF library, +but the resulting write error will still be reflected in the returned +status value. + + */ + +/** +\ingroup error + Given an error number, return an error message. + +This function returns a static reference to an error message string +corresponding to an integer netCDF error status or to a system error +number, presumably returned by a previous call to some other netCDF +function. The error codes are defined in netcdf.h. + +\param ncerr1 error number + +\returns short string containing error message. + +\section Example + +Here is an example of a simple error handling function that uses +nc_strerror to print the error message corresponding to the netCDF +error status returned from any netCDF function call and then exit: + +\code + #include + ... + void handle_error(int status) { + if (status != NC_NOERR) { + fprintf(stderr, "%s\n", nc_strerror(status)); + exit(-1); + } + } +\endcode +*/ +const char * +nc_strerror(int ncerr1) +{ + /* System error? */ + if(NC_ISSYSERR(ncerr1)) + { + const char *cp = (const char *) strerror(ncerr1); + if(cp == NULL) + return "Unknown Error"; + return cp; + } + + /* If we're here, this is a netcdf error code. */ + switch(ncerr1) + { + case NC_NOERR: + return "No error"; + case NC_EBADID: + return "NetCDF: Not a valid ID"; + case NC_ENFILE: + return "NetCDF: Too many files open"; + case NC_EEXIST: + return "NetCDF: File exists && NC_NOCLOBBER"; + case NC_EINVAL: + return "NetCDF: Invalid argument"; + case NC_EPERM: + return "NetCDF: Write to read only"; + case NC_ENOTINDEFINE: + return "NetCDF: Operation not allowed in data mode"; + case NC_EINDEFINE: + return "NetCDF: Operation not allowed in define mode"; + case NC_EINVALCOORDS: + return "NetCDF: Index exceeds dimension bound"; + case NC_EMAXDIMS: + return "NetCDF: NC_MAX_DIMS exceeded"; + case NC_ENAMEINUSE: + return "NetCDF: String match to name in use"; + case NC_ENOTATT: + return "NetCDF: Attribute not found"; + case NC_EMAXATTS: + return "NetCDF: NC_MAX_ATTRS exceeded"; + case NC_EBADTYPE: + return "NetCDF: Not a valid data type or _FillValue type mismatch"; + case NC_EBADDIM: + return "NetCDF: Invalid dimension ID or name"; + case NC_EUNLIMPOS: + return "NetCDF: NC_UNLIMITED in the wrong index"; + case NC_EMAXVARS: + return "NetCDF: NC_MAX_VARS exceeded"; + case NC_ENOTVAR: + return "NetCDF: Variable not found"; + case NC_EGLOBAL: + return "NetCDF: Action prohibited on NC_GLOBAL varid"; + case NC_ENOTNC: + return "NetCDF: Unknown file format"; + case NC_ESTS: + return "NetCDF: In Fortran, string too short"; + case NC_EMAXNAME: + return "NetCDF: NC_MAX_NAME exceeded"; + case NC_EUNLIMIT: + return "NetCDF: NC_UNLIMITED size already in use"; + case NC_ENORECVARS: + return "NetCDF: nc_rec op when there are no record vars"; + case NC_ECHAR: + return "NetCDF: Attempt to convert between text & numbers"; + case NC_EEDGE: + return "NetCDF: Start+count exceeds dimension bound"; + case NC_ESTRIDE: + return "NetCDF: Illegal stride"; + case NC_EBADNAME: + return "NetCDF: Name contains illegal characters"; + case NC_ERANGE: + return "NetCDF: Numeric conversion not representable"; + case NC_ENOMEM: + return "NetCDF: Memory allocation (malloc) failure"; + case NC_EVARSIZE: + return "NetCDF: One or more variable sizes violate format constraints"; + case NC_EDIMSIZE: + return "NetCDF: Invalid dimension size"; + case NC_ETRUNC: + return "NetCDF: File likely truncated or possibly corrupted"; + case NC_EAXISTYPE: + return "NetCDF: Illegal axis type"; + case NC_EDAP: + return "NetCDF: DAP failure"; + case NC_ECURL: + return "NetCDF: libcurl failure"; + case NC_EIO: + return "NetCDF: I/O failure"; + case NC_ENODATA: + return "NetCDF: Variable has no data in DAP request"; + case NC_EDAPSVC: + return "NetCDF: DAP server error"; + case NC_EDAS: + return "NetCDF: Malformed or inaccessible DAP DAS"; + case NC_EDDS: + return "NetCDF: Malformed or inaccessible DAP DDS"; + case NC_EDATADDS: + return "NetCDF: Malformed or inaccessible DAP DATADDS"; + case NC_EDAPURL: + return "NetCDF: Malformed URL"; + case NC_EDAPCONSTRAINT: + return "NetCDF: Malformed Constraint"; + case NC_ETRANSLATION: + return "NetCDF: Untranslatable construct"; + case NC_EHDFERR: + return "NetCDF: HDF error"; + case NC_ECANTREAD: + return "NetCDF: Can't read file"; + case NC_ECANTWRITE: + return "NetCDF: Can't write file"; + case NC_ECANTCREATE: + return "NetCDF: Can't create file"; + case NC_EFILEMETA: + return "NetCDF: Can't add HDF5 file metadata"; + case NC_EDIMMETA: + return "NetCDF: Can't define dimensional metadata"; + case NC_EATTMETA: + return "NetCDF: Can't open HDF5 attribute"; + case NC_EVARMETA: + return "NetCDF: Problem with variable metadata."; + case NC_ENOCOMPOUND: + return "NetCDF: Can't create HDF5 compound type"; + case NC_EATTEXISTS: + return "NetCDF: Attempt to create attribute that alread exists"; + case NC_ENOTNC4: + return "NetCDF: Attempting netcdf-4 operation on netcdf-3 file"; + case NC_ESTRICTNC3: + return "NetCDF: Attempting netcdf-4 operation on strict nc3 netcdf-4 file"; + case NC_ENOTNC3: + return "NetCDF: Attempting netcdf-3 operation on netcdf-4 file"; + case NC_ENOPAR: + return "NetCDF: Parallel operation on file opened for non-parallel access"; + case NC_EPARINIT: + return "NetCDF: Error initializing for parallel access"; + case NC_EBADGRPID: + return "NetCDF: Bad group ID"; + case NC_EBADTYPID: + return "NetCDF: Bad type ID"; + case NC_ETYPDEFINED: + return "NetCDF: Type has already been defined and may not be edited"; + case NC_EBADFIELD: + return "NetCDF: Bad field ID"; + case NC_EBADCLASS: + return "NetCDF: Bad class"; + case NC_EMAPTYPE: + return "NetCDF: Mapped access for atomic types only"; + case NC_ELATEFILL: + return "NetCDF: Attempt to define fill value when data already exists."; + case NC_ELATEDEF: + return "NetCDF: Attempt to define var properties, like deflate, after enddef."; + case NC_EDIMSCALE: + return "NetCDF: Probem with HDF5 dimscales."; + case NC_ENOGRP: + return "NetCDF: No group found."; + case NC_ESTORAGE: + return "NetCDF: Cannot specify both contiguous and chunking."; + case NC_EBADCHUNK: + return "NetCDF: Bad chunk sizes."; + case NC_ENOTBUILT: + return "NetCDF: Attempt to use feature that was not turned on " + "when netCDF was built."; + case NC_EDISKLESS: + return "NetCDF: Error in using diskless access"; + default: + return "Unknown Error"; + } +} + + diff --git a/extern/src_netcdf4/dfile.c b/extern/src_netcdf4/dfile.c new file mode 100644 index 0000000..9b1a03f --- /dev/null +++ b/extern/src_netcdf4/dfile.c @@ -0,0 +1,1650 @@ +/** \file +File create and open functions + +These functions end up calling functions in one of the dispatch layers +(netCDF-4, dap server, etc). + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include "config.h" +#include +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include "ncdispatch.h" + +static int nc_initialized = 0; + +/** \defgroup datasets NetCDF Files + +NetCDF opens datasets as files or remote access URLs. + +A netCDF dataset that has not yet been opened can only be referred to +by its dataset name. Once a netCDF dataset is opened, it is referred +to by a netCDF ID, which is a small non-negative integer returned when +you create or open the dataset. A netCDF ID is much like a file +descriptor in C or a logical unit number in FORTRAN. In any single +program, the netCDF IDs of distinct open netCDF datasets are +distinct. A single netCDF dataset may be opened multiple times and +will then have multiple distinct netCDF IDs; however at most one of +the open instances of a single netCDF dataset should permit +writing. When an open netCDF dataset is closed, the ID is no longer +associated with a netCDF dataset. + +Functions that deal with the netCDF library include: +- Get version of library. +- Get error message corresponding to a returned error code. + +The operations supported on a netCDF dataset as a single object are: +- Create, given dataset name and whether to overwrite or not. +- Open for access, given dataset name and read or write intent. +- Put into define mode, to add dimensions, variables, or attributes. +- Take out of define mode, checking consistency of additions. +- Close, writing to disk if required. +- Inquire about the number of dimensions, number of variables, +number of global attributes, and ID of the unlimited dimension, if +any. +- Synchronize to disk to make sure it is current. +- Set and unset nofill mode for optimized sequential writes. +- After a summary of conventions used in describing the netCDF +interfaces, the rest of this chapter presents a detailed description +of the interfaces for these operations. +*/ +/**@{*/ + +size_t* NC_coord_zero; +size_t* NC_coord_one; + +static void +nc_local_initialize(void) +{ + int i; + NC_coord_zero = (size_t*)malloc(sizeof(size_t)*NC_MAX_VAR_DIMS); + if(NC_coord_zero == NULL) abort(); + NC_coord_one = (size_t*)malloc(sizeof(size_t)*NC_MAX_VAR_DIMS); + if(NC_coord_one == NULL) abort(); + for(i=0;icomm; + info = ((NC_MPI_INFO*)mpi_info)->info; + } + if((retval = MPI_File_open(comm, (char *)path, MPI_MODE_RDONLY,info, + &fh)) != MPI_SUCCESS) + return NC_EPARINIT; + if((retval = MPI_File_read(fh, magic, MAGIC_NUMBER_LEN, MPI_CHAR, + &status)) != MPI_SUCCESS) + return NC_EPARINIT; + if((retval = MPI_File_close(&fh)) != MPI_SUCCESS) + return NC_EPARINIT; + } else +#endif /* USE_PARALLEL */ + { + FILE *fp; + int i; + + if(path == NULL || strlen(path)==0) + return NC_EINVAL; + + if (!(fp = fopen(path, "r"))) + return errno; + i = fread(magic, MAGIC_NUMBER_LEN, 1, fp); + fclose(fp); + if(i != 1) + return errno; + } + + /* Ignore the first byte for HDF */ + if(magic[1] == 'H' && magic[2] == 'D' && magic[3] == 'F') + *hdf = 5; + else if(magic[0] == '\016' && magic[1] == '\003' + && magic[2] == '\023' && magic[3] == '\001') + *hdf = 4; + else if(magic[0] == 'C' && magic[1] == 'D' && magic[2] == 'F') + { + if(magic[3] == '\001') + *cdf = 1; /* netcdf classic version 1 */ + else if(magic[3] == '\002') + *cdf = 2; /* netcdf classic version 2 */ + } + + return NC_NOERR; +} + +/** \ingroup datasets +Create a new netCDF file. + +This function creates a new netCDF dataset, returning a netCDF ID that +can subsequently be used to refer to the netCDF dataset in other +netCDF function calls. The new netCDF dataset opened for write access +and placed in define mode, ready for you to add dimensions, variables, +and attributes. + +\param path The file name of the new netCDF dataset. + +\param cmode The creation mode flag. The following flags are +available: NC_NOCLOBBER (do not overwrite existing file), NC_SHARE +(limit write caching - netcdf classic files onlt), NC_64BIT_OFFSET +(create 64-bit offset file), NC_NETCDF4 (create netCDF-4/HDF5 file), +NC_CLASSIC_MODEL (enforce netCDF classic mode on netCDF-4/HDF5 +files), NC_DISKLESS (store data only in memory), NC_MMAP (use MMAP +for NC_DISKLESS), and NC_WRITE. +See discussion below. + +\param ncidp Pointer to location where returned netCDF ID is to be +stored. + +

The cmode Flag

+ +The cmode flag is used to control the type of file created, and some +aspects of how it may be used. + +Setting NC_NOCLOBBER means you do not want to clobber (overwrite) an +existing dataset; an error (NC_EEXIST) is returned if the specified +dataset already exists. + +The NC_SHARE flag is appropriate when one process may be writing the +dataset and one or more other processes reading the dataset +concurrently; it means that dataset accesses are not buffered and +caching is limited. Since the buffering scheme is optimized for +sequential access, programs that do not access data sequentially may +see some performance improvement by setting the NC_SHARE flag. This +flag is ignored for netCDF-4 files. + +Setting NC_64BIT_OFFSET causes netCDF to create a 64-bit offset format +file, instead of a netCDF classic format file. The 64-bit offset +format imposes far fewer restrictions on very large (i.e. over 2 GB) +data files. See Large File Support. + +A zero value (defined for convenience as NC_CLOBBER) specifies the +default behavior: overwrite any existing dataset with the same file +name and buffer and cache accesses for efficiency. The dataset will be +in netCDF classic format. See NetCDF Classic Format Limitations. + +Setting NC_NETCDF4 causes netCDF to create a HDF5/NetCDF-4 file. + +Setting NC_CLASSIC_MODEL causes netCDF to enforce the classic data +model in this file. (This only has effect for netCDF-4/HDF5 files, as +classic and 64-bit offset files always use the classic model.) When +used with NC_NETCDF4, this flag ensures that the resulting +netCDF-4/HDF5 file may never contain any new constructs from the +enhanced data model. That is, it cannot contain groups, user defined +types, multiple unlimited dimensions, or new atomic types. The +advantage of this restriction is that such files are guaranteed to +work with existing netCDF software. + +Setting NC_DISKLESS causes netCDF to create the file only in memory. +This allows for the use of files that have no long term purpose. Note that +with one exception, the in-memory file is destroyed upon calling +nc_close. If, however, the flag combination (NC_DISKLESS|NC_WRITE) +is used, then at close, the contents of the memory file will be +made persistent in the file path that was specified in the nc_create +call. If NC_DISKLESS is going to be used for creating a large classic file, +it behooves one to use either nc__create or nc_create_mp and specify +an appropriately large value of the initialsz parameter to avoid +to many extensions to the in-memory space for the file. +This flag applies to files in classic format and to file in extended +format (netcdf-4). + +Normally, NC_DISKLESS allocates space in the heap for +storing the in-memory file. If, however, the ./configure +flags --enable-mmap is used, and the additional mode flag +NC_MMAP is specified, then the file will be created using +the operating system MMAP facility. +This flag only applies to files in classic format. Extended +format (netcdf-4) files will ignore the NC_MMAP flag. + +Using NC_MMAP for nc_create is +only included for completeness vis-a-vis nc_open. The +ability to use MMAP is of limited use for nc_create because +nc_create is going to create the file in memory anyway. +Closing a MMAP'd file will be slightly faster, but not significantly. + +Note that nc_create(path,cmode,ncidp) is equivalent to the invocation of +nc__create(path,cmode,NC_SIZEHINT_DEFAULT,NULL,ncidp). + +\returns ::NC_NOERR No error. + +\returns ::NC_ENOMEM System out of memory. + +\returns ::NC_EHDFERR HDF5 error (netCDF-4 files only). + +\returns ::NC_EFILEMETA Error writing netCDF-4 file-level metadata in +HDF5 file. (netCDF-4 files only). + +\returns ::NC_EDISKLESS if there was an error in creating the +in-memory file. + +\note When creating a netCDF-4 file HDF5 error reporting is turned +off, if it is on. This doesn't stop the HDF5 error stack from +recording the errors, it simply stops their display to the user +through stderr. + +

Examples

+ +In this example we create a netCDF dataset named foo.nc; we want the +dataset to be created in the current directory only if a dataset with +that name does not already exist: + +@code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("foo.nc", NC_NOCLOBBER, &ncid); + if (status != NC_NOERR) handle_error(status); +@endcode + +In this example we create a netCDF dataset named foo_large.nc. It will +be in the 64-bit offset format. + +@code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("foo_large.nc", NC_NOCLOBBER|NC_64BIT_OFFSET, &ncid); + if (status != NC_NOERR) handle_error(status); +@endcode + +In this example we create a netCDF dataset named foo_HDF5.nc. It will +be in the HDF5 format. + +@code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("foo_HDF5.nc", NC_NOCLOBBER|NC_NETCDF4, &ncid); + if (status != NC_NOERR) handle_error(status); +@endcode + +In this example we create a netCDF dataset named +foo_HDF5_classic.nc. It will be in the HDF5 format, but will not allow +the use of any netCDF-4 advanced features. That is, it will conform to +the classic netCDF-3 data model. + +@code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("foo_HDF5_classic.nc", NC_NOCLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &ncid); + if (status != NC_NOERR) handle_error(status); +@endcode + +In this example we create a in-memory netCDF classic dataset named +diskless.nc whose content will be lost when nc_close() is called. + +@code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("diskless.nc", NC_DISKLESS, &ncid); + if (status != NC_NOERR) handle_error(status); +@endcode + +In this example we create a in-memory netCDF classic dataset named +diskless.nc and specify that it should be made persistent +in a file named diskless.nc when nc_close() is called. + +@code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("diskless.nc", NC_DISKLESS|NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); +@endcode + +A variant of nc_create(), nc__create() (note the double underscore) allows +users to specify two tuning parameters for the file that it is +creating. */ +int +nc_create(const char *path, int cmode, int *ncidp) +{ + return nc__create(path,cmode,NC_SIZEHINT_DEFAULT,NULL,ncidp); +} + +/*! +Create a netCDF file with some extra parameters controlling classic +file cacheing. + +Like nc_create(), this function creates a netCDF file. + +\param path The file name of the new netCDF dataset. + +\param cmode The creation mode flag, the same as in nc_create(). + +\param initialsz On some systems, and with custom I/O layers, it may +be advantageous to set the size of the output file at creation +time. This parameter sets the initial size of the file at creation +time. This only applies to classic and 64-bit offset files. +The special value NC_SIZEHINT_DEFAULT (which is the value 0), +lets the netcdf library choose a suitable initial size. + +\param chunksizehintp A pointer to the chunk size hint, +which controls a space versus time tradeoff, memory +allocated in the netcdf library versus number of system +calls. Because of internal requirements, the value may not +be set to exactly the value requested. The actual value +chosen is returned by reference. Using a NULL pointer or +having the pointer point to the value NC_SIZEHINT_DEFAULT +causes the library to choose a default. How the system +chooses the default depends on the system. On many systems, +the "preferred I/O block size" is available from the stat() +system call, struct stat member st_blksize. If this is +available it is used. Lacking that, twice the system +pagesize is used. Lacking a call to discover the system +pagesize, we just set default bufrsize to 8192. The bufrsize +is a property of a given open netcdf descriptor ncid, it is +not a persistent property of the netcdf dataset. This only +applies to classic and 64-bit offset files. + +\param ncidp Pointer to location where returned netCDF ID is to be +stored. + +\note This function uses the same return codes as the nc_create() +function. + +

Examples

+ +In this example we create a netCDF dataset named foo_large.nc; we want +the dataset to be created in the current directory only if a dataset +with that name does not already exist. We also specify that bufrsize +and initial size for the file. + +\code +#include + ... + int status = NC_NOERR; + int ncid; + int intialsz = 2048; + int *bufrsize; + ... + *bufrsize = 1024; + status = nc__create("foo.nc", NC_NOCLOBBER, initialsz, bufrsize, &ncid); + if (status != NC_NOERR) handle_error(status); +\endcode +*/ +int +nc__create(const char *path, int cmode, size_t initialsz, + size_t *chunksizehintp, int *ncidp) +{ + return NC_create(path, cmode, initialsz, 0, + chunksizehintp, 0, NULL, ncidp); + +} +/** +\internal + +\deprecated This function was used in the old days with the Cray at +NCAR. The Cray is long gone, and this call is supported only for +backward compatibility. + + */ +int +nc__create_mp(const char *path, int cmode, size_t initialsz, + int basepe, size_t *chunksizehintp, int *ncidp) +{ + return NC_create(path, cmode, initialsz, basepe, + chunksizehintp, 0, NULL, ncidp); +} + +/** +Open an existing netCDF file. + +This function opens an existing netCDF dataset for access. It +determines the underlying file format automatically. Use the same call +to open a netCDF classic, 64-bit offset, or netCDF-4 file. + +\param path File name for netCDF dataset to be opened. When DAP +support is enabled, then the path may be an OPeNDAP URL rather than a +file path. + +\param mode The mode flag may include NC_WRITE (for read/write +access) and NC_SHARE (see below) and NC_DISKLESS (see below). + +\param ncidp Pointer to location where returned netCDF ID is to be +stored. + +

Open Mode

+ +A zero value (or NC_NOWRITE) specifies the default behavior: open the +dataset with read-only access, buffering and caching accesses for +efficiency. + +Otherwise, the open mode is NC_WRITE, NC_SHARE, or +NC_WRITE|NC_SHARE. Setting the NC_WRITE flag opens the dataset with +read-write access. ("Writing" means any kind of change to the dataset, +including appending or changing data, adding or renaming dimensions, +variables, and attributes, or deleting attributes.) + +The NC_SHARE flag is only used for netCDF classic and 64-bit offset +files. It is appropriate when one process may be writing the dataset +and one or more other processes reading the dataset concurrently; it +means that dataset accesses are not buffered and caching is +limited. Since the buffering scheme is optimized for sequential +access, programs that do not access data sequentially may see some +performance improvement by setting the NC_SHARE flag. + +This procedure may also be invoked with the NC_DISKLESS flag +set in the mode argument if the file to be opened is a +classic format file. For nc_open(), this flag applies only +to files in classic format. If the file is of type +NC_NETCDF4, then the NC_DISKLESS flag will be ignored. + +If NC_DISKLESS is specified, then the whole file is read completely into +memory. In effect this creates an in-memory cache of the file. +If the mode flag also specifies NC_WRITE, then the in-memory cache +will be re-written to the disk file when nc_close() is called. +For some kinds of manipulations, having the in-memory cache can +speed up file processing. But in simple cases, non-cached +processing may actually be faster than using cached processing. +You will need to experiment to determine if the in-memory caching +is worthwhile for your application. + +Normally, NC_DISKLESS allocates space in the heap for +storing the in-memory file. If, however, the ./configure +flags --enable-mmap is used, and the additional mode flag +NC_MMAP is specified, then the file will be opened using +the operating system MMAP facility. +This flag only applies to files in classic format. Extended +format (netcdf-4) files will ignore the NC_MMAP flag. + +In most cases, using MMAP provides no advantage +for just NC_DISKLESS. The one case where using MMAP is an +advantage is when a file is to be opened and only a small portion +of its data is to be read and/or written. +In this scenario, MMAP will cause only the accessed data to be +retrieved from disk. Without MMAP, NC_DISKLESS will read the whole +file into memory on nc_open. Thus, MMAP will provide some performance +improvement in this case. + +It is not necessary to pass any information about the format of the +file being opened. The file type will be detected automatically by the +netCDF library. + +If a the path is a DAP URL, then the open mode is read-only. +Setting NC_WRITE will be ignored. + +\note When opening a netCDF-4 file HDF5 error reporting is turned off, +if it is on. This doesn't stop the HDF5 error stack from recording the +errors, it simply stops their display to the user through stderr. + +nc_open()returns the value NC_NOERR if no errors occurred. Otherwise, +the returned status indicates an error. Possible causes of errors +include: + +Note that nc_open(path,cmode,ncidp) is equivalent to the invocation of +nc__open(path,cmode,NC_SIZEHINT_DEFAULT,NULL,ncidp). + +\returns ::NC_NOERR No error. + +\returns ::NC_ENOMEM Out of memory. + +\returns ::NC_EHDFERR HDF5 error. (NetCDF-4 files only.) + +\returns ::NC_EDIMMETA Error in netCDF-4 dimension metadata. (NetCDF-4 files only.) + +

Examples

+ +Here is an example using nc_open()to open an existing netCDF dataset +named foo.nc for read-only, non-shared access: + +@code +#include + ... +int status = NC_NOERR; +int ncid; + ... +status = nc_open("foo.nc", 0, &ncid); +if (status != NC_NOERR) handle_error(status); +@endcode +*/ +int +nc_open(const char *path, int mode, int *ncidp) +{ + return NC_open(path, mode, 0, NULL, 0, NULL, ncidp); +} + +/** +Open a netCDF file with extra performance parameters for the classic +library. + +\param path File name for netCDF dataset to be opened. When DAP +support is enabled, then the path may be an OPeNDAP URL rather than a +file path. + +\param mode The mode flag may include NC_WRITE (for read/write +access) and NC_SHARE as in nc_open(). + +\param chunksizehintp A size hint for the classic library. Only +applies to classic and 64-bit offset files. See below for more +information. + +\param ncidp Pointer to location where returned netCDF ID is to be +stored. + +

The chunksizehintp Parameter

+ +The argument referenced by bufrsizehintp controls a space versus time +tradeoff, memory allocated in the netcdf library versus number of +system calls. + +Because of internal requirements, the value may not be set to exactly +the value requested. The actual value chosen is returned by reference. + +Using a NULL pointer or having the pointer point to the value +NC_SIZEHINT_DEFAULT causes the library to choose a default. +How the system chooses the default depends on the system. On +many systems, the "preferred I/O block size" is available from the +stat() system call, struct stat member st_blksize. If this is +available it is used. Lacking that, twice the system pagesize is used. + +Lacking a call to discover the system pagesize, we just set default +bufrsize to 8192. + +The bufrsize is a property of a given open netcdf descriptor ncid, it +is not a persistent property of the netcdf dataset. + + +\returns ::NC_NOERR No error. + +\returns ::NC_ENOMEM Out of memory. + +\returns ::NC_EHDFERR HDF5 error. (NetCDF-4 files only.) + +\returns ::NC_EDIMMETA Error in netCDF-4 dimension metadata. (NetCDF-4 +files only.) + +*/ +int +nc__open(const char *path, int mode, + size_t *chunksizehintp, int *ncidp) +{ + return NC_open(path, mode, 0, chunksizehintp, 0, + NULL, ncidp); +} + +/** +\internal + +\deprecated This function was used in the old days with the Cray at +NCAR. The Cray is long gone, and this call is supported only for +backward compatibility. + + */ +int +nc__open_mp(const char *path, int mode, int basepe, + size_t *chunksizehintp, int *ncidp) +{ + return NC_open(path, mode, basepe, chunksizehintp, + 0, NULL, ncidp); +} + +/** +Get the file pathname (or the opendap URL) which was used to +open/create the ncid's file. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\param pathlen Pointer where length of path will be returned. Ignored +if NULL. + +\param path Pointer where path name will be copied. Space must already +be allocated. Ignored if NULL. + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. +*/ +int +nc_inq_path(int ncid, size_t *pathlen, char *path) +{ + NC* ncp; + int stat = NC_NOERR; + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + if(ncp->path == NULL) { + if(pathlen) *pathlen = 0; + if(path) path[0] = '\0'; + } else { + if (pathlen) *pathlen = strlen(ncp->path); + if (path) strcpy(path, ncp->path); + } + return stat; +} + +/** +Put open netcdf dataset into define mode + +The function nc_redef puts an open netCDF dataset into define mode, so +dimensions, variables, and attributes can be added or renamed and +attributes can be deleted. + +For netCDF-4 files (i.e. files created with NC_NETCDF4 in the cmode in +their call to nc_create()), it is not necessary to call nc_redef() +unless the file was also created with NC_STRICT_NC3. For straight-up +netCDF-4 files, nc_redef() is called automatically, as needed. + +For all netCDF-4 files, the root ncid must be used. This is the ncid +returned by nc_open() and nc_create(), and points to the root of the +hierarchy tree for netCDF-4 files. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Bad ncid. + +\returns ::NC_EBADGRPID The ncid must refer to the root group of the +file, that is, the group returned by nc_open() or nc_create(). + +\returns ::NC_EINDEFINE Already in define mode. + +\returns ::NC_EPERM File is read-only. + +

Example

+ +Here is an example using nc_redef to open an existing netCDF dataset +named foo.nc and put it into define mode: + +\code +#include + ... +int status = NC_NOERR; +int ncid; + ... +status = nc_open("foo.nc", NC_WRITE, &ncid); +if (status != NC_NOERR) handle_error(status); + ... +status = nc_redef(ncid); +if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_redef(int ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->redef(ncid); +} + +/** +Leave define mode + +The function nc_enddef() takes an open netCDF dataset out of define +mode. The changes made to the netCDF dataset while it was in define +mode are checked and committed to disk if no problems +occurred. Non-record variables may be initialized to a "fill value" as +well with nc_set_fill(). The netCDF dataset is then placed in data +mode, so variable data can be read or written. + +It's not necessary to call nc_enddef() for netCDF-4 files. With netCDF-4 +files, nc_enddef() is called when needed by the netcdf-4 library. User +calls to nc_enddef() for netCDF-4 files still flush the metadata to +disk. + +This call may involve copying data under some circumstances. For a +more extensive discussion see File Structure and Performance. + +For netCDF-4/HDF5 format files there are some variable settings (the +compression, endianness, fletcher32 error correction, and fill value) +which must be set (if they are going to be set at all) between the +nc_def_var() and the next nc_enddef(). Once the nc_enddef() is called, +these settings can no longer be changed for a variable. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +If you use a group id (in a netCDF-4/HDF5 file), the enddef +will apply to the entire file. That means the enddef will not just end +define mode in one group, but in the entire file. + +\returns ::NC_NOERR no error + +\returns ::NC_EBADID Invalid ncid passed. + +

Example

+ +Here is an example using nc_enddef() to finish the definitions of a new +netCDF dataset named foo.nc and put it into data mode: + +\code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("foo.nc", NC_NOCLOBBER, &ncid); + if (status != NC_NOERR) handle_error(status); + + ... create dimensions, variables, attributes + + status = nc_enddef(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_enddef(int ncid) +{ + int status = NC_NOERR; + NC *ncp; + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) return status; + return ncp->dispatch->_enddef(ncid,0,1,0,1); +} + +/** +Leave define mode with performance tuning + +The function nc__enddef takes an open netCDF dataset out of define +mode. The changes made to the netCDF dataset while it was in define +mode are checked and committed to disk if no problems +occurred. Non-record variables may be initialized to a "fill value" as +well with nc_set_fill(). The netCDF dataset is then placed in data mode, +so variable data can be read or written. + +This call may involve copying data under some circumstances. For a +more extensive discussion see File Structure and Performance. + +\warning This function exposes internals of the netcdf version 1 file +format. Users should use nc_enddef() in most circumstances. This +function may not be available on future netcdf implementations. + +The classic netcdf file format has three sections, the "header" +section, the data section for fixed size variables, and the data +section for variables which have an unlimited dimension (record +variables). + +The header begins at the beginning of the file. The index (offset) of +the beginning of the other two sections is contained in the +header. Typically, there is no space between the sections. This causes +copying overhead to accrue if one wishes to change the size of the +sections, as may happen when changing names of things, text attribute +values, adding attributes or adding variables. Also, for buffered i/o, +there may be advantages to aligning sections in certain ways. + +The minfree parameters allow one to control costs of future calls to +nc_redef, nc_enddef() by requesting that minfree bytes be available at +the end of the section. + +The align parameters allow one to set the alignment of the beginning +of the corresponding sections. The beginning of the section is rounded +up to an index which is a multiple of the align parameter. The flag +value ALIGN_CHUNK tells the library to use the bufrsize (see above) as +the align parameter. It has nothing to do with the chunking +(multidimensional tiling) features of netCDF-4. + +The file format requires mod 4 alignment, so the align parameters are +silently rounded up to multiples of 4. The usual call, + +\code + nc_enddef(ncid); +\endcode + +is equivalent to + +\code + nc__enddef(ncid, 0, 4, 0, 4); +\endcode + +The file format does not contain a "record size" value, this is +calculated from the sizes of the record variables. This unfortunate +fact prevents us from providing minfree and alignment control of the +"records" in a netcdf file. If you add a variable which has an +unlimited dimension, the third section will always be copied with the +new variable added. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\param h_minfree Sets the pad at the end of the "header" section. + +\param v_align Controls the alignment of the beginning of the data +section for fixed size variables. + +\param v_minfree Sets the pad at the end of the data section for fixed +size variables. + +\param r_align Controls the alignment of the beginning of the data +section for variables which have an unlimited dimension (record +variables). + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. + + */ +int +nc__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, + size_t r_align) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->_enddef(ncid,h_minfree,v_align,v_minfree,r_align); +} + +/** +Synchronize an open netcdf dataset to disk + +The function nc_sync() offers a way to synchronize the disk copy of a +netCDF dataset with in-memory buffers. There are two reasons you might +want to synchronize after writes: +- To minimize data loss in case of abnormal termination, or +- To make data available to other processes for reading immediately + after it is written. But note that a process that already had the + dataset open for reading would not see the number of records + increase when the writing process calls nc_sync(); to accomplish this, + the reading process must call nc_sync. + +This function is backward-compatible with previous versions of the +netCDF library. The intent was to allow sharing of a netCDF dataset +among multiple readers and one writer, by having the writer call +nc_sync() after writing and the readers call nc_sync() before each +read. For a writer, this flushes buffers to disk. For a reader, it +makes sure that the next read will be from disk rather than from +previously cached buffers, so that the reader will see changes made by +the writing process (e.g., the number of records written) without +having to close and reopen the dataset. If you are only accessing a +small amount of data, it can be expensive in computer resources to +always synchronize to disk after every write, since you are giving up +the benefits of buffering. + +An easier way to accomplish sharing (and what is now recommended) is +to have the writer and readers open the dataset with the NC_SHARE +flag, and then it will not be necessary to call nc_sync() at +all. However, the nc_sync() function still provides finer granularity +than the NC_SHARE flag, if only a few netCDF accesses need to be +synchronized among processes. + +It is important to note that changes to the ancillary data, such as +attribute values, are not propagated automatically by use of the +NC_SHARE flag. Use of the nc_sync() function is still required for this +purpose. + +Sharing datasets when the writer enters define mode to change the data +schema requires extra care. In previous releases, after the writer +left define mode, the readers were left looking at an old copy of the +dataset, since the changes were made to a new copy. The only way +readers could see the changes was by closing and reopening the +dataset. Now the changes are made in place, but readers have no +knowledge that their internal tables are now inconsistent with the new +dataset schema. If netCDF datasets are shared across redefinition, +some mechanism external to the netCDF library must be provided that +prevents access by readers during redefinition and causes the readers +to call nc_sync before any subsequent access. + +When calling nc_sync(), the netCDF dataset must be in data mode. A +netCDF dataset in define mode is synchronized to disk only when +nc_enddef() is called. A process that is reading a netCDF dataset that +another process is writing may call nc_sync to get updated with the +changes made to the data by the writing process (e.g., the number of +records written), without having to close and reopen the dataset. + +Data is automatically synchronized to disk when a netCDF dataset is +closed, or whenever you leave define mode. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. + */ +int +nc_sync(int ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->sync(ncid); +} + +/** +\internal + +Users no longer need to call this function, since it is called +automatically by nc_close() in case the dataset is in define mode and +something goes wrong with committing the changes. The function +nc_abort() just closes the netCDF dataset, if not in define mode. If +the dataset is being created and is still in define mode, the dataset +is deleted. If define mode was entered by a call to nc_redef(), the +netCDF dataset is restored to its state before definition mode was +entered and the dataset is closed. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\returns ::NC_NOERR No error. + +

Example

+ +Here is an example using nc_abort to back out of redefinitions of a +dataset named foo.nc: + +\code + #include + ... + int ncid, status, latid; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_redef(ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_def_dim(ncid, "lat", 18L, &latid); + if (status != NC_NOERR) { + handle_error(status); + status = nc_abort(ncid); + if (status != NC_NOERR) handle_error(status); + } +\endcode + + */ +int +nc_abort(int ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + if(ncp->path != NULL) free(ncp->path); + ncp->path = NULL; + return ncp->dispatch->abort(ncid); +} + +/** +Close an open netCDF dataset + +If the dataset in define mode, nc_enddef() will be called before +closing. (In this case, if nc_enddef() returns an error, nc_abort() will +automatically be called to restore the dataset to the consistent state +before define mode was last entered.) After an open netCDF dataset is +closed, its netCDF ID may be reassigned to the next netCDF dataset +that is opened or created. + +\param ncid NetCDF ID, from a previous call to nc_open() or nc_create(). + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid id passed. + +\returns ::NC_EBADGRPID ncid did not contain the root group id of this +file. (NetCDF-4 only). + +

Example

+ +Here is an example using nc_close to finish the definitions of a new +netCDF dataset named foo.nc and release its netCDF ID: + +\code + #include + ... + int status = NC_NOERR; + int ncid; + ... + status = nc_create("foo.nc", NC_NOCLOBBER, &ncid); + if (status != NC_NOERR) handle_error(status); + + ... create dimensions, variables, attributes + + status = nc_close(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode + + */ +int +nc_close(int ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->close(ncid); +} + +/** +Change the fill-value mode to improve write performance. + +This function is intended for advanced usage, to optimize writes under +some circumstances described below. The function nc_set_fill() sets the +fill mode for a netCDF dataset open for writing and returns the +current fill mode in a return parameter. The fill mode can be +specified as either ::NC_FILL or ::NC_NOFILL. The default behavior +corresponding to ::NC_FILL is that data is pre-filled with fill values, +that is fill values are written when you create non-record variables +or when you write a value beyond data that has not yet been +written. This makes it possible to detect attempts to read data before +it was written. For more information on the use of fill values see +Fill Values. For information about how to define your own fill values +see Attribute Conventions. + +The behavior corresponding to ::NC_NOFILL overrides the default behavior +of prefilling data with fill values. This can be used to enhance +performance, because it avoids the duplicate writes that occur when +the netCDF library writes fill values that are later overwritten with +data. + +A value indicating which mode the netCDF dataset was already in is +returned. You can use this value to temporarily change the fill mode +of an open netCDF dataset and then restore it to the previous mode. + +After you turn on ::NC_NOFILL mode for an open netCDF dataset, you must +be certain to write valid data in all the positions that will later be +read. Note that nofill mode is only a transient property of a netCDF +dataset open for writing: if you close and reopen the dataset, it will +revert to the default behavior. You can also revert to the default +behavior by calling nc_set_fill() again to explicitly set the fill mode +to ::NC_FILL. + +There are three situations where it is advantageous to set nofill +mode: +- Creating and initializing a netCDF dataset. In this case, you should + set nofill mode before calling nc_enddef() and then write completely + all non-record variables and the initial records of all the record + variables you want to initialize. +- Extending an existing record-oriented netCDF dataset. Set nofill + mode after opening the dataset for writing, then append the + additional records to the dataset completely, leaving no intervening + unwritten records. +- Adding new variables that you are going to initialize to an existing + netCDF dataset. Set nofill mode before calling nc_enddef() then write + all the new variables completely. + +If the netCDF dataset has an unlimited dimension and the last record +was written while in nofill mode, then the dataset may be shorter than +if nofill mode was not set, but this will be completely transparent if +you access the data only through the netCDF interfaces. + +The use of this feature may not be available (or even needed) in +future releases. Programmers are cautioned against heavy reliance upon +this feature. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\param fillmode Desired fill mode for the dataset, either ::NC_NOFILL or +::NC_FILL. + +\param old_modep Pointer to location for returned current fill mode of +the dataset before this call, either ::NC_NOFILL or ::NC_FILL. + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID The specified netCDF ID does not refer to an open +netCDF dataset. + +\returns ::NC_EPERM The specified netCDF ID refers to a dataset open for +read-only access. + +\returns ::NC_EINVAL The fill mode argument is neither ::NC_NOFILL nor +::NC_FILL. + +

Example

+ +Here is an example using nc_set_fill() to set nofill mode for subsequent +writes of a netCDF dataset named foo.nc: + +\code + #include + ... + int ncid, status, old_fill_mode; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + + ... write data with default prefilling behavior + + status = nc_set_fill(ncid, ::NC_NOFILL, &old_fill_mode); + if (status != NC_NOERR) handle_error(status); + + ... write data with no prefilling +\endcode + */ +int +nc_set_fill(int ncid, int fillmode, int *old_modep) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->set_fill(ncid,fillmode,old_modep); +} + +/** +\internal + +\deprecated This function was used in the old days with the Cray at +NCAR. The Cray is long gone, and this call is supported only for +backward compatibility. + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. + */ +int +nc_inq_base_pe(int ncid, int *pe) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_base_pe(ncid,pe); +} + +/** +\internal + +\deprecated This function was used in the old days with the Cray at +NCAR. The Cray is long gone, and this call is supported only for +backward compatibility. + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. + */ +int +nc_set_base_pe(int ncid, int pe) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->set_base_pe(ncid,pe); +} + +/** +Inquire about the binary format of a netCDF file. + +This function returns the (rarely needed) format version. + +\param ncid NetCDF ID, from a previous call to nc_open() or +nc_create(). + +\param formatp Pointer to location for returned format version, one of +NC_FORMAT_CLASSIC, NC_FORMAT_64BIT, NC_FORMAT_NETCDF4, +NC_FORMAT_NETCDF4_CLASSIC. + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. + + */ +int +nc_inq_format(int ncid, int *formatp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_format(ncid,formatp); +} + +/** +Inquire about a file or group. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param ndimsp Pointer to location for returned number of dimensions +defined for this netCDF dataset. Ignored if NULL. + +\param nvarsp Pointer to location for returned number of variables +defined for this netCDF dataset. Ignored if NULL. + +\param nattsp Pointer to location for returned number of global +attributes defined for this netCDF dataset. Ignored if NULL. + +\param unlimdimidp Pointer to location for returned ID of the +unlimited dimension, if there is one for this netCDF dataset. If no +unlimited length dimension has been defined, -1 is returned. Ignored +if NULL. If there are multiple unlimited dimensions (possible only +for netCDF-4 files), only a pointer to the first is returned, for +backward compatibility. If you want them all, use nc_inq_unlimids(). + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADID Invalid ncid passed. + +

Example

+ +Here is an example using nc_inq to find out about a netCDF dataset +named foo.nc: + +\code + #include + ... + int status, ncid, ndims, nvars, ngatts, unlimdimid; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq(ncid, &ndims, &nvars, &ngatts, &unlimdimid); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq(ncid,ndimsp,nvarsp,nattsp,unlimdimidp); +} + +int +nc_inq_nvars(int ncid, int *nvarsp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq(ncid, NULL, nvarsp, NULL, NULL); +} + +/** +Inquire about a type. + +Given an ncid and a typeid, get the information about a type. This +function will work on any type, including atomic and any user defined +type, whether compound, opaque, enumeration, or variable length array. + +For even more information about a user defined type nc_inq_user_type(). + +\param ncid The ncid for the group containing the type (ignored for +atomic types). + +\param xtype The typeid for this type, as returned by nc_def_compound, +nc_def_opaque, nc_def_enum, nc_def_vlen, or nc_inq_var, or as found in +netcdf.h in the list of atomic types (NC_CHAR, NC_INT, etc.). + +\param name If non-NULL, the name of the user defined type will be +copied here. It will be NC_MAX_NAME bytes or less. For atomic types, +the type name from CDL will be given. + +\param size If non-NULL, the (in-memory) size of the type in bytes +will be copied here. VLEN type size is the size of nc_vlen_t. String +size is returned as the size of a character pointer. The size may be +used to malloc space for the data, no matter what the type. + +\returns ::NC_NOERR No error. + +\returns ::NC_EBADTYPE Bad typeid. + +\returns ::NC_ENOTNC4 Seeking a user-defined type in a netCDF-3 file. + +\returns ::NC_ESTRICTNC3 Seeking a user-defined type in a netCDF-4 file +for which classic model has been turned on. + +\returns ::NC_EBADGRPID Bad group ID in ncid. + +\returns ::NC_EBADID Type ID not found. + +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + +

Example

+ +This example is from the test program tst_enums.c, and it uses all the +possible inquiry functions on an enum type. + +\code + if (nc_inq_user_type(ncid, typeids[0], name_in, &base_size_in, &base_nc_type_in, + &nfields_in, &class_in)) ERR; + if (strcmp(name_in, TYPE_NAME) || base_size_in != sizeof(int) || + base_nc_type_in != NC_INT || nfields_in != NUM_MEMBERS || class_in != NC_ENUM) ERR; + if (nc_inq_type(ncid, typeids[0], name_in, &base_size_in)) ERR; + if (strcmp(name_in, TYPE_NAME) || base_size_in != sizeof(int)) ERR; + if (nc_inq_enum(ncid, typeids[0], name_in, &base_nc_type, &base_size_in, &num_members)) ERR; + if (strcmp(name_in, TYPE_NAME) || base_nc_type != NC_INT || num_members != NUM_MEMBERS) ERR; + for (i = 0; i < NUM_MEMBERS; i++) + { + if (nc_inq_enum_member(ncid, typeid, i, name_in, &value_in)) ERR; + if (strcmp(name_in, member_name[i]) || value_in != member_value[i]) ERR; + if (nc_inq_enum_ident(ncid, typeid, member_value[i], name_in)) ERR; + if (strcmp(name_in, member_name[i])) ERR; + } + + if (nc_close(ncid)) ERR; +\endcode + */ +int +nc_inq_type(int ncid, nc_type xtype, char *name, size_t *size) +{ + NC* ncp; + /* For compatibility, we need to allow inq about + atomic types, even if ncid is ill-defined */ + if(xtype <= ATOMICTYPEMAX) { + if(xtype <= NC_NAT) return NC_EBADTYPE; + if(name) strncpy(name,NC_atomictypename(xtype),NC_MAX_NAME); + if(size) *size = NC_atomictypelen(xtype); + return NC_NOERR; + } else { + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return NC_EBADTYPE; /* compatibility */ + return ncp->dispatch->inq_type(ncid,xtype,name,size); + } +} +/**@}*/ + +/** +\internal +\ingroup dispatch + +Create a file, calling the appropriate dispatch create call. + +For create, we have the following pieces of information to use to +determine the dispatch table: +- table specified by override +- path +- cmode + +\param path The file name of the new netCDF dataset. + +\param cmode The creation mode flag, the same as in nc_create(). + +\param initialsz This parameter sets the initial size of the file at creation +time. This only applies to classic and 64-bit offset files. + +\param basepe Deprecated parameter from the Cray days. + +\param chunksizehintp A pointer to the chunk size hint. This only +applies to classic and 64-bit offset files. + +\param useparallel Non-zero if parallel I/O is to be used on this +file. + +\param mpi_info Pointer to MPI comm and info. + +\param ncidp Pointer to location where returned netCDF ID is to be +stored. + +\returns ::NC_NOERR No error. +*/ +int +NC_create(const char *path, int cmode, size_t initialsz, + int basepe, size_t *chunksizehintp, int useparallel, + void* mpi_info, int *ncidp) +{ + int stat = NC_NOERR; + NC* ncp = NULL; + NC_Dispatch* dispatcher = NULL; + /* Need three pieces of information for now */ + int model = 0; /* one of the NC_DISPATCH_XXX values */ + int isurl = 0; /* dap or cdmremote or neither */ + int xcmode = 0; /* for implied cmode flags */ + extern int default_create_format; + + /* Initialize the dispatch table. The function pointers in the + * dispatch table will depend on how netCDF was built + * (with/without netCDF-4, DAP, CDMREMOTE). */ + if(!nc_initialized) + { + if ((stat = NC_initialize())) + return stat; + /* Do local initialization */ + nc_local_initialize(); + nc_initialized = 1; + } + + if((isurl = NC_testurl(path))) + model = NC_urlmodel(path); + + /* Look to the incoming cmode for hints */ + if(model == 0) { + if(cmode & NC_NETCDF4 || cmode & NC_PNETCDF) + model = NC_DISPATCH_NC4; + } + + if(model == 0) { + /* Check default format */ + int format = default_create_format; + switch (format) { +#ifdef USE_NETCDF4 + case NC_FORMAT_NETCDF4: + xcmode |= NC_NETCDF4; + model = NC_DISPATCH_NC4; + break; + case NC_FORMAT_NETCDF4_CLASSIC: + xcmode |= NC_CLASSIC_MODEL; + model = NC_DISPATCH_NC4; + break; +#endif + case NC_FORMAT_64BIT: + xcmode |= NC_64BIT_OFFSET; + /* fall thru */ + case NC_FORMAT_CLASSIC: + default: + model = NC_DISPATCH_NC3; + break; + } + } + + /* Add inferred flags */ + cmode |= xcmode; + +#ifdef USE_NETCDF4 + if((cmode & NC_MPIIO && cmode & NC_MPIPOSIX)) + return NC_EINVAL; +#endif + + if (!(dispatcher = NC_get_dispatch_override())) + { + + /* Figure out what dispatcher to use */ +#ifdef USE_NETCDF4 +#ifdef USE_CDMREMOTE + if(model == (NC_DISPATCH_NC4 | NC_DISPATCH_NCR)) + dispatcher = NCCR_dispatch_table; + else +#endif + if(model == (NC_DISPATCH_NC4)) + dispatcher = NC4_dispatch_table; + else +#endif /*USE_NETCDF4*/ +#ifdef USE_DAP + if(model == (NC_DISPATCH_NC3 | NC_DISPATCH_NCD)) + dispatcher = NCD3_dispatch_table; + else +#endif + if(model == (NC_DISPATCH_NC3)) + dispatcher = NC3_dispatch_table; + else + return NC_ENOTNC; + } + + if ((stat = dispatcher->create(path, cmode, initialsz, basepe, chunksizehintp, + useparallel, mpi_info, dispatcher, &ncp))) + return stat; + + ncp->dispatch = dispatcher; + if(ncidp) + *ncidp = ncp->ext_ncid; + if (!(ncp->path = nulldup(path))) + return NC_ENOMEM; + return NC_NOERR; +} + +/** +\internal +\ingroup dispatch + +Open a netCDF file (or remote dataset) calling the appropriate +dispatch function. + +For open, we have the following pieces of information to use to determine the dispatch table. +- table specified by override +- path +- cmode +- the contents of the file (if it exists), basically checking its magic number. + +\returns ::NC_NOERR No error. +*/ +int +NC_open(const char *path, int cmode, + int basepe, size_t *chunksizehintp, + int useparallel, void* mpi_info, + int *ncidp) +{ + int stat = NC_NOERR; + NC* ncp = NULL; + NC_Dispatch* dispatcher = NULL; + /* Need two pieces of information for now */ + int model = 0; + int isurl = 0; + int cdfversion = 0; + int hdfversion = 0; + extern int default_create_format; + + if(!nc_initialized) { + stat = NC_initialize(); + if(stat) return stat; + /* Do local initialization */ + nc_local_initialize(); + nc_initialized = 1; + } + + isurl = NC_testurl(path); + if(isurl) + model = NC_urlmodel(path); + + if(!isurl) { + /* Look at the file if it exists */ + stat = NC_check_file_type(path,useparallel,mpi_info,&cdfversion,&hdfversion); + if(stat == NC_NOERR) { + if(hdfversion != 0) { + model = NC_DISPATCH_NC4; + } else if(cdfversion != 0) { + model = NC_DISPATCH_NC3; + } + } + /* else ignore the file */ + } + + /* Look to the incoming cmode for hints */ + if(model == 0) { + if(cmode & NC_NETCDF4 || cmode & NC_PNETCDF) model |= NC_DISPATCH_NC4; + } + + if(model == 0) model = NC_DISPATCH_NC3; /* final default */ + + /* Force flag consistentcy */ + if(model & NC_DISPATCH_NC4) + cmode |= NC_NETCDF4; + else if(model & NC_DISPATCH_NC3) { + cmode &= ~NC_NETCDF4; /* must be netcdf-3 */ + if(cdfversion == 2) cmode |= NC_64BIT_OFFSET; + } + + if((cmode & NC_MPIIO && cmode & NC_MPIPOSIX)) + return NC_EINVAL; + + /* override overrides any other table choice */ + dispatcher = NC_get_dispatch_override(); + if(dispatcher != NULL) goto havetable; + + /* Figure out what dispatcher to use */ +#if defined(USE_CDMREMOTE) + if(model == (NC_DISPATCH_NC4 | NC_DISPATCH_NCR)) + dispatcher = NCCR_dispatch_table; + else +#endif +#if defined(USE_DAP) + if(model == (NC_DISPATCH_NC3 | NC_DISPATCH_NCD)) + dispatcher = NCD3_dispatch_table; + else +#endif +#if defined(USE_NETCDF4) + if(model == (NC_DISPATCH_NC4)) + dispatcher = NC4_dispatch_table; + else +#endif + if(model == (NC_DISPATCH_NC3)) + dispatcher = NC3_dispatch_table; + else + return NC_ENOTNC; + + havetable: + stat = dispatcher->open(path, cmode, basepe, chunksizehintp, + useparallel, mpi_info, dispatcher, &ncp); + if(stat == NC_NOERR) { + ncp->dispatch = dispatcher; + if(ncidp) *ncidp = ncp->ext_ncid; + ncp->path = nulldup(path); + if(path == NULL) stat = NC_ENOMEM; + } + return stat; +} + +/*Provide an internal function for generating pseudo file descriptors + for systems that are not file based (e.g. dap, memio). +*/ + +/* Static counter for pseudo file descriptors (incremented) */ +static int pseudofd = 0; + +/* Create a pseudo file descriptor that does not + overlap real file descriptors +*/ +int +nc__pseudofd(void) +{ + if(pseudofd == 0) { + int maxfd = 32767; /* default */ +#ifdef HAVE_GETRLIMIT + struct rlimit rl; + if(getrlimit(RLIMIT_NOFILE,&rl) == 0) { + if(rl.rlim_max != RLIM_INFINITY) + maxfd = rl.rlim_max; + if(rl.rlim_cur != RLIM_INFINITY) + maxfd = rl.rlim_cur; + } + pseudofd = maxfd+1; +#endif + } + + return pseudofd++; +} + + diff --git a/extern/src_netcdf4/dgroup.c b/extern/src_netcdf4/dgroup.c new file mode 100644 index 0000000..2e02a5c --- /dev/null +++ b/extern/src_netcdf4/dgroup.c @@ -0,0 +1,187 @@ +/*! \file +Functions for netCDF-4 features. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See \ref COPYRIGHT file for more info. */ + +#include "ncdispatch.h" + +/** \defgroup user_types User-Defined Types + +User defined types allow for more complex data structures. + +NetCDF-4 has added support for four different user defined data +types. User defined type may only be used in files created with the +::NC_NETCDF4 and without ::NC_CLASSIC_MODEL. +- compound type: like a C struct, a compound type is a collection of +types, including other user defined types, in one package. +- variable length array type: used to store ragged arrays. +- opaque type: This type has only a size per element, and no other + type information. +- enum type: Like an enumeration in C, this type lets you assign text + values to integer values, and store the integer values. + +Users may construct user defined type with the various nc_def_* +functions described in this section. They may learn about user defined +types by using the nc_inq_ functions defined in this section. + +Once types are constructed, define variables of the new type with +nc_def_var (see nc_def_var). Write to them with nc_put_var1, +nc_put_var, nc_put_vara, or nc_put_vars. Read data of user-defined +type with nc_get_var1, nc_get_var, nc_get_vara, or nc_get_vars (see +\ref variables). + +Create attributes of the new type with nc_put_att (see nc_put_att_ +type). Read attributes of the new type with nc_get_att (see +\ref attributes). +*/ +/** \{ */ + +/** \} */ + +/** \defgroup groups Groups + +NetCDF-4 added support for hierarchical groups within netCDF datasets. + +Groups are identified with a ncid, which identifies both the open +file, and the group within that file. When a file is opened with +nc_open or nc_create, the ncid for the root group of that file is +provided. Using that as a starting point, users can add new groups, or +list and navigate existing groups. + +All netCDF calls take a ncid which determines where the call will take +its action. For example, the nc_def_var function takes a ncid as its +first parameter. It will create a variable in whichever group its ncid +refers to. Use the root ncid provided by nc_create or nc_open to +create a variable in the root group. Or use nc_def_grp to create a +group and use its ncid to define a variable in the new group. + +Variable are only visible in the group in which they are defined. The +same applies to attributes. “Global†attributes are associated with +the group whose ncid is used. + +Dimensions are visible in their groups, and all child groups. + +Group operations are only permitted on netCDF-4 files - that is, files +created with the HDF5 flag in nc_create(). Groups are not compatible +with the netCDF classic data model, so files created with the +::NC_CLASSIC_MODEL file cannot contain groups (except the root group). + + */ +/** \{ */ +int +nc_inq_ncid(int ncid, const char *name, int *grp_ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_ncid(ncid,name,grp_ncid); +} + +int +nc_inq_grps(int ncid, int *numgrps, int *ncids) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_grps(ncid,numgrps,ncids); +} + +int +nc_inq_grpname(int ncid, char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_grpname(ncid,name); +} + +int +nc_inq_grpname_full(int ncid, size_t *lenp, char *full_name) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_grpname_full(ncid,lenp,full_name); +} + +int +nc_inq_grpname_len(int ncid, size_t *lenp) +{ + int stat = nc_inq_grpname_full(ncid,lenp,NULL); + return stat; +} + +int +nc_inq_grp_parent(int ncid, int *parent_ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_grp_parent(ncid,parent_ncid); +} + +/* This has same semantics as nc_inq_ncid */ +int +nc_inq_grp_ncid(int ncid, const char *grp_name, int *grp_ncid) +{ + return nc_inq_ncid(ncid,grp_name,grp_ncid); +} + +int +nc_inq_grp_full_ncid(int ncid, const char *full_name, int *grp_ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_grp_full_ncid(ncid,full_name,grp_ncid); +} + +int +nc_inq_varids(int ncid, int *nvars, int *varids) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_varids(ncid,nvars,varids); +} + +int +nc_inq_dimids(int ncid, int *ndims, int *dimids, int include_parents) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_dimids(ncid,ndims,dimids,include_parents); +} + +int +nc_inq_typeids(int ncid, int *ntypes, int *typeids) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_typeids(ncid,ntypes,typeids); +} + +int +nc_def_grp(int parent_ncid, const char *name, int *new_ncid) +{ + NC* ncp; + int stat = NC_check_id(parent_ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_grp(parent_ncid,name,new_ncid); +} + + + +int +nc_show_metadata(int ncid) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->show_metadata(ncid); +} + +/** \} */ diff --git a/extern/src_netcdf4/dim.c b/extern/src_netcdf4/dim.c new file mode 100644 index 0000000..aca6523 --- /dev/null +++ b/extern/src_netcdf4/dim.c @@ -0,0 +1,497 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: dim.c,v 1.83 2010/05/25 17:54:15 dmh Exp $ */ + +#include "nc.h" +#include +#include +#include +#include "ncx.h" +#include "fbits.h" +#include "utf8proc.h" + +/* + * Free dim + * Formerly +NC_free_dim(dim) + */ +void +free_NC_dim(NC_dim *dimp) +{ + if(dimp == NULL) + return; + free_NC_string(dimp->name); + free(dimp); +} + + +NC_dim * +new_x_NC_dim(NC_string *name) +{ + NC_dim *dimp; + + dimp = (NC_dim *) malloc(sizeof(NC_dim)); + if(dimp == NULL) + return NULL; + + dimp->name = name; + dimp->hash = hash_fast(name->cp, strlen(name->cp)); + dimp->size = 0; + + return(dimp); +} + + +/* + * Formerly +NC_new_dim(const char *uname, long size) + */ +static NC_dim * +new_NC_dim(const char *uname, size_t size) +{ + NC_string *strp; + NC_dim *dimp; + + char *name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NULL; + strp = new_NC_string(strlen(name), name); + free(name); + if(strp == NULL) + return NULL; + + dimp = new_x_NC_dim(strp); + if(dimp == NULL) + { + free_NC_string(strp); + return NULL; + } + + dimp->size = size; + + return(dimp); +} + + +static NC_dim * +dup_NC_dim(const NC_dim *dimp) +{ + return new_NC_dim(dimp->name->cp, dimp->size); +} + +/* + * Step thru NC_DIMENSION array, seeking the UNLIMITED dimension. + * Return dimid or -1 on not found. + * *dimpp is set to the appropriate NC_dim. + * The loop structure is odd. In order to parallelize, + * we moved a clearer 'break' inside the loop body to the loop test. + */ +int +find_NC_Udim(const NC_dimarray *ncap, NC_dim **dimpp) +{ + assert(ncap != NULL); + + if(ncap->nelems == 0) + return -1; + + { + int dimid = 0; + NC_dim **loc = ncap->value; + + for(; (size_t) dimid < ncap->nelems + && (*loc)->size != NC_UNLIMITED; dimid++, loc++) + { + /*EMPTY*/ + } + if(dimid >= ncap->nelems) + return(-1); /* not found */ + /* else, normal return */ + if(dimpp != NULL) + *dimpp = *loc; + return dimid; + } +} + + +/* + * Step thru NC_DIMENSION array, seeking match on uname. + * Return dimid or -1 on not found. + * *dimpp is set to the appropriate NC_dim. + * The loop structure is odd. In order to parallelize, + * we moved a clearer 'break' inside the loop body to the loop test. + */ +static int +NC_finddim(const NC_dimarray *ncap, const char *uname, NC_dim **dimpp) +{ + + int dimid; + uint32_t shash; + NC_dim ** loc; + char *name; + + assert(ncap != NULL); + + if(ncap->nelems == 0) + return -1; + + { + dimid = 0; + loc = (NC_dim **) ncap->value; + /* normalized version of uname */ + name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NC_ENOMEM; + shash = hash_fast(name, strlen(name)); + + for(; (size_t) dimid < ncap->nelems + && ((*loc)->hash != shash + || strncmp((*loc)->name->cp, name, strlen(name)) != 0); + dimid++, loc++) + { + /*EMPTY*/ + } + free(name); + if(dimid >= ncap->nelems) + return(-1); /* not found */ + /* else, normal return */ + if(dimpp != NULL) + *dimpp = *loc; + return(dimid); + } +} + + +/* dimarray */ + + +/* + * Free the stuff "in" (referred to by) an NC_dimarray. + * Leaves the array itself allocated. + */ +void +free_NC_dimarrayV0(NC_dimarray *ncap) +{ + assert(ncap != NULL); + + if(ncap->nelems == 0) + return; + + assert(ncap->value != NULL); + + { + NC_dim **dpp = ncap->value; + NC_dim *const *const end = &dpp[ncap->nelems]; + for( /*NADA*/; dpp < end; dpp++) + { + free_NC_dim(*dpp); + *dpp = NULL; + } + } + ncap->nelems = 0; +} + + +/* + * Free NC_dimarray values. + * formerly +NC_free_array() + */ +void +free_NC_dimarrayV(NC_dimarray *ncap) +{ + assert(ncap != NULL); + + if(ncap->nalloc == 0) + return; + + assert(ncap->value != NULL); + + free_NC_dimarrayV0(ncap); + + free(ncap->value); + ncap->value = NULL; + ncap->nalloc = 0; +} + + +int +dup_NC_dimarrayV(NC_dimarray *ncap, const NC_dimarray *ref) +{ + int status = NC_NOERR; + + assert(ref != NULL); + assert(ncap != NULL); + + if(ref->nelems != 0) + { + const size_t sz = ref->nelems * sizeof(NC_dim *); + ncap->value = (NC_dim **) malloc(sz); + if(ncap->value == NULL) + return NC_ENOMEM; + (void) memset(ncap->value, 0, sz); + ncap->nalloc = ref->nelems; + } + + ncap->nelems = 0; + { + NC_dim **dpp = ncap->value; + const NC_dim **drpp = (const NC_dim **)ref->value; + NC_dim *const *const end = &dpp[ref->nelems]; + for( /*NADA*/; dpp < end; drpp++, dpp++, ncap->nelems++) + { + *dpp = dup_NC_dim(*drpp); + if(*dpp == NULL) + { + status = NC_ENOMEM; + break; + } + } + } + + if(status != NC_NOERR) + { + free_NC_dimarrayV(ncap); + return status; + } + + assert(ncap->nelems == ref->nelems); + + return NC_NOERR; +} + + +/* + * Add a new handle on the end of an array of handles + * Formerly +NC_incr_array(array, tail) + */ +static int +incr_NC_dimarray(NC_dimarray *ncap, NC_dim *newelemp) +{ + NC_dim **vp; + + assert(ncap != NULL); + + if(ncap->nalloc == 0) + { + assert(ncap->nelems == 0); + vp = (NC_dim **) malloc(NC_ARRAY_GROWBY * sizeof(NC_dim *)); + if(vp == NULL) + return NC_ENOMEM; + ncap->value = vp; + ncap->nalloc = NC_ARRAY_GROWBY; + } + else if(ncap->nelems +1 > ncap->nalloc) + { + vp = (NC_dim **) realloc(ncap->value, + (ncap->nalloc + NC_ARRAY_GROWBY) * sizeof(NC_dim *)); + if(vp == NULL) + return NC_ENOMEM; + ncap->value = vp; + ncap->nalloc += NC_ARRAY_GROWBY; + } + + if(newelemp != NULL) + { + ncap->value[ncap->nelems] = newelemp; + ncap->nelems++; + } + return NC_NOERR; +} + + +NC_dim * +elem_NC_dimarray(const NC_dimarray *ncap, size_t elem) +{ + assert(ncap != NULL); + /* cast needed for braindead systems with signed size_t */ + if(ncap->nelems == 0 || (unsigned long) elem >= ncap->nelems) + return NULL; + + assert(ncap->value != NULL); + + return ncap->value[elem]; +} + + +/* Public */ + +int +NC3_def_dim(int ncid, const char *name, size_t size, int *dimidp) +{ + int status; + NC *ncp; + int dimid; + NC_dim *dimp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(!NC_indef(ncp)) + return NC_ENOTINDEFINE; + + status = NC_check_name(name); + if(status != NC_NOERR) + return status; + + if ((ncp->flags & NC_64BIT_OFFSET) && sizeof(off_t) > 4) { + /* CDF2 format and LFS */ + if(size > X_UINT_MAX - 3) /* "- 3" handles rounded-up size */ + return NC_EDIMSIZE; + } else { + /* CDF1 format */ + if(size > X_INT_MAX - 3) + return NC_EDIMSIZE; + } + + if(size == NC_UNLIMITED) + { + dimid = find_NC_Udim(&ncp->dims, &dimp); + if(dimid != -1) + { + assert(dimid != -1); + return NC_EUNLIMIT; + } + } + + if(ncp->dims.nelems >= NC_MAX_DIMS) + return NC_EMAXDIMS; + + dimid = NC_finddim(&ncp->dims, name, &dimp); + if(dimid != -1) + return NC_ENAMEINUSE; + + dimp = new_NC_dim(name, size); + if(dimp == NULL) + return NC_ENOMEM; + status = incr_NC_dimarray(&ncp->dims, dimp); + if(status != NC_NOERR) + { + free_NC_dim(dimp); + return status; + } + + if(dimidp != NULL) + *dimidp = (int)ncp->dims.nelems -1; + return NC_NOERR; +} + + +int +NC3_inq_dimid(int ncid, const char *name, int *dimid_ptr) +{ + int status; + NC *ncp; + int dimid; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + dimid = NC_finddim(&ncp->dims, name, NULL); + + if(dimid == -1) + return NC_EBADDIM; + + if (dimid_ptr) + *dimid_ptr = dimid; + return NC_NOERR; +} + +int +NC3_inq_dim(int ncid, int dimid, char *name, size_t *sizep) +{ + int status; + NC *ncp; + NC_dim *dimp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + dimp = elem_NC_dimarray(&ncp->dims, (size_t)dimid); + if(dimp == NULL) + return NC_EBADDIM; + + if(name != NULL) + { + (void)strncpy(name, dimp->name->cp, + dimp->name->nchars); + name[dimp->name->nchars] = 0; + } + if(sizep != NULL) + { + if(dimp->size == NC_UNLIMITED) + *sizep = NC_get_numrecs(ncp); + else + *sizep = dimp->size; + } + return NC_NOERR; +} + +int +NC3_rename_dim( int ncid, int dimid, const char *unewname) +{ + int status; + NC *ncp; + int existid; + NC_dim *dimp; + char *newname; /* normalized */ + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + return NC_EPERM; + + status = NC_check_name(unewname); + if(status != NC_NOERR) + return status; + + existid = NC_finddim(&ncp->dims, unewname, &dimp); + if(existid != -1) + return NC_ENAMEINUSE; + + dimp = elem_NC_dimarray(&ncp->dims, (size_t)dimid); + if(dimp == NULL) + return NC_EBADDIM; + + newname = (char *)utf8proc_NFC((const unsigned char *)unewname); + if(newname == NULL) + return NC_ENOMEM; + if(NC_indef(ncp)) + { + NC_string *old = dimp->name; + NC_string *newStr = new_NC_string(strlen(newname), newname); + free(newname); + if(newStr == NULL) + return NC_ENOMEM; + dimp->name = newStr; + dimp->hash = hash_fast(newStr->cp, strlen(newStr->cp)); + free_NC_string(old); + return NC_NOERR; + } + + /* else, not in define mode */ + + status = set_NC_string(dimp->name, newname); + dimp->hash = hash_fast(newname, strlen(newname)); + free(newname); + if(status != NC_NOERR) + return status; + + set_NC_hdirty(ncp); + + if(NC_doHsync(ncp)) + { + status = NC_sync(ncp); + if(status != NC_NOERR) + return status; + } + + return NC_NOERR; +} diff --git a/extern/src_netcdf4/dnclog.c b/extern/src_netcdf4/dnclog.c new file mode 100644 index 0000000..a107b04 --- /dev/null +++ b/extern/src_netcdf4/dnclog.c @@ -0,0 +1,166 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header$ + *********************************************************************/ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "nclog.h" + +#define PREFIXLEN 8 +#define MAXTAGS 256 +#define NCTAGDFALT "Log"; + +static int ncinitlog = 0; +static int nclogging = 0; +static int ncsystemfile = 0; +static char* nclogfile = NULL; +static FILE* nclogstream = NULL; + +static int nctagsize = 0; +static char** nctagset = NULL; +static char* nctagdfalt = NULL; +static char* nctagsetdfalt[] = {"Warning","Error","Note","Debug"}; +static char* nctagname(int tag); + +void +ncloginit(void) +{ + ncinitlog = 1; + ncsetlogging(0); + nclogfile = NULL; + nclogstream = NULL; + /* Use environment variables to preset nclogging state*/ + /* I hope this is portable*/ + if(getenv(ENVFLAG) != NULL) { + const char* file = getenv(ENVFLAG); + ncsetlogging(1); + nclogopen(file); + } + nctagdfalt = NCTAGDFALT; + nctagset = nctagsetdfalt; +} + +void +ncsetlogging(int tf) +{ + if(!ncinitlog) ncloginit(); + nclogging = tf; +} + +void +nclogopen(const char* file) +{ + if(!ncinitlog) ncloginit(); + nclogclose(); + if(file == NULL || strlen(file) == 0) { + /* use stderr*/ + nclogstream = stderr; + nclogfile = NULL; + ncsystemfile = 1; + } else if(strcmp(file,"stdout") == 0) { + /* use stdout*/ + nclogstream = stdout; + nclogfile = NULL; + ncsystemfile = 1; + } else if(strcmp(file,"stderr") == 0) { + /* use stderr*/ + nclogstream = stderr; + nclogfile = NULL; + ncsystemfile = 1; + } else { + int fd; + nclogfile = strdup(file); + nclogstream = NULL; + /* We need to deal with this file carefully + to avoid unauthorized access*/ + fd = open(nclogfile,O_WRONLY|O_APPEND|O_CREAT,0600); + if(fd >= 0) { + nclogstream = fdopen(fd,"a"); + } else { + free(nclogfile); + nclogfile = NULL; + nclogstream = NULL; + ncsetlogging(0); + } + ncsystemfile = 0; + } +} + +void +nclogclose(void) +{ + if(nclogstream != NULL && !ncsystemfile) { + fclose(nclogstream); + } + if(nclogfile != NULL) free(nclogfile); + nclogstream = NULL; + nclogfile = NULL; + ncsystemfile = 0; +} + +void +nclog(int tag, const char* fmt, ...) +{ + va_list args; + char* prefix; + if(!nclogging || nclogstream == NULL) return; + + prefix = nctagname(tag); + fprintf(nclogstream,"%s:",prefix); + + if(fmt != NULL) { + va_start(args, fmt); + vfprintf(nclogstream, fmt, args); + va_end( args ); + } + fprintf(nclogstream, "\n" ); + fflush(nclogstream); +} + +void +nclogtext(int tag, const char* text) +{ + nclogtextn(tag,text,strlen(text)); +} + +void +nclogtextn(int tag, const char* text, size_t count) +{ + if(!nclogging || nclogstream == NULL) return; + fwrite(text,1,count,nclogstream); + fflush(nclogstream); +} + +/* The tagset is null terminated */ +void +nclogsettags(char** tagset, char* dfalt) +{ + nctagdfalt = dfalt; + if(tagset == NULL) { + nctagsize = 0; + } else { + int i; + /* Find end of the tagset */ + for(i=0;i= nctagsize) { + return nctagdfalt; + } else { + return nctagset[tag]; + } +} diff --git a/extern/src_netcdf4/dopaque.c b/extern/src_netcdf4/dopaque.c new file mode 100644 index 0000000..b9065af --- /dev/null +++ b/extern/src_netcdf4/dopaque.c @@ -0,0 +1,70 @@ +/*! \file + Functions for Opaque Types + + Copyright 2011 University Corporation for Atmospheric + Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Opaque Types + Functions to create and learn about opaque types. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** \ingroup user_types +Create an opaque type. Provide a size and a name. + +\param ncid \ref ncid +\param size The size of each opaque object in bytes. +\param name \ref object_name of the new type. +\param xtypep Pointer where the new typeid for this type is returned. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. + */ +int +nc_def_opaque(int ncid, size_t size, const char *name, nc_type *xtypep) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_opaque(ncid,size,name,xtypep); +} + +/** \ingroup user_types +Learn about an opaque type. + +\param ncid \ref ncid + +\param xtype Typeid to inquire about. + +\param name The \ref object_name of this type will be +copied here. \ref ignored_if_null. + +\param sizep The size of the type will be copied here. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_opaque(int ncid, nc_type xtype, char *name, size_t *sizep) +{ + int class = 0; + int stat = nc_inq_user_type(ncid,xtype,name,sizep,NULL,NULL,&class); + if(stat != NC_NOERR) return stat; + if(class != NC_OPAQUE) stat = NC_EBADTYPE; + return stat; +} + +/*! \} */ /* End of named group ...*/ diff --git a/extern/src_netcdf4/dparallel.c b/extern/src_netcdf4/dparallel.c new file mode 100644 index 0000000..cffb719 --- /dev/null +++ b/extern/src_netcdf4/dparallel.c @@ -0,0 +1,130 @@ +/** \file +This file has the parallel I/O functions. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include +#include +#include "ncdispatch.h" + +/* This function creates a file for use with parallel I/O. */ +int +nc_create_par(const char *path, int cmode, MPI_Comm comm, + MPI_Info info, int *ncidp) +{ +#ifndef USE_PARALLEL + return NC_ENOPAR; +#else + NC_MPI_INFO data; + MPI_Comm comm_c = 0; + MPI_Info info_c = 0; + + /* One of these two parallel IO modes must be chosen by the user, + * or else pnetcdf must be in use. */ + if (!(cmode & NC_MPIIO || cmode & NC_MPIPOSIX) && + !(cmode & NC_PNETCDF)) + return NC_EINVAL; + + comm_c = (MPI_Comm)comm; + info_c = (MPI_Info)info; + + data.comm = comm_c; + data.info = info_c; + return NC_create(path, cmode, 0, 0, NULL, 1, &data, ncidp); +#endif /* USE_PARALLEL */ +} + +/* This function opens a file for parallel I/O. */ +int +nc_open_par(const char *path, int mode, MPI_Comm comm, + MPI_Info info, int *ncidp) +{ +#ifndef USE_PARALLEL + return NC_ENOPAR; +#else + NC_MPI_INFO mpi_data; + + /* One of these two parallel IO modes must be chosen by the user, + * or else pnetcdf must be in use. */ + if (!(mode & NC_MPIIO || mode & NC_MPIPOSIX) && + !(mode & NC_PNETCDF)) + return NC_EINVAL; + + mpi_data.comm = comm; + mpi_data.info = info; + + return NC_open(path, mode, 0, NULL, 1, &mpi_data, ncidp); +#endif /* USE_PARALLEL */ +} + +/* Fortran needs to pass MPI comm/info as integers. */ +int +nc_open_par_fortran(const char *path, int mode, int comm, + int info, int *ncidp) +{ +#ifndef USE_PARALLEL + return NC_ENOPAR; +#else + + MPI_Comm comm_c = 0; + MPI_Info info_c = 0; + + /* Convert fortran comm and info to C comm and info, if there is a + * function to do so. Otherwise just pass them. */ +#ifdef HAVE_MPI_COMM_F2C + comm_c = MPI_Comm_f2c(comm); + info_c = MPI_Info_f2c(info); +#else + comm_c = (MPI_Comm)comm; + info_c = (MPI_Info)info; +#endif + + return nc_open_par(path, mode, comm_c, info_c, ncidp); +#endif +} + +/* This function will change the parallel access of a variable from + * independent to collective. */ +int +nc_var_par_access(int ncid, int varid, int par_access) +{ + NC* ncp; + int stat = NC_NOERR; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + +#ifndef USE_PARALLEL + return NC_ENOPAR; +#else + return ncp->dispatch->var_par_access(ncid,varid,par_access); +#endif +} + +/* when calling from fortran: convert MPI_Comm and MPI_Info to C */ +int +nc_create_par_fortran(const char *path, int cmode, int comm, + int info, int *ncidp) +{ +#ifndef USE_PARALLEL + return NC_ENOPAR; +#else + MPI_Comm comm_c = 0; + MPI_Info info_c = 0; +#ifdef USE_PARALLEL +#ifdef HAVE_MPI_COMM_F2C + comm_c = MPI_Comm_f2c(comm); + info_c = MPI_Info_f2c(info); +#else + comm_c = (MPI_Comm)comm; + info_c = (MPI_Info)info; +#endif +#endif + return nc_create_par(path, cmode, comm_c, info_c, ncidp); +#endif +} + + + diff --git a/extern/src_netcdf4/dstring.c b/extern/src_netcdf4/dstring.c new file mode 100644 index 0000000..e8bb008 --- /dev/null +++ b/extern/src_netcdf4/dstring.c @@ -0,0 +1,302 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: string.c,v 1.76 2010/05/26 21:43:33 dmh Exp $ */ + +#include "config.h" +#include +#include +#include +#include +#include +#include "nc.h" +#include "rnd.h" +#include "utf8proc.h" + + +/* There are 3 levels of UTF8 checking: 1=> (exact)validating 2=>relaxed + and 3=>very relaxed +*/ +/* Use semi-relaxed check */ +#define UTF8_CHECK 2 + +/* + * Free string, and, if needed, its values. + * Formerly +NC_free_string() + */ +void +free_NC_string(NC_string *ncstrp) +{ + if(ncstrp==NULL) + return; + free(ncstrp); +} + + +int +nextUTF8(const char* cp) +{ + /* The goal here is to recognize the length of each + multibyte utf8 character sequence and skip it. + Again, we assume that every non-ascii character is legal. + We can define three possible tests of decreasing correctness + (in the sense that the least correct will allow some sequences that + are technically illegal UTF8). + As Regular expressions they are as follows: + 1. most correct: + UTF8 ([\xC2-\xDF][\x80-\xBF]) \ + | (\xE0[\xA0-\xBF][\x80-\xBF]) \ + | ([\xE1-\xEC][\x80-\xBF][\x80-\xBF]) \ + | (\xED[\x80-\x9F][\x80-\xBF]) \ + | ([\xEE-\xEF][\x80-\xBF][\x80-\xBF]) \ + | (\xF0[\x90-\xBF][\x80-\xBF][\x80-\xBF]) \ + | ([\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]) \ + | (\xF4[\x80-\x8F][\x80-\xBF][\x80-\xBF]) \ + + 2. partially relaxed: + UTF8 ([\xC0-\xDF][\x80-\xBF]) + |([\xE0-\xEF][\x80-\xBF][\x80-\xBF]) + |([\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]) + + 3. The most relaxed version of UTF8: + UTF8 ([\xC0-\xD6].)|([\xE0-\xEF]..)|([\xF0-\xF7]...) + + We use #2 here. + + The tests are derived from the table at + http://www.w3.org/2005/03/23-lex-U + */ + +/* Define a test macro to test against a range */ +#define RANGE(c,lo,hi) (((uchar)c) >= lo && ((uchar)c) <= hi) +/* Define a common RANGE */ +#define RANGE0(c) RANGE(c,0x80,0xBF) + + int ch0; + + int skip = -1; /* assume failed */ + + ch0 = (uchar)*cp; + if(ch0 <= 0x7f) skip = 1; /* remove ascii case */ + else + +#if UTF8_CHECK == 2 + /* Do relaxed validation check */ + if(RANGE(ch0,0xC0,0XDF)) {/* 2-bytes, but check */ + if(cp[1] != 0 && RANGE0(cp[1])) + skip = 2; /* two bytes */ + } else if(RANGE(ch0,0xE0,0XEF)) {/* 3-bytes, but check */ + if(cp[1] != 0 && RANGE0(cp[1]) && cp[2] != 0 && RANGE0(cp[1])) + skip = 3; /* three bytes */ + } else if(RANGE(ch0,0xF0,0XF7)) {/* 3-bytes, but check */ + if(cp[1] != 0 && RANGE0(cp[1]) && cp[2] != 0 + && RANGE0(cp[1]) && cp[3] != 0 && RANGE0(cp[1])) + skip = 4; /* four bytes*/ + } +#elif UTF8_CHECK == 1 + /* Do exact validation check */ + if(RANGE(ch0,0xC2,0xDF)) {/* non-overlong 2-bytes */ + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE0(ch1)) skip = 2; + } else if((ch0 == 0xE0)) {/* 3-bytes, not overlong */ + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE(ch1,0xA0,0xBF)) { + int ch2 = (uchar)cp[2]; + if(ch2 != 0 && RANGE0(ch2)) skip = 3; + } else if((ch0 == 0xED)) {/* 3-bytes minus surrogates */ + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE(ch1,0x80,0x9f)) { + int ch2 = (uchar)cp[2]; + if(ch2 != 0 && RANGE0(ch2)) skip = 3; + } else if(RANGE(ch0,0xE1,0xEC) || ch0 == 0xEE || ch0 == 0xEF) + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE0(ch1)) { + int ch2 = (uchar)cp[2]; + if(ch2 != 0 && RANGE0(ch2)) skip = 3; + } + } else if((ch0 == 0xF0)) {/* planes 1-3 */ + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE(ch1,0x90,0xBF) { + int ch2 = (uchar)cp[2]; + if(ch2 != 0 && RANGE0(ch2)) { + int ch3 = (uchar)cp[3]; + if(ch3 != 0 && RANGE0(ch3)) skip = 4; + } + } + } else if((ch0 == 0xF4)) {/* plane 16 */ + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE0(ch1)) { + int ch2 = (uchar)cp[2]; + if(ch2 != 0 && RANGE0(ch2)) { + int ch3 = (uchar)cp[3]; + if(ch3 != 0 && RANGE0(ch3)) skip = 4; + } + } + } else if(RANGE(ch0,0xF1,0xF3) { /* planes 4-15 */ + int ch1 = (uchar)cp[1]; + if(ch1 != 0 && RANGE0(ch1)) { + int ch2 = (uchar)cp[2]; + if(ch2 != 0 && RANGE0(ch2)) { + int ch3 = (uchar)cp[3]; + if(ch3 != 0 && RANGE0(ch3)) skip = 4; + } + } + } +#else +#error "Must Define UTF8_CHECK as 1 or 2" +#endif + return skip; +} + + +/* + * Verify that a name string is valid syntax. The allowed name + * syntax (in RE form) is: + * + * ([a-zA-Z0-9_]|{UTF8})([^\x00-\x1F\x7F/]|{UTF8})* + * + * where UTF8 represents a multibyte UTF-8 encoding. Also, no + * trailing spaces are permitted in names. This definition + * must be consistent with the one in ncgen.l. We do not allow '/' + * because HDF5 does not permit slashes in names as slash is used as a + * group separator. If UTF-8 is supported, then a multi-byte UTF-8 + * character can occur anywhere within an identifier. We later + * normalize UTF-8 strings to NFC to facilitate matching and queries. + */ +int +NC_check_name(const char *name) +{ + int skip; + int ch; + const char *cp = name; + ssize_t utf8_stat; + + assert(name != NULL); + + if(*name == 0 /* empty names disallowed */ + || strchr(cp, '/')) /* '/' can't be in a name */ + goto fail; + + /* check validity of any UTF-8 */ + utf8_stat = utf8proc_check((const unsigned char *)name); + if (utf8_stat < 0) + goto fail; + + /* First char must be [a-z][A-Z][0-9]_ | UTF8 */ + ch = (uchar)*cp; + if(ch <= 0x7f) { + if( !('A' <= ch && ch <= 'Z') + && !('a' <= ch && ch <= 'z') + && !('0' <= ch && ch <= '9') + && ch != '_' ) + goto fail; + cp++; + } else { + if((skip = nextUTF8(cp)) < 0) + goto fail; + cp += skip; + } + + while(*cp != 0) { + ch = (uchar)*cp; + /* handle simple 0x00-0x7f characters here */ + if(ch <= 0x7f) { + if( ch < ' ' || ch > 0x7E) /* control char or DEL */ + goto fail; + cp++; + } else { + if((skip = nextUTF8(cp)) < 0) goto fail; + cp += skip; + } + if(cp - name > NC_MAX_NAME) + return NC_EMAXNAME; + } + if(ch <= 0x7f && isspace(ch)) /* trailing spaces disallowed */ + goto fail; + return NC_NOERR; +fail: + return NC_EBADNAME; +} + + +/* + * Allocate a NC_string structure large enough + * to hold slen characters. + * Formerly +NC_new_string(count, str) + */ +NC_string * +new_NC_string(size_t slen, const char *str) +{ + NC_string *ncstrp; + size_t sz = M_RNDUP(sizeof(NC_string)) + slen + 1; + +#if 0 + sz = _RNDUP(sz, X_ALIGN); +#endif + + ncstrp = (NC_string *)malloc(sz); + if( ncstrp == NULL ) + return NULL; + (void) memset(ncstrp, 0, sz); + + ncstrp->nchars = sz - M_RNDUP(sizeof(NC_string)) - 1; + assert(ncstrp->nchars + 1 > slen); + ncstrp->cp = (char *)ncstrp + M_RNDUP(sizeof(NC_string)); + + if(str != NULL && *str != 0) + { + (void) strncpy(ncstrp->cp, str, ncstrp->nchars +1); + ncstrp->cp[ncstrp->nchars] = 0; + } + + return(ncstrp); +} + + +/* + * If possible, change the value of an NC_string to 'str'. + * + * Formerly +NC_re_string() + */ +int +set_NC_string(NC_string *ncstrp, const char *str) +{ + size_t slen; + + assert(str != NULL && *str != 0); + + slen = strlen(str); + + if(ncstrp->nchars < slen) + return NC_ENOTINDEFINE; + + strncpy(ncstrp->cp, str, ncstrp->nchars); + /* Don't adjust ncstrp->nchars, it includes extra space in the + * header for potential later expansion of string. */ + + return NC_NOERR; +} + +/**************************************************/ +/* Provide local alternatives for unix functions + not available on all machines. Place here so that + all subsequence code modules can use it. +*/ + +#ifndef HAVE_STRDUP +char* +strdup(const char* s) +{ + char* dup; + if(s == NULL) return NULL; + dup = malloc(strlen(s)+1); + strcpy(dup,s); + return dup; +} +#endif + +/**************************************************/ diff --git a/extern/src_netcdf4/dsubstrate.c b/extern/src_netcdf4/dsubstrate.c new file mode 100644 index 0000000..b79b963 --- /dev/null +++ b/extern/src_netcdf4/dsubstrate.c @@ -0,0 +1,915 @@ +/** \substrate +Define the substrate dispatch table and functions + +These functions end up calling functions in one of the dispatch layers +(netCDF-4, dap server, etc) using the substrate field of struct NC. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include "netcdf.h" +#include "ncdispatch.h" + +/* forward */ +static NC_Dispatch NCSUBSTRATE_dispatch_base; + +/* +Note that because many of the signatures differ +from the netcdf API, we need to break +the abstraction and invoke the +substrate dispatch table directly. +*/ + + +int +NCSUBSTRATE_initialize(void) +{ + NCSUBSTRATE_dispatch_table = &NCSUBSTRATE_dispatch_base; + return NC_NOERR; +} + +static int +NCSUB_new_nc(NC** ncp) +{ + NC* nc; + /* Allocate memory for this info. */ + if (!(nc = calloc(1, sizeof(struct NC)))) + return NC_ENOMEM; + if(ncp) *ncp = nc; + return NC_NOERR; +} + +static int +NCSUB_redef(int ncid) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate,&ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->redef(nc->substrate); +} + +static int +NCSUB__enddef(int ncid, size_t a1, size_t a2, size_t a3, size_t a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->_enddef(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_sync(int ncid) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->sync(nc->substrate); +} + +static int +NCSUB_abort(int ncid) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->abort(nc->substrate); +} + +static int +NCSUB_close(int ncid) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->close(nc->substrate); +} + +static int +NCSUB_set_fill(int ncid, int a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->set_fill(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_base_pe(int ncid, int* a1) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_base_pe(nc->substrate,a1); +} + +static int +NCSUB_set_base_pe(int ncid, int a1) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->set_base_pe(nc->substrate,a1); +} + +static int +NCSUB_inq_format(int ncid, int* a1) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_format(nc->substrate,a1); +} + +static int +NCSUB_inq(int ncid, int* a1, int* a2, int* a3, int* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_inq_type(int ncid, nc_type a1, char* a2, size_t* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_type(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_def_dim(int ncid, const char* a1, size_t a2, int* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_dim(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_inq_dimid(int ncid, const char* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_dimid(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_dim(int ncid, int a1, char* a2, size_t* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_dim(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_inq_unlimdim(int ncid, int* a1) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_unlimdim(nc->substrate,a1); +} + +static int +NCSUB_rename_dim(int ncid, int a1, const char* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->rename_dim(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_att(int ncid, int a1, const char* a2, nc_type* a3, size_t* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_att(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_inq_attid(int ncid, int a1, const char* a2, int* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_attid(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_inq_attname(int ncid, int a1, int a2, char* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_attname(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_rename_att(int ncid, int a1, const char* a2, const char* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->rename_att(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_del_att(int ncid, int a1, const char* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->del_att(nc->substrate,a1,a2); +} + +static int +NCSUB_get_att(int ncid, int a1, const char* a2, void* a3, nc_type a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->get_att(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_put_att(int ncid, int a1, const char* a2, nc_type a3, size_t a4, const void* a5, nc_type a6) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->put_att(nc->substrate,a1,a2,a3,a4,a5,a6); +} + +static int +NCSUB_def_var(int ncid, const char* a1, nc_type a2, int a3, const int* a4, int* a5) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_var(nc->substrate,a1,a2,a3,a4,a5); +} + +static int +NCSUB_inq_varid(int ncid, const char* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_varid(nc->substrate,a1,a2); +} + +static int +NCSUB_rename_var(int ncid, int a1, const char* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->rename_var(nc->substrate,a1,a2); +} + +static int +NCSUB_get_vara(int ncid, int a1, const size_t* a2, const size_t* a3, void* a4, nc_type a5) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->get_vara(nc->substrate,a1,a2,a3,a4,a5); +} + +static int +NCSUB_put_vara(int ncid, int a1, const size_t* a2, const size_t* a3, const void* a4, nc_type a5) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->put_vara(nc->substrate,a1,a2,a3,a4,a5); +} + +/* Added to solve Ferret performance problem with Opendap */ +static int +NCSUB_get_vars(int ncid, int a1, const size_t* a2, const size_t* a3, const ptrdiff_t* a4, void* a5, nc_type a6) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->get_vars(nc->substrate,a1,a2,a3,a4,a5,a6); +} + +static int +NCSUB_put_vars(int ncid, int a1, const size_t* a2, const size_t* a3, const ptrdiff_t* a4, const void* a5, nc_type a6) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->put_vars(nc->substrate,a1,a2,a3,a4,a5,a6); +} + +static int +NCSUB_get_varm(int ncid, int a1, const size_t* a2, const size_t* a3, const ptrdiff_t* a4, const ptrdiff_t* a5, void* a6, nc_type a7) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->get_varm(nc->substrate,a1,a2,a3,a4,a5,a6,a7); +} + +static int +NCSUB_put_varm(int ncid, int a1, const size_t* a2, const size_t* a3, const ptrdiff_t* a4, const ptrdiff_t* a5, const void* a6, nc_type a7) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->put_varm(nc->substrate,a1,a2,a3,a4,a5,a6,a7); +} + + +static int +NCSUB_inq_var_all(int ncid, int varid, char* name, nc_type* xtypep, + int* ndimsp, int* dimidsp, int* nattsp, + int* shufflep, int* deflatep, int* deflate_levelp, + int* fletcher32p, int* contiguousp, size_t* chunksizesp, + int* no_fill, void* fill_valuep, int* endiannessp, + int* options_maskp, int* pixels_per_blockp) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_var_all(nc->substrate,varid,name,xtypep, + ndimsp,dimidsp,nattsp,shufflep, + deflatep,deflate_levelp,fletcher32p, + contiguousp,chunksizesp, + no_fill,fill_valuep, + endiannessp, + options_maskp,pixels_per_blockp); +} + +#ifdef USE_NETCDF4 + +static int +NCSUB_show_metadata(int ncid) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->show_metadata(nc->substrate); +} + +static int +NCSUB_inq_unlimdims(int ncid, int* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_unlimdims(nc->substrate,a1,a2); +} + +static int +NCSUB_var_par_access(int ncid, int a1, int a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->var_par_access(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_ncid(int ncid, const char* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_ncid(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_grps(int ncid, int* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_grps(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_grpname(int ncid, char* a1) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_grpname(nc->substrate,a1); +} + +static int +NCSUB_inq_grpname_full(int ncid, size_t* a1, char* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_grpname_full(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_grp_parent(int ncid, int* a1) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_grp_parent(nc->substrate,a1); +} + +static int +NCSUB_inq_grp_full_ncid(int ncid, const char* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_grp_full_ncid(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_varids(int ncid, int* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_varids(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_dimids(int ncid, int* a1, int* a2, int a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_dimids(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_inq_typeids(int ncid, int* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_typeids(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_type_equal(int ncid, nc_type a1, int a2, nc_type a3, int* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_type_equal(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_def_grp(int ncid, const char* a1, int* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_grp(nc->substrate,a1,a2); +} + +static int +NCSUB_inq_user_type(int ncid, nc_type a1, char* a2, size_t* a3, nc_type* a4, size_t* a5, int* a6) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_user_type(nc->substrate,a1,a2,a3,a4,a5,a6); +} + +static int +NCSUB_inq_typeid(int ncid, const char* a1, nc_type* a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_typeid(nc->substrate,a1,a2); +} + +static int +NCSUB_def_compound(int ncid, size_t a1, const char* a2, nc_type* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_compound(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_insert_compound(int ncid, nc_type a1, const char* a2, size_t a3, nc_type a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->insert_compound(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_insert_array_compound(int ncid, nc_type a1, const char* a2, size_t a3, nc_type a4, int a5, const int* a6) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->insert_array_compound(nc->substrate,a1,a2,a3,a4,a5,a6); +} + +static int +NCSUB_inq_compound_field(int ncid, nc_type a1, int a2, char* a3, size_t* a4, nc_type* a5, int* a6, int* a7) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_compound_field(nc->substrate,a1,a2,a3,a4,a5,a6,a7); +} + +static int +NCSUB_inq_compound_fieldindex(int ncid, nc_type a1, const char* a2, int* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_compound_fieldindex(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_def_vlen(int ncid, const char* a1, nc_type a2, nc_type* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_vlen(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_put_vlen_element(int ncid, int a1, void* a2, size_t a3, const void* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->put_vlen_element(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_get_vlen_element(int ncid, int a1, const void* a2, size_t* a3, void* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->get_vlen_element(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_def_enum(int ncid, nc_type a1, const char* a2, nc_type* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_enum(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_insert_enum(int ncid, nc_type a1, const char* a2, const void* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->insert_enum(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_inq_enum_member(int ncid, nc_type a1, int a2, char* a3, void* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_enum_member(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_inq_enum_ident(int ncid, nc_type a1, long long a2, char* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->inq_enum_ident(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_def_opaque(int ncid, size_t a1, const char* a2, nc_type* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_opaque(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_def_var_deflate(int ncid, int a1, int a2, int a3, int a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_var_deflate(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_def_var_fletcher32(int ncid, int a1, int a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_var_fletcher32(nc->substrate,a1,a2); +} + +static int +NCSUB_def_var_chunking(int ncid, int a1, int a2, const size_t* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_var_chunking(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_def_var_fill(int ncid, int a1, int a2, const void* a3) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_var_fill(nc->substrate,a1,a2,a3); +} + +static int +NCSUB_def_var_endian(int ncid, int a1, int a2) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->def_var_endian(nc->substrate,a1,a2); +} + +static int +NCSUB_set_var_chunk_cache(int ncid, int a1, size_t a2, size_t a3, float a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->set_var_chunk_cache(nc->substrate,a1,a2,a3,a4); +} + +static int +NCSUB_get_var_chunk_cache(int ncid, int a1, size_t* a2, size_t* a3, float* a4) +{ + NC *nc, *ncsub; + int ncstat = NC_check_id(ncid, &nc); + if(ncstat != NC_NOERR) return ncstat; + ncstat = NC_check_id(nc->substrate, &ncsub); + if(ncstat != NC_NOERR) return ncstat; + return ncsub->dispatch->get_var_chunk_cache(nc->substrate,a1,a2,a3,a4); +} + +#endif /*USE_NETCDF4*/ + +/* Declare here to avoid having a bunch of static forward declarations */ + +static NC_Dispatch NCSUBSTRATE_dispatch_base = { + +0, + +NCSUB_new_nc, + +NULL, /*NC_create*/ +NULL, /*NC_open*/ + +NCSUB_redef, +NCSUB__enddef, +NCSUB_sync, +NCSUB_abort, +NCSUB_close, +NCSUB_set_fill, +NCSUB_inq_base_pe, +NCSUB_set_base_pe, +NCSUB_inq_format, + +NCSUB_inq, +NCSUB_inq_type, + +NCSUB_def_dim, +NCSUB_inq_dimid, +NCSUB_inq_dim, +NCSUB_inq_unlimdim, +NCSUB_rename_dim, + +NCSUB_inq_att, +NCSUB_inq_attid, +NCSUB_inq_attname, +NCSUB_rename_att, +NCSUB_del_att, +NCSUB_get_att, +NCSUB_put_att, + +NCSUB_def_var, +NCSUB_inq_varid, +NCSUB_rename_var, + +NCSUB_get_vara, +NCSUB_put_vara, +NCSUB_get_vars, +NCSUB_put_vars, +NCSUB_get_varm, +NCSUB_put_varm, + +NCSUB_inq_var_all, + +#ifdef USE_NETCDF4 +NCSUB_show_metadata, +NCSUB_inq_unlimdims, + +NCSUB_var_par_access, + +NCSUB_inq_ncid, +NCSUB_inq_grps, +NCSUB_inq_grpname, +NCSUB_inq_grpname_full, +NCSUB_inq_grp_parent, +NCSUB_inq_grp_full_ncid, +NCSUB_inq_varids, +NCSUB_inq_dimids, +NCSUB_inq_typeids, +NCSUB_inq_type_equal, +NCSUB_def_grp, +NCSUB_inq_user_type, +NCSUB_inq_typeid, + +NCSUB_def_compound, +NCSUB_insert_compound, +NCSUB_insert_array_compound, +NCSUB_inq_compound_field, +NCSUB_inq_compound_fieldindex, +NCSUB_def_vlen, +NCSUB_put_vlen_element, +NCSUB_get_vlen_element, +NCSUB_def_enum, +NCSUB_insert_enum, +NCSUB_inq_enum_member, +NCSUB_inq_enum_ident, +NCSUB_def_opaque, +NCSUB_def_var_deflate, +NCSUB_def_var_fletcher32, +NCSUB_def_var_chunking, +NCSUB_def_var_fill, +NCSUB_def_var_endian, +NCSUB_set_var_chunk_cache, +NCSUB_get_var_chunk_cache + +#endif /*USE_NETCDF4*/ + +}; + +NC_Dispatch* NCSUBSTRATE_dispatch_table = NULL; /*Moved here from ddispatch.c*/ diff --git a/extern/src_netcdf4/dtype.c b/extern/src_netcdf4/dtype.c new file mode 100644 index 0000000..3594867 --- /dev/null +++ b/extern/src_netcdf4/dtype.c @@ -0,0 +1,111 @@ +/*! \file + Functions for User-Defined Types + + Copyright 2011 University Corporation for Atmospheric + Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \internal +\ingroup user_types +Learn if two types are equal + +\param ncid1 \ref ncid of first typeid. +\param typeid1 First typeid. +\param ncid2 \ref ncid of second typeid. +\param typeid2 Second typeid. +\param equal Pointer to int. A non-zero value will be copied here if +the two types are equal, a zero if they are not equal. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_type_equal(int ncid1, nc_type typeid1, int ncid2, + nc_type typeid2, int *equal) +{ + NC* ncp1; + int stat = NC_check_id(ncid1,&ncp1); + if(stat != NC_NOERR) return stat; + return ncp1->dispatch->inq_type_equal(ncid1,typeid1,ncid2,typeid2,equal); +} + +/** \name Learning about User-Defined Types + + Functions to learn about any kind of user-defined type. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** \ingroup user_types + +Find a type by name. Given a group ID and a type name, find the ID of +the type. If the type is not found in the group, then the parents are +searched. If still not found, the entire file is searched. + +\param ncid \ref ncid +\param name \ref object_name of type to search for. +\param typeidp Typeid of named type will be copied here, if it is +found. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_typeid(int ncid, const char *name, nc_type *typeidp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_typeid(ncid,name,typeidp); +} + +/** \ingroup user_types +Learn about a user defined type. + +Given an ncid and a typeid, get the information about a user defined +type. This function will work on any user defined type, whether +compound, opaque, enumeration, or variable length array. + +\param ncid \ref ncid + +\param xtype The typeid + +\param name The \ref object_name will be copied here. \ref +ignored_if_null. + +\param size the (in-memory) size of the type in bytes will be copied +here. VLEN type size is the size of nc_vlen_t. String size is returned +as the size of a character pointer. The size may be used to malloc +space for the data, no matter what the type. \ref ignored_if_null. + +\param base_nc_typep The base type will be copied here for enum and +VLEN types. \ref ignored_if_null. + +\param nfieldsp The number of fields will be copied here for enum and +compound types. \ref ignored_if_null. + +\param classp Return the class of the user defined type, ::NC_VLEN, +::NC_OPAQUE, ::NC_ENUM, or ::NC_COMPOUND. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_user_type(int ncid, nc_type xtype, char *name, size_t *size, + nc_type *base_nc_typep, size_t *nfieldsp, int *classp) +{ + NC *ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_user_type(ncid, xtype, name, size, + base_nc_typep, nfieldsp, classp); +} +/*! \} */ /* End of named group ...*/ diff --git a/extern/src_netcdf4/dutf8proc.c b/extern/src_netcdf4/dutf8proc.c new file mode 100644 index 0000000..d02169b --- /dev/null +++ b/extern/src_netcdf4/dutf8proc.c @@ -0,0 +1,590 @@ +/* + * Copyright (c) 2006-2007 Jan Behrens, FlexiGuided GmbH, Berlin + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * This library contains derived data from a modified version of the + * Unicode data files. + * + * The original data files are available at + * http://www.unicode.org/Public/UNIDATA/ + * + * Please notice the copyright statement in the file "utf8proc_data.c". + */ + + +/* + * File name: utf8proc.c + * Version: 1.1.1 + * Last changed: 2007-07-22 + * + * Description: + * Implementation of libutf8proc. + */ + + +#include "utf8proc.h" +#include "utf8proc_data.h" + +const int8_t utf8proc_utf8class[256] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define UTF8PROC_HANGUL_SBASE 0xAC00 +#define UTF8PROC_HANGUL_LBASE 0x1100 +#define UTF8PROC_HANGUL_VBASE 0x1161 +#define UTF8PROC_HANGUL_TBASE 0x11A7 +#define UTF8PROC_HANGUL_LCOUNT 19 +#define UTF8PROC_HANGUL_VCOUNT 21 +#define UTF8PROC_HANGUL_TCOUNT 28 +#define UTF8PROC_HANGUL_NCOUNT 588 +#define UTF8PROC_HANGUL_SCOUNT 11172 +/*// END is exclusive*/ +#define UTF8PROC_HANGUL_L_START 0x1100 +#define UTF8PROC_HANGUL_L_END 0x115A +#define UTF8PROC_HANGUL_L_FILLER 0x115F +#define UTF8PROC_HANGUL_V_START 0x1160 +#define UTF8PROC_HANGUL_V_END 0x11A3 +#define UTF8PROC_HANGUL_T_START 0x11A8 +#define UTF8PROC_HANGUL_T_END 0x11FA +#define UTF8PROC_HANGUL_S_START 0xAC00 +#define UTF8PROC_HANGUL_S_END 0xD7A4 + + +#define UTF8PROC_BOUNDCLASS_START 0 +#define UTF8PROC_BOUNDCLASS_OTHER 1 +#define UTF8PROC_BOUNDCLASS_CR 2 +#define UTF8PROC_BOUNDCLASS_LF 3 +#define UTF8PROC_BOUNDCLASS_CONTROL 4 +#define UTF8PROC_BOUNDCLASS_EXTEND 5 +#define UTF8PROC_BOUNDCLASS_L 6 +#define UTF8PROC_BOUNDCLASS_V 7 +#define UTF8PROC_BOUNDCLASS_T 8 +#define UTF8PROC_BOUNDCLASS_LV 9 +#define UTF8PROC_BOUNDCLASS_LVT 10 + + +const char *utf8proc_errmsg(ssize_t errcode) { + switch (errcode) { + case UTF8PROC_ERROR_NOMEM: + return "Memory for processing UTF-8 data could not be allocated."; + case UTF8PROC_ERROR_OVERFLOW: + return "UTF-8 string is too long to be processed."; + case UTF8PROC_ERROR_INVALIDUTF8: + return "Invalid UTF-8 string"; + case UTF8PROC_ERROR_NOTASSIGNED: + return "Unassigned Unicode code point found in UTF-8 string."; + case UTF8PROC_ERROR_INVALIDOPTS: + return "Invalid options for UTF-8 processing chosen."; + default: + return "An unknown error occured while processing UTF-8 data."; + } +} + +ssize_t utf8proc_iterate( + const uint8_t *str, ssize_t slen, int32_t *dst +) { + int length; + int i; + int32_t uc = -1; + *dst = -1; + if (!slen) return 0; + length = utf8proc_utf8class[str[0]]; + if (!length) return UTF8PROC_ERROR_INVALIDUTF8; + if (slen >= 0 && length > slen) return UTF8PROC_ERROR_INVALIDUTF8; + for (i=1; i= 0xD800 && uc < 0xE000) || + (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1; + break; + case 4: + uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) + + ((str[2] & 0x3F) << 6) + (str[3] & 0x3F); + if (uc < 0x10000 || uc >= 0x110000) uc = -1; + break; + } + if (uc < 0 || ((uc & 0xFFFF) >= 0xFFFE)) + return UTF8PROC_ERROR_INVALIDUTF8; + *dst = uc; + return length; +} + +bool utf8proc_codepoint_valid(int32_t uc) { + if (uc < 0 || uc >= 0x110000 || + ((uc & 0xFFFF) >= 0xFFFE) || (uc >= 0xD800 && uc < 0xE000) || + (uc >= 0xFDD0 && uc < 0xFDF0)) return false; + else return true; +} + +ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst) { + if (uc < 0x00) { + return 0; + } else if (uc < 0x80) { + dst[0] = uc; + return 1; + } else if (uc < 0x800) { + dst[0] = 0xC0 + (uc >> 6); + dst[1] = 0x80 + (uc & 0x3F); + return 2; + } else if (uc == 0xFFFF) { + dst[0] = 0xFF; + return 1; + } else if (uc == 0xFFFE) { + dst[0] = 0xFE; + return 1; + } else if (uc < 0x10000) { + dst[0] = 0xE0 + (uc >> 12); + dst[1] = 0x80 + ((uc >> 6) & 0x3F); + dst[2] = 0x80 + (uc & 0x3F); + return 3; + } else if (uc < 0x110000) { + dst[0] = 0xF0 + (uc >> 18); + dst[1] = 0x80 + ((uc >> 12) & 0x3F); + dst[2] = 0x80 + ((uc >> 6) & 0x3F); + dst[3] = 0x80 + (uc & 0x3F); + return 4; + } else return 0; +} + +const utf8proc_property_t *utf8proc_get_property(int32_t uc) { + /* // ASSERT: uc >= 0 && uc < 0x110000*/ + return utf8proc_properties + ( + utf8proc_stage2table[ + utf8proc_stage1table[uc >> 8] + (uc & 0xFF) + ] + ); +} + +#define utf8proc_decompose_lump(replacement_uc) \ + return utf8proc_decompose_char((replacement_uc), dst, bufsize, \ + options & ~UTF8PROC_LUMP, last_boundclass) + +ssize_t utf8proc_decompose_char(int32_t uc, int32_t *dst, ssize_t bufsize, + int options, int *last_boundclass) { + /*// ASSERT: uc >= 0 && uc < 0x110000*/ + const utf8proc_property_t *property; + utf8proc_propval_t category; + int32_t hangul_sindex; + property = utf8proc_get_property(uc); + category = property->category; + hangul_sindex = uc - UTF8PROC_HANGUL_SBASE; + if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) { + if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT) { + int32_t hangul_tindex; + if (bufsize >= 1) { + dst[0] = UTF8PROC_HANGUL_LBASE + + hangul_sindex / UTF8PROC_HANGUL_NCOUNT; + if (bufsize >= 2) dst[1] = UTF8PROC_HANGUL_VBASE + + (hangul_sindex % UTF8PROC_HANGUL_NCOUNT) / UTF8PROC_HANGUL_TCOUNT; + } + hangul_tindex = hangul_sindex % UTF8PROC_HANGUL_TCOUNT; + if (!hangul_tindex) return 2; + if (bufsize >= 3) dst[2] = UTF8PROC_HANGUL_TBASE + hangul_tindex; + return 3; + } + } + if (options & UTF8PROC_REJECTNA) { + if (!category) return UTF8PROC_ERROR_NOTASSIGNED; + } + if (options & UTF8PROC_IGNORE) { + if (property->ignorable) return 0; + } + if (options & UTF8PROC_LUMP) { + if (category == UTF8PROC_CATEGORY_ZS) utf8proc_decompose_lump(0x0020); + if (uc == 0x2018 || uc == 0x2019 || uc == 0x02BC || uc == 0x02C8) + utf8proc_decompose_lump(0x0027); + if (category == UTF8PROC_CATEGORY_PD || uc == 0x2212) + utf8proc_decompose_lump(0x002D); + if (uc == 0x2044 || uc == 0x2215) utf8proc_decompose_lump(0x002F); + if (uc == 0x2236) utf8proc_decompose_lump(0x003A); + if (uc == 0x2039 || uc == 0x2329 || uc == 0x3008) + utf8proc_decompose_lump(0x003C); + if (uc == 0x203A || uc == 0x232A || uc == 0x3009) + utf8proc_decompose_lump(0x003E); + if (uc == 0x2216) utf8proc_decompose_lump(0x005C); + if (uc == 0x02C4 || uc == 0x02C6 || uc == 0x2038 || uc == 0x2303) + utf8proc_decompose_lump(0x005E); + if (category == UTF8PROC_CATEGORY_PC || uc == 0x02CD) + utf8proc_decompose_lump(0x005F); + if (uc == 0x02CB) utf8proc_decompose_lump(0x0060); + if (uc == 0x2223) utf8proc_decompose_lump(0x007C); + if (uc == 0x223C) utf8proc_decompose_lump(0x007E); + if ((options & UTF8PROC_NLF2LS) && (options & UTF8PROC_NLF2PS)) { + if (category == UTF8PROC_CATEGORY_ZL || + category == UTF8PROC_CATEGORY_ZP) + utf8proc_decompose_lump(0x000A); + } + } + if (options & UTF8PROC_STRIPMARK) { + if (category == UTF8PROC_CATEGORY_MN || + category == UTF8PROC_CATEGORY_MC || + category == UTF8PROC_CATEGORY_ME) return 0; + } + if (options & UTF8PROC_CASEFOLD) { + if (property->casefold_mapping) { + const int32_t *casefold_entry; + ssize_t written = 0; + for (casefold_entry = property->casefold_mapping; + *casefold_entry >= 0; casefold_entry++) { + written += utf8proc_decompose_char(*casefold_entry, dst+written, + (bufsize > written) ? (bufsize - written) : 0, options, + last_boundclass); + if (written < 0) return UTF8PROC_ERROR_OVERFLOW; + } + return written; + } + } + if (options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) { + if (property->decomp_mapping && + (!property->decomp_type || (options & UTF8PROC_COMPAT))) { + const int32_t *decomp_entry; + ssize_t written = 0; + for (decomp_entry = property->decomp_mapping; + *decomp_entry >= 0; decomp_entry++) { + written += utf8proc_decompose_char(*decomp_entry, dst+written, + (bufsize > written) ? (bufsize - written) : 0, options, + last_boundclass); + if (written < 0) return UTF8PROC_ERROR_OVERFLOW; + } + return written; + } + } + if (options & UTF8PROC_CHARBOUND) { + bool boundary; + int tbc, lbc; + tbc = + (uc == 0x000D) ? UTF8PROC_BOUNDCLASS_CR : + (uc == 0x000A) ? UTF8PROC_BOUNDCLASS_LF : + ((category == UTF8PROC_CATEGORY_ZL || + category == UTF8PROC_CATEGORY_ZP || + category == UTF8PROC_CATEGORY_CC || + category == UTF8PROC_CATEGORY_CF) && + !(uc == 0x200C || uc == 0x200D)) ? UTF8PROC_BOUNDCLASS_CONTROL : + property->extend ? UTF8PROC_BOUNDCLASS_EXTEND : + ((uc >= UTF8PROC_HANGUL_L_START && uc < UTF8PROC_HANGUL_L_END) || + uc == UTF8PROC_HANGUL_L_FILLER) ? UTF8PROC_BOUNDCLASS_L : + (uc >= UTF8PROC_HANGUL_V_START && uc < UTF8PROC_HANGUL_V_END) ? + UTF8PROC_BOUNDCLASS_V : + (uc >= UTF8PROC_HANGUL_T_START && uc < UTF8PROC_HANGUL_T_END) ? + UTF8PROC_BOUNDCLASS_T : + (uc >= UTF8PROC_HANGUL_S_START && uc < UTF8PROC_HANGUL_S_END) ? ( + ((uc-UTF8PROC_HANGUL_SBASE) % UTF8PROC_HANGUL_TCOUNT == 0) ? + UTF8PROC_BOUNDCLASS_LV : UTF8PROC_BOUNDCLASS_LVT + ) : + UTF8PROC_BOUNDCLASS_OTHER; + lbc = *last_boundclass; + boundary = + (tbc == UTF8PROC_BOUNDCLASS_EXTEND) ? false : + (lbc == UTF8PROC_BOUNDCLASS_START) ? true : + (lbc == UTF8PROC_BOUNDCLASS_CR && + tbc == UTF8PROC_BOUNDCLASS_LF) ? false : + (lbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true : + (tbc == UTF8PROC_BOUNDCLASS_CONTROL) ? true : + (lbc == UTF8PROC_BOUNDCLASS_L && + (tbc == UTF8PROC_BOUNDCLASS_L || + tbc == UTF8PROC_BOUNDCLASS_V || + tbc == UTF8PROC_BOUNDCLASS_LV || + tbc == UTF8PROC_BOUNDCLASS_LVT)) ? false : + ((lbc == UTF8PROC_BOUNDCLASS_LV || + lbc == UTF8PROC_BOUNDCLASS_V) && + (tbc == UTF8PROC_BOUNDCLASS_V || + tbc == UTF8PROC_BOUNDCLASS_T)) ? false : + ((lbc == UTF8PROC_BOUNDCLASS_LVT || + lbc == UTF8PROC_BOUNDCLASS_T) && + tbc == UTF8PROC_BOUNDCLASS_T) ? false : + true; + *last_boundclass = tbc; + if (boundary) { + if (bufsize >= 1) dst[0] = 0xFFFF; + if (bufsize >= 2) dst[1] = uc; + return 2; + } + } + if (bufsize >= 1) *dst = uc; + return 1; +} + +ssize_t utf8proc_decompose( + const uint8_t *str, ssize_t slen, + int32_t *buffer, ssize_t bufsize, int options +) { + /*// slen will be ignored, if UTF8PROC_NULLTERM is set in options*/ + ssize_t wpos = 0; + if ((options & UTF8PROC_COMPOSE) && (options & UTF8PROC_DECOMPOSE)) + return UTF8PROC_ERROR_INVALIDOPTS; + if ((options & UTF8PROC_STRIPMARK) && + !(options & UTF8PROC_COMPOSE) && !(options & UTF8PROC_DECOMPOSE)) + return UTF8PROC_ERROR_INVALIDOPTS; + { + int32_t uc; + ssize_t rpos = 0; + ssize_t decomp_result; + int boundclass = UTF8PROC_BOUNDCLASS_START; + while (1) { + if (options & UTF8PROC_NULLTERM) { + rpos += utf8proc_iterate(str + rpos, -1, &uc); + /* checking of return value is not neccessary, + as 'uc' is < 0 in case of error. */ + if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8; + if (rpos < 0) return UTF8PROC_ERROR_OVERFLOW; + if (uc == 0) break; + } else { + if (rpos >= slen) break; + rpos += utf8proc_iterate(str + rpos, slen - rpos, &uc); + if (uc < 0) return UTF8PROC_ERROR_INVALIDUTF8; + } + decomp_result = utf8proc_decompose_char( + uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options, + &boundclass + ); + if (decomp_result < 0) return decomp_result; + wpos += decomp_result; + /* // prohibiting integer overflows due to too long strings:*/ + if (wpos < 0 || wpos > SSIZE_MAX/sizeof(int32_t)/2) + return UTF8PROC_ERROR_OVERFLOW; + } + } + if ((options & (UTF8PROC_COMPOSE|UTF8PROC_DECOMPOSE)) && bufsize >= wpos) { + ssize_t pos = 0; + while (pos < wpos-1) { + int32_t uc1, uc2; + const utf8proc_property_t *property1, *property2; + uc1 = buffer[pos]; + uc2 = buffer[pos+1]; + property1 = utf8proc_get_property(uc1); + property2 = utf8proc_get_property(uc2); + if (property1->combining_class > property2->combining_class && + property2->combining_class > 0) { + buffer[pos] = uc2; + buffer[pos+1] = uc1; + if (pos > 0) pos--; else pos++; + } else { + pos++; + } + } + } + return wpos; +} + +ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options) { + /* UTF8PROC_NULLTERM option will be ignored, 'length' is never ignored + ASSERT: 'buffer' has one spare byte of free space at the end! */ + if (options & (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS | UTF8PROC_STRIPCC)) { + ssize_t rpos; + ssize_t wpos = 0; + int32_t uc; + for (rpos = 0; rpos < length; rpos++) { + uc = buffer[rpos]; + if (uc == 0x000D && rpos < length-1 && buffer[rpos+1] == 0x000A) rpos++; + if (uc == 0x000A || uc == 0x000D || uc == 0x0085 || + ((options & UTF8PROC_STRIPCC) && (uc == 0x000B || uc == 0x000C))) { + if (options & UTF8PROC_NLF2LS) { + if (options & UTF8PROC_NLF2PS) { + buffer[wpos++] = 0x000A; + } else { + buffer[wpos++] = 0x2028; + } + } else { + if (options & UTF8PROC_NLF2PS) { + buffer[wpos++] = 0x2029; + } else { + buffer[wpos++] = 0x0020; + } + } + } else if ((options & UTF8PROC_STRIPCC) && + (uc < 0x0020 || (uc >= 0x007F && uc < 0x00A0))) { + if (uc == 0x0009) buffer[wpos++] = 0x0020; + } else { + buffer[wpos++] = uc; + } + } + length = wpos; + } + if (options & UTF8PROC_COMPOSE) { + int32_t *starter = NULL; + int32_t current_char; + const utf8proc_property_t *starter_property = NULL, *current_property; + utf8proc_propval_t max_combining_class = -1; + ssize_t rpos; + ssize_t wpos = 0; + int32_t composition; + for (rpos = 0; rpos < length; rpos++) { + current_char = buffer[rpos]; + current_property = utf8proc_get_property(current_char); + if (starter && current_property->combining_class > max_combining_class) { + /* // combination perhaps possible*/ + int32_t hangul_lindex; + int32_t hangul_sindex; + hangul_lindex = *starter - UTF8PROC_HANGUL_LBASE; + if (hangul_lindex >= 0 && hangul_lindex < UTF8PROC_HANGUL_LCOUNT) { + int32_t hangul_vindex; + hangul_vindex = current_char - UTF8PROC_HANGUL_VBASE; + if (hangul_vindex >= 0 && hangul_vindex < UTF8PROC_HANGUL_VCOUNT) { + *starter = UTF8PROC_HANGUL_SBASE + + (hangul_lindex * UTF8PROC_HANGUL_VCOUNT + hangul_vindex) * + UTF8PROC_HANGUL_TCOUNT; + starter_property = NULL; + continue; + } + } + hangul_sindex = *starter - UTF8PROC_HANGUL_SBASE; + if (hangul_sindex >= 0 && hangul_sindex < UTF8PROC_HANGUL_SCOUNT && + (hangul_sindex % UTF8PROC_HANGUL_TCOUNT) == 0) { + int32_t hangul_tindex; + hangul_tindex = current_char - UTF8PROC_HANGUL_TBASE; + if (hangul_tindex >= 0 && hangul_tindex < UTF8PROC_HANGUL_TCOUNT) { + *starter += hangul_tindex; + starter_property = NULL; + continue; + } + } + if (!starter_property) { + starter_property = utf8proc_get_property(*starter); + } + if (starter_property->comb1st_index >= 0 && + current_property->comb2nd_index >= 0) { + composition = utf8proc_combinations[ + starter_property->comb1st_index + + current_property->comb2nd_index + ]; + if (composition >= 0 && (!(options & UTF8PROC_STABLE) || + !(utf8proc_get_property(composition)->comp_exclusion))) { + *starter = composition; + starter_property = NULL; + continue; + } + } + } + buffer[wpos] = current_char; + if (current_property->combining_class) { + if (current_property->combining_class > max_combining_class) { + max_combining_class = current_property->combining_class; + } + } else { + starter = buffer + wpos; + starter_property = NULL; + max_combining_class = -1; + } + wpos++; + } + length = wpos; + } + { + ssize_t rpos, wpos = 0; + int32_t uc; + for (rpos = 0; rpos < length; rpos++) { + uc = buffer[rpos]; + wpos += utf8proc_encode_char(uc, ((uint8_t *)buffer) + wpos); + } + ((uint8_t *)buffer)[wpos] = 0; + return wpos; + } +} + +ssize_t utf8proc_map( + const uint8_t *str, ssize_t slen, uint8_t **dstptr, int options +) { + int32_t *buffer; + ssize_t result; + *dstptr = NULL; + result = utf8proc_decompose(str, slen, NULL, 0, options); + if (result < 0) return result; + buffer = malloc(result * sizeof(int32_t) + 1); + if (!buffer) return UTF8PROC_ERROR_NOMEM; + result = utf8proc_decompose(str, slen, buffer, result, options); + if (result < 0) { + free(buffer); + return result; + } + result = utf8proc_reencode(buffer, result, options); + if (result < 0) { + free(buffer); + return result; + } + { + int32_t *newptr; + newptr = realloc(buffer, result+1); + if (newptr) buffer = newptr; + } + *dstptr = (uint8_t *)buffer; + return result; +} + +uint8_t *utf8proc_NFD(const uint8_t *str) { + uint8_t *retval; + utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | + UTF8PROC_DECOMPOSE); + return retval; +} + +uint8_t *utf8proc_NFC(const uint8_t *str) { + uint8_t *retval; + utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | + UTF8PROC_COMPOSE); + return retval; +} + +uint8_t *utf8proc_NFKD(const uint8_t *str) { + uint8_t *retval; + utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | + UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT); + return retval; +} + +uint8_t *utf8proc_NFKC(const uint8_t *str) { + uint8_t *retval; + utf8proc_map(str, 0, &retval, UTF8PROC_NULLTERM | UTF8PROC_STABLE | + UTF8PROC_COMPOSE | UTF8PROC_COMPAT); + return retval; +} + +ssize_t utf8proc_check(const uint8_t *str) { + ssize_t result; + result = utf8proc_decompose(str, 0, NULL, 0, + UTF8PROC_NULLTERM | UTF8PROC_STABLE); + return result; +} diff --git a/extern/src_netcdf4/dv2i.c b/extern/src_netcdf4/dv2i.c new file mode 100644 index 0000000..01d3267 --- /dev/null +++ b/extern/src_netcdf4/dv2i.c @@ -0,0 +1,1160 @@ +/** \file +The V2 API Funtions. + +Copyright 1996, University Corporation for Atmospheric Research +See \ref copyright file for copying and redistribution conditions. + */ + +#ifndef NO_NETCDF_2 + +#include +#include +#include +#include +#include "netcdf.h" + +/* The subroutines in error.c emit no messages unless NC_VERBOSE bit + * is on. They call exit() when NC_FATAL bit is on. */ +int ncopts = (NC_FATAL | NC_VERBOSE) ; +int ncerr = NC_NOERR ; + +#if SIZEOF_LONG == SIZEOF_SIZE_T +/* + * We don't have to copy the arguments to switch from 'long' + * to 'size_t' or 'ptrdiff_t'. Use dummy macros. + */ + +# define NDIMS_DECL +# define A_DECL(name, type, ndims, rhs) \ + const type *const name = ((const type *)(rhs)) + +# define A_FREE(name) + +# define A_INIT(lhs, type, ndims, rhs) + +#else +/* + * We do have to copy the arguments to switch from 'long' + * to 'size_t' or 'ptrdiff_t'. In my tests on an SGI, + * any additional cost was lost in measurement variation. + * + * This stanza is true on Windows with MinGW-64 + */ + +# include "onstack.h" + +static size_t +nvdims(int ncid, int varid) +{ + int ndims=-1, status; + + if ((status = nc_inq_varndims(ncid, varid, &ndims))) + { + nc_advise("ncvdims", status, "ncid %d", ncid); + return -1; + } + return ndims; +} + +#define NDIMS_DECL const size_t ndims = nvdims(ncid, varid); + +# define A_DECL(name, type, ndims, rhs) \ + ALLOC_ONSTACK(name, type, ndims) + +# define A_FREE(name) \ + FREE_ONSTACK(name) + +# define A_INIT(lhs, type, ndims, rhs) \ + { \ + const long *lp = rhs; \ + type *tp = lhs; \ + type *const end = lhs + ndims; \ + while(tp < end) \ + { \ + *tp++ = (type) *lp++; \ + } \ + } + + +#endif + +typedef signed char schar; + +/* + * Computes number of record variables in an open netCDF file, and an array of + * the record variable ids, if the array parameter is non-null. + */ +static int +numrecvars(int ncid, int *nrecvarsp, int *recvarids) +{ + int status = NC_NOERR; + int nvars = 0; + int ndims = 0; + int nrecvars = 0; + int varid; + int recdimid; + int dimids[MAX_NC_DIMS]; + + status = nc_inq_nvars(ncid, &nvars); + if(status != NC_NOERR) + return status; + + status = nc_inq_unlimdim(ncid, &recdimid); + if(status != NC_NOERR) + return status; + + if (recdimid == -1) { + *nrecvarsp = 0; + return NC_NOERR; + } + nrecvars = 0; + for (varid = 0; varid < nvars; varid++) { + status = nc_inq_varndims(ncid, varid, &ndims); + if(status != NC_NOERR) + return status; + status = nc_inq_vardimid(ncid, varid, dimids); + if(status != NC_NOERR) + return status; + if (ndims > 0 && dimids[0] == recdimid) { + if (recvarids != NULL) + recvarids[nrecvars] = varid; + nrecvars++; + } + } + *nrecvarsp = nrecvars; + return NC_NOERR; +} + + +/* + * Computes record size (in bytes) of the record variable with a specified + * variable id. Returns size as 0 if not a record variable. + */ +static int +ncrecsize(int ncid, int varid, size_t *recsizep) +{ + int status = NC_NOERR; + int recdimid; + nc_type type; + int ndims; + int dimids[MAX_NC_DIMS]; + int id; + size_t size; + + *recsizep = 0; + status = nc_inq_unlimdim(ncid, &recdimid); + if(status != NC_NOERR) + return status; + status = nc_inq_vartype(ncid, varid, &type); + if(status != NC_NOERR) + return status; + status = nc_inq_varndims(ncid, varid, &ndims); + if(status != NC_NOERR) + return status; + status = nc_inq_vardimid(ncid, varid, dimids); + if(status != NC_NOERR) + return status; + if (ndims == 0 || dimids[0] != recdimid) { + return NC_NOERR; + } + size = nctypelen(type); + for (id = 1; id < ndims; id++) { + size_t len; + status = nc_inq_dimlen(ncid, dimids[id], &len); + if(status != NC_NOERR) + return status; + size *= len; + } + *recsizep = size; + return NC_NOERR; +} + + +/* + * Retrieves the dimension sizes of a variable with a specified variable id in + * an open netCDF file. Returns -1 on error. + */ +static int +dimsizes(int ncid, int varid, size_t *sizes) +{ + int status = NC_NOERR; + int ndims; + int id; + int dimids[MAX_NC_DIMS]; + + status = nc_inq_varndims(ncid, varid, &ndims); + if(status != NC_NOERR) + return status; + status = nc_inq_vardimid(ncid, varid, dimids); + if(status != NC_NOERR) + return status; + if (ndims == 0 || sizes == NULL) + return NC_NOERR; + for (id = 0; id < ndims; id++) { + size_t len; + status = nc_inq_dimlen(ncid, dimids[id], &len); + if(status != NC_NOERR) + return status; + sizes[id] = len; + } + return NC_NOERR; +} + + +/* + * Retrieves the number of record variables, the record variable ids, and the + * record size of each record variable. If any pointer to info to be returned + * is null, the associated information is not returned. Returns -1 on error. + */ +int +nc_inq_rec( + int ncid, + size_t *nrecvarsp, + int *recvarids, + size_t *recsizes) +{ + int status = NC_NOERR; + int nvars = 0; + int recdimid; + int varid; + int rvarids[MAX_NC_VARS]; + int nrvars = 0; + + status = nc_inq_nvars(ncid, &nvars); + if(status != NC_NOERR) + return status; + + status = nc_inq_unlimdim(ncid, &recdimid); + if(status != NC_NOERR) + return status; + + *nrecvarsp = 0; + if (recdimid == -1) + return NC_NOERR; + + status = numrecvars(ncid, &nrvars, rvarids); + if(status != NC_NOERR) + return status; + + if (nrecvarsp != NULL) + *nrecvarsp = nrvars; + if (recvarids != NULL) + for (varid = 0; varid < nrvars; varid++) + recvarids[varid] = rvarids[varid]; + + if (recsizes != NULL) + for (varid = 0; varid < nrvars; varid++) { + size_t rsize; + status = ncrecsize(ncid, rvarids[varid], &rsize); + if (status != NC_NOERR) + return status; + recsizes[varid] = rsize; + } + return NC_NOERR; +} + + +/* + * Write one record's worth of data, except don't write to variables for which + * the address of the data to be written is NULL. Return -1 on error. This is + * the same as the ncrecput() in the library, except that can handle errors + * better. + */ +int +nc_put_rec( + int ncid, + size_t recnum, + void* const* datap) +{ + int status = NC_NOERR; + int varid; + int rvarids[MAX_NC_VARS]; + int nrvars; + size_t start[MAX_NC_DIMS]; + size_t edges[MAX_NC_DIMS]; + + status = numrecvars(ncid, &nrvars, rvarids); + if(status != NC_NOERR) + return status; + + if (nrvars == 0) + return NC_NOERR; + + start[0] = recnum; + for (varid = 1; varid < nrvars; varid++) + start[varid] = 0; + + for (varid = 0; varid < nrvars; varid++) { + if (datap[varid] != NULL) { + status = dimsizes(ncid, rvarids[varid], edges); + if(status != NC_NOERR) + return status; + + edges[0] = 1; /* only 1 record's worth */ + status = nc_put_vara(ncid, rvarids[varid], start, edges, datap[varid]); + if(status != NC_NOERR) + return status; + } + } + return 0; +} + + +/* + * Read one record's worth of data, except don't read from variables for which + * the address of the data to be read is null. Return -1 on error. This is + * the same as the ncrecget() in the library, except that can handle errors + * better. + */ +int +nc_get_rec( + int ncid, + size_t recnum, + void **datap) +{ + int status = NC_NOERR; + int varid; + int rvarids[MAX_NC_VARS]; + int nrvars; + size_t start[MAX_NC_DIMS]; + size_t edges[MAX_NC_DIMS]; + + status = numrecvars(ncid, &nrvars, rvarids); + if(status != NC_NOERR) + return status; + + if (nrvars == 0) + return NC_NOERR; + + start[0] = recnum; + for (varid = 1; varid < nrvars; varid++) + start[varid] = 0; + + for (varid = 0; varid < nrvars; varid++) { + if (datap[varid] != NULL) { + status = dimsizes(ncid, rvarids[varid], edges); + if(status != NC_NOERR) + return status; + edges[0] = 1; /* only 1 record's worth */ + status = nc_get_vara(ncid, rvarids[varid], start, edges, datap[varid]); + if(status != NC_NOERR) + return status; + } + } + return 0; +} + +/* + */ +void +nc_advise(const char *routine_name, int err, const char *fmt,...) +{ + va_list args; + + if(NC_ISSYSERR(err)) + ncerr = NC_SYSERR; + else + ncerr = err; + + if( ncopts & NC_VERBOSE ) + { + (void) fprintf(stderr,"%s: ", routine_name); + va_start(args ,fmt); + (void) vfprintf(stderr,fmt,args); + va_end(args); + if(err != NC_NOERR) + { + (void) fprintf(stderr,": %s", + nc_strerror(err)); + } + (void) fputc('\n',stderr); + (void) fflush(stderr); /* to ensure log files are current */ + } + + if( (ncopts & NC_FATAL) && err != NC_NOERR ) + { + exit(ncopts); + } +} + +/* End error handling */ + +int +nccreate(const char* path, int cmode) +{ + int ncid; + const int status = nc_create(path, cmode, &ncid); + if(status != NC_NOERR) + { + nc_advise("nccreate", status, "filename \"%s\"", path); + return -1; + } + return ncid; +} + + +int +ncopen(const char *path, int mode) +{ + int ncid; + const int status = nc_open(path, mode, &ncid); + if(status != NC_NOERR) + { + nc_advise("ncopen", status, "filename \"%s\"", path); + return -1; + } + return ncid; +} + + +int +ncredef(int ncid) +{ + const int status = nc_redef(ncid); + if(status != NC_NOERR) + { + nc_advise("ncredef", status, "ncid %d", ncid); + return -1; + } + return 0; +} + + +int +ncendef(int ncid) +{ + const int status = nc_enddef(ncid); + if(status != NC_NOERR) + { + nc_advise("ncendef", status, "ncid %d", ncid); + return -1; + } + return 0; +} + + +int +ncclose(int ncid) +{ + const int status = nc_close(ncid); + if(status != NC_NOERR) + { + nc_advise("ncclose", status, "ncid %d", ncid); + return -1; + + } + return 0; +} + + +int +ncinquire( + int ncid, + int* ndims, + int* nvars, + int* natts, + int* recdim +) +{ + int nd, nv, na; + const int status = nc_inq(ncid, &nd, &nv, &na, recdim); + + if(status != NC_NOERR) + { + nc_advise("ncinquire", status, "ncid %d", ncid); + return -1; + } + /* else */ + + if(ndims != NULL) + *ndims = (int) nd; + + if(nvars != NULL) + *nvars = (int) nv; + + if(natts != NULL) + *natts = (int) na; + + return ncid; +} + + +int +ncsync(int ncid) +{ + const int status = nc_sync(ncid); + if(status != NC_NOERR) + { + nc_advise("ncsync", status, "ncid %d", ncid); + return -1; + + } + return 0; +} + + +int +ncabort(int ncid) +{ + const int status = nc_abort(ncid); + if(status != NC_NOERR) + { + nc_advise("ncabort", status, "ncid %d", ncid); + return -1; + } + return 0; +} + + +int +ncdimdef( + int ncid, + const char* name, + long length +) +{ + int dimid; + int status = NC_NOERR; + if(length < 0) { + status = NC_EDIMSIZE; + nc_advise("ncdimdef", status, "ncid %d", ncid); + return -1; + } + status = nc_def_dim(ncid, name, (size_t)length, &dimid); + if(status != NC_NOERR) + { + nc_advise("ncdimdef", status, "ncid %d", ncid); + return -1; + } + return dimid; +} + + +int +ncdimid(int ncid, const char* name) +{ + int dimid; + const int status = nc_inq_dimid(ncid, name, &dimid); + if(status != NC_NOERR) + { + nc_advise("ncdimid", status, "ncid %d", ncid); + return -1; + } + return dimid; +} + + +int +ncdiminq( + int ncid, + int dimid, + char* name, + long* length +) +{ + size_t ll; + const int status = nc_inq_dim(ncid, dimid, name, &ll); + + if(status != NC_NOERR) + { + nc_advise("ncdiminq", status, "ncid %d", ncid); + return -1; + } + /* else */ + + if(length != NULL) + *length = (int) ll; + + return dimid; +} + + +int +ncdimrename( + int ncid, + int dimid, + const char* name +) +{ + const int status = nc_rename_dim(ncid, dimid, name); + if(status != NC_NOERR) + { + nc_advise("ncdimrename", status, "ncid %d", ncid); + return -1; + } + return dimid; +} + + +int +ncvardef( + int ncid, + const char* name, + nc_type datatype, + int ndims, + const int* dim +) +{ + int varid = -1; + const int status = nc_def_var(ncid, name, datatype, ndims, dim, &varid); + if(status != NC_NOERR) + { + nc_advise("ncvardef", status, "ncid %d", ncid); + return -1; + } + return varid; +} + + +int +ncvarid( + int ncid, + const char* name +) +{ + int varid = -1; + const int status = nc_inq_varid(ncid, name, &varid); + if(status != NC_NOERR) + { + nc_advise("ncvarid", status, "ncid %d", ncid); + return -1; + } + return varid; +} + + +int +ncvarinq( + int ncid, + int varid, + char* name, + nc_type* datatype, + int* ndims, + int* dim, + int* natts +) +{ + int nd, na; + const int status = nc_inq_var(ncid, varid, name, datatype, + &nd, dim, &na); + + if(status != NC_NOERR) + { + nc_advise("ncvarinq", status, "ncid %d", ncid); + return -1; + } + /* else */ + + if(ndims != NULL) + *ndims = (int) nd; + + if(natts != NULL) + *natts = (int) na; + + return varid; +} + + +int +ncvarput1( + int ncid, + int varid, + const long* index, + const void* value +) +{ + NDIMS_DECL + A_DECL(coordp, size_t, ndims, index); + A_INIT(coordp, size_t, ndims, index); + { + const int status = nc_put_var1(ncid, varid, coordp, value); + A_FREE(coordp); + if(status != NC_NOERR) + { + nc_advise("ncvarput1", status, "ncid %d", ncid); + return -1; + } + } + return 0; +} + + +int +ncvarget1( + int ncid, + int varid, + const long* index, + void* value +) +{ + NDIMS_DECL + A_DECL(coordp, size_t, ndims, index); + A_INIT(coordp, size_t, ndims, index); + { + const int status = nc_get_var1(ncid, varid, coordp, value); + A_FREE(coordp); + if(status != NC_NOERR) + { + nc_advise("ncdimid", status, "ncid %d", ncid); + return -1; + } + } + return 0; +} + + +int +ncvarput( + int ncid, + int varid, + const long* start, + const long* count, + const void* value +) +{ + NDIMS_DECL + A_DECL(stp, size_t, ndims, start); + A_DECL(cntp, size_t, ndims, count); + A_INIT(stp, size_t, ndims, start); + A_INIT(cntp, size_t, ndims, count); + { + const int status = nc_put_vara(ncid, varid, stp, cntp, value); + A_FREE(cntp); + A_FREE(stp); + if(status != NC_NOERR) + { + nc_advise("ncvarput", status, "ncid %d", ncid); + return -1; + } + } + return 0; +} + + +int +ncvarget( + int ncid, + int varid, + const long* start, + const long* count, + void* value +) +{ + NDIMS_DECL + A_DECL(stp, size_t, ndims, start); + A_DECL(cntp, size_t, ndims, count); + A_INIT(stp, size_t, ndims, start); + A_INIT(cntp, size_t, ndims, count); + { + const int status = nc_get_vara(ncid, varid, stp, cntp, value); + A_FREE(cntp); + A_FREE(stp); + if(status != NC_NOERR) + { + nc_advise("ncvarget", status, "ncid %d; varid %d", ncid, varid); + return -1; + } + } + return 0; +} + + +int +ncvarputs( + int ncid, + int varid, + const long* start, + const long* count, + const long* stride, + const void* value +) +{ + if(stride == NULL) + return ncvarput(ncid, varid, start, count, value); + /* else */ + { + NDIMS_DECL + A_DECL(stp, size_t, ndims, start); + A_DECL(cntp, size_t, ndims, count); + A_DECL(strdp, ptrdiff_t, ndims, stride); + A_INIT(stp, size_t, ndims, start); + A_INIT(cntp, size_t, ndims, count); + A_INIT(strdp, ptrdiff_t, ndims, stride); + { + const int status = nc_put_vars(ncid, varid, stp, cntp, strdp, value); + A_FREE(strdp); + A_FREE(cntp); + A_FREE(stp); + if(status != NC_NOERR) + { + nc_advise("ncvarputs", status, "ncid %d", ncid); + return -1; + } + } + return 0; + } +} + + +int +ncvargets( + int ncid, + int varid, + const long* start, + const long* count, + const long* stride, + void* value +) +{ + if(stride == NULL) + return ncvarget(ncid, varid, start, count, value); + /* else */ + { + NDIMS_DECL + A_DECL(stp, size_t, ndims, start); + A_DECL(cntp, size_t, ndims, count); + A_DECL(strdp, ptrdiff_t, ndims, stride); + A_INIT(stp, size_t, ndims, start); + A_INIT(cntp, size_t, ndims, count); + A_INIT(strdp, ptrdiff_t, ndims, stride); + { + const int status = nc_get_vars(ncid, varid, stp, cntp, strdp, value); + A_FREE(strdp); + A_FREE(cntp); + A_FREE(stp); + if(status != NC_NOERR) + { + nc_advise("ncvargets", status, "ncid %d", ncid); + return -1; + } + } + return 0; + } +} + + +int +ncvarputg( + int ncid, + int varid, + const long* start, + const long* count, + const long* stride, + const long* map, + const void* value +) +{ + if(map == NULL) + return ncvarputs(ncid, varid, start, count, stride, value); + /* else */ + { + NDIMS_DECL + A_DECL(stp, size_t, ndims, start); + A_DECL(cntp, size_t, ndims, count); + A_DECL(strdp, ptrdiff_t, ndims, stride); + A_DECL(imp, ptrdiff_t, ndims, map); + A_INIT(stp, size_t, ndims, start); + A_INIT(cntp, size_t, ndims, count); + A_INIT(strdp, ptrdiff_t, ndims, stride); + A_INIT(imp, ptrdiff_t, ndims, map); + { + const int status = nc_put_varm(ncid, varid, + stp, cntp, strdp, imp, value); + A_FREE(imp); + A_FREE(strdp); + A_FREE(cntp); + A_FREE(stp); + if(status != NC_NOERR) + { + nc_advise("ncvarputg", status, "ncid %d", ncid); + return -1; + } + } + return 0; + } +} + + +int +ncvargetg( + int ncid, + int varid, + const long* start, + const long* count, + const long* stride, + const long* map, + void* value +) +{ + if(map == NULL) + return ncvargets(ncid, varid, start, count, stride, value); + /* else */ + { + NDIMS_DECL + A_DECL(stp, size_t, ndims, start); + A_DECL(cntp, size_t, ndims, count); + A_DECL(strdp, ptrdiff_t, ndims, stride); + A_DECL(imp, ptrdiff_t, ndims, map); + A_INIT(stp, size_t, ndims, start); + A_INIT(cntp, size_t, ndims, count); + A_INIT(strdp, ptrdiff_t, ndims, stride); + A_INIT(imp, ptrdiff_t, ndims, map); + { + const int status = nc_get_varm(ncid, varid, + stp, cntp, strdp, imp, value); + A_FREE(imp); + A_FREE(strdp); + A_FREE(cntp); + A_FREE(stp); + if(status != NC_NOERR) + { + nc_advise("ncvargetg", status, "ncid %d", ncid); + return -1; + } + } + return 0; + } +} + + +int +ncvarrename( + int ncid, + int varid, + const char* name +) +{ + const int status = nc_rename_var(ncid, varid, name); + if(status != NC_NOERR) + { + nc_advise("ncvarrename", status, "ncid %d", ncid); + return -1; + } + return varid; +} + + +int +ncattput( + int ncid, + int varid, + const char* name, + nc_type datatype, + int len, + const void* value +) +{ + const int status = nc_put_att(ncid, varid, name, datatype, len, value); + if(status != NC_NOERR) + { + nc_advise("ncattput", status, "ncid %d", ncid); + return -1; + } + return 0; +} + + +int +ncattinq( + int ncid, + int varid, + const char* name, + nc_type* datatype, + int* len +) +{ + size_t ll; + const int status = nc_inq_att(ncid, varid, name, datatype, &ll); + if(status != NC_NOERR) + { + nc_advise("ncattinq", status, + "ncid %d; varid %d; attname \"%s\"", + ncid, varid, name); + return -1; + } + + if(len != NULL) + *len = (int) ll; + + return 1; + +} + + +int +ncattget( + int ncid, + int varid, + const char* name, + void* value +) +{ + const int status = nc_get_att(ncid, varid, name, value); + if(status != NC_NOERR) + { + nc_advise("ncattget", status, "ncid %d", ncid); + return -1; + } + return 1; +} + + +int +ncattcopy( + int ncid_in, + int varid_in, + const char* name, + int ncid_out, + int varid_out +) +{ + const int status = nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out); + if(status != NC_NOERR) + { + nc_advise("ncattcopy", status, "%s", name); + return -1; + } + return 0; +} + + +int +ncattname( + int ncid, + int varid, + int attnum, + char* name +) +{ + const int status = nc_inq_attname(ncid, varid, attnum, name); + if(status != NC_NOERR) + { + nc_advise("ncattname", status, "ncid %d", ncid); + return -1; + } + return attnum; +} + + +int +ncattrename( + int ncid, + int varid, + const char* name, + const char* newname +) +{ + const int status = nc_rename_att(ncid, varid, name, newname); + if(status != NC_NOERR) + { + nc_advise("ncattrename", status, "ncid %d", ncid); + return -1; + } + return 1; +} + + +int +ncattdel( + int ncid, + int varid, + const char* name +) +{ + const int status = nc_del_att(ncid, varid, name); + if(status != NC_NOERR) + { + nc_advise("ncattdel", status, "ncid %d", ncid); + return -1; + } + return 1; +} + +#endif /* NO_NETCDF_2 */ + +#ifndef NO_NETCDF_2 + +int +ncsetfill( + int ncid, + int fillmode +) +{ + int oldmode = -1; + const int status = nc_set_fill(ncid, fillmode, &oldmode); + if(status != NC_NOERR) + { + nc_advise("ncsetfill", status, "ncid %d", ncid); + return -1; + } + return oldmode; +} + + +int +ncrecinq( + int ncid, + int* nrecvars, + int* recvarids, + long* recsizes +) +{ + size_t nrv = 0; + size_t rs[NC_MAX_VARS]; /* TODO */ + const int status = nc_inq_rec(ncid, &nrv, recvarids, rs); + if(status != NC_NOERR) + { + nc_advise("ncrecinq", status, "ncid %d", ncid); + return -1; + } + + if(nrecvars != NULL) + *nrecvars = (int) nrv; + + if(recsizes != NULL) + { + size_t ii; + for(ii = 0; ii < nrv; ii++) + { + recsizes[ii] = (long) rs[ii]; + } + } + + return (int) nrv; +} + + +int +ncrecget( + int ncid, + long recnum, + void** datap +) +{ + const int status = nc_get_rec(ncid, (size_t)recnum, datap); + if(status != NC_NOERR) + { + nc_advise("ncrecget", status, "ncid %d", ncid); + return -1; + } + return 0; +} + + +int +ncrecput( + int ncid, + long recnum, + void* const* datap +) +{ + const int status = nc_put_rec(ncid, (size_t)recnum, datap); + if(status != NC_NOERR) + { + nc_advise("ncrecput", status, "ncid %d", ncid); + return -1; + } + return 0; +} + +#endif /* NO_NETCDF_2 */ diff --git a/extern/src_netcdf4/dvar.c b/extern/src_netcdf4/dvar.c new file mode 100644 index 0000000..842da9d --- /dev/null +++ b/extern/src_netcdf4/dvar.c @@ -0,0 +1,585 @@ +/*! \file +Functions for defining and inquiring about variables. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include "ncdispatch.h" +#include "netcdf_f.h" + +/** \defgroup variables Variables + +Variables hold multi-dimensional arrays of data. + +Variables for a netCDF dataset are defined when the dataset is +created, while the netCDF dataset is in define mode. Other variables +may be added later by reentering define mode. A netCDF variable has a +name, a type, and a shape, which are specified when it is defined. A +variable may also have values, which are established later in data +mode. + +Ordinarily, the name, type, and shape are fixed when the variable is +first defined. The name may be changed, but the type and shape of a +variable cannot be changed. However, a variable defined in terms of +the unlimited dimension can grow without bound in that dimension. + +A netCDF variable in an open netCDF dataset is referred to by a small +integer called a variable ID. + +Variable IDs reflect the order in which variables were defined within +a netCDF dataset. Variable IDs are 0, 1, 2,..., in the order in which +the variables were defined. A function is available for getting the +variable ID from the variable name and vice-versa. + +Attributes (see Attributes) may be associated with a variable to +specify such properties as units. + +Operations supported on variables are: +- Create a variable, given its name, data type, and shape. +- Get a variable ID from its name. +- Get a variable's name, data type, shape, and number of attributes + from its ID. +- Put a data value into a variable, given variable ID, indices, and value. +- Put an array of values into a variable, given variable ID, corner + indices, edge lengths, and a block of values. +- Put a subsampled or mapped array-section of values into a variable, + given variable ID, corner indices, edge lengths, stride vector, + index mapping vector, and a block of values. +- Get a data value from a variable, given variable ID and indices. +- Get an array of values from a variable, given variable ID, corner + indices, and edge lengths. +- Get a subsampled or mapped array-section of values from a variable, + given variable ID, corner indices, edge lengths, stride vector, and + index mapping vector. +- Rename a variable. + +\section language_types Language Types Corresponding to netCDF +External Data Types + +NetCDF supported six atomic data types through version 3.6.0 (char, +byte, short, int, float, and double). Starting with version 4.0, many +new atomic and user defined data types are supported (unsigned int +types, strings, compound types, variable length arrays, enums, +opaque). + +The additional data types are only supported in netCDF-4/HDF5 +files. To create netCDF-4/HDF5 files, use the HDF5 flag in +nc_create. (see nc_create). + +\section classic_types NetCDF-3 Classic and 64-Bit Offset Data Types + +NetCDF-3 classic and 64-bit offset files support 6 atomic data types, +and none of the user defined datatype introduced in NetCDF-4. + +The following table gives the netCDF-3 external data types and the +corresponding type constants for defining variables in the C +interface: + + + + + + + + + +
TypeC defineBits
byteNC_BYTE8
charNC_CHAR8
shortNC_SHORT16
intNC_INT32
floatNC_FLOAT32
doubleNC_DOUBLE64
+ +The first column gives the netCDF external data type, which is the +same as the CDL data type. The next column gives the corresponding C +pre-processor macro for use in netCDF functions (the pre-processor +macros are defined in the netCDF C header-file netcdf.h). The last +column gives the number of bits used in the external representation of +values of the corresponding type. + +\section netcdf_4_atomic NetCDF-4 Atomic Types + +NetCDF-4 files support all of the atomic data types from netCDF-3, +plus additional unsigned integer types, 64-bit integer types, and a +string type. + + + + + + + + + + + + + + +
TypeC defineBits + +
byteNC_BYTE8
unsigned byte NC_UBYTE^ 8
char NC_CHAR 8
short NC_SHORT 16
unsigned short NC_USHORT^ 16
int NC_INT 32
unsigned int NC_UINT^ 32
unsigned long long NC_UINT64^ 64
long long NC_INT64^ 64
float NC_FLOAT 32
double NC_DOUBLE 64
char ** NC_STRING^ string length + 1
+ +^This type was introduced in netCDF-4, and is not supported in netCDF +classic or 64-bit offset format files, or in netCDF-4 files if they +are created with the NC_CLASSIC_MODEL flags. + */ + +/** \name Defining Variables + +Use these functions to define variables. + */ +/*! \{ */ + +/** +\ingroup variables +Define a new variable. + +This function adds a new variable to an open netCDF dataset or group. +It returns (as an argument) a variable ID, given the netCDF ID, +the variable name, the variable type, the number of dimensions, and a +list of the dimension IDs. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param name Variable \ref object_name. + +\param xtype \ref data_type of the variable. + +\param ndims Number of dimensions for the variable. For example, 2 +specifies a matrix, 1 specifies a vector, and 0 means the variable is +a scalar with no dimensions. Must not be negative or greater than the +predefined constant ::NC_MAX_VAR_DIMS. + +\param dimidsp Vector of ndims dimension IDs corresponding to the +variable dimensions. For classic model netCDF files, if the ID of the +unlimited dimension is included, it must be first. This argument is +ignored if ndims is 0. For expanded model netCDF4/HDF5 files, there +may be any number of unlimited dimensions, and they may be used in any +element of the dimids array. + +\param varidp Pointer to location for the returned variable ID. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTINDEFINE Not in define mode. +\returns ::NC_ESTRICTNC3 Attempting netcdf-4 operation on strict nc3 netcdf-4 file. +\returns ::NC_EMAXVARS NC_MAX_VARS exceeded +\returns ::NC_EBADTYPE Bad type. +\returns ::NC_EINVAL Invalid input. +\returns ::NC_ENAMEINUSE Name already in use. +\returns ::NC_EPERM Attempt to create object in read-only file. + +\section Example + +Here is an example using nc_def_var to create a variable named rh of +type double with three dimensions, time, lat, and lon in a new netCDF +dataset named foo.nc: + +\code + #include + ... + int status; + int ncid; + int lat_dim, lon_dim, time_dim; + int rh_id; + int rh_dimids[3]; + ... + status = nc_create("foo.nc", NC_NOCLOBBER, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + + status = nc_def_dim(ncid, "lat", 5L, &lat_dim); + if (status != NC_NOERR) handle_error(status); + status = nc_def_dim(ncid, "lon", 10L, &lon_dim); + if (status != NC_NOERR) handle_error(status); + status = nc_def_dim(ncid, "time", NC_UNLIMITED, &time_dim); + if (status != NC_NOERR) handle_error(status); + ... + + rh_dimids[0] = time_dim; + rh_dimids[1] = lat_dim; + rh_dimids[2] = lon_dim; + status = nc_def_var (ncid, "rh", NC_DOUBLE, 3, rh_dimids, &rh_id); + if (status != NC_NOERR) handle_error(status); +\endcode + + */ +int +nc_def_var(int ncid, const char *name, nc_type xtype, + int ndims, const int *dimidsp, int *varidp) +{ + NC* ncp; + int stat = NC_NOERR; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + return ncp->dispatch->def_var(ncid, name, xtype, ndims, + dimidsp, varidp); +} +/*! \} */ + +/** \name Rename a Variable + +Rename a variable. + */ +/*! \{ */ + +/** Rename a variable. +\ingroup variables + +This function changes the name of a netCDF variable in an open netCDF +file or group. You cannot rename a variable to have the name of any existing +variable. + +For classic format, 64-bit offset format, and netCDF-4/HDF5 with +classic mode, if the new name is longer than the old name, the netCDF +dataset must be in define mode. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param name New name of the variable. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. +\returns ::NC_EBADNAME Bad name. +\returns ::NC_EMAXNAME Name is too long. +\returns ::NC_ENAMEINUSE Name in use. +\returns ::NC_ENOMEM Out of memory. + +\section Example + +Here is an example using nc_rename_var to rename the variable rh to +rel_hum in an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status; + int ncid; + int rh_id; + ... + status = nc_open("foo.nc", NC_WRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_redef(ncid); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + status = nc_rename_var (ncid, rh_id, "rel_hum"); + if (status != NC_NOERR) handle_error(status); + status = nc_enddef(ncid); + if (status != NC_NOERR) handle_error(status); +\endcode + +*/ +int +nc_rename_var(int ncid, int varid, const char *name) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->rename_var(ncid, varid, name); +} +/*! \} */ + +/** \internal +\ingroup variables + */ +int +NC_is_recvar(int ncid, int varid, size_t* nrecs) +{ + int status = NC_NOERR; + int unlimid; + int ndims; + int dimset[NC_MAX_VAR_DIMS]; + + status = nc_inq_unlimdim(ncid,&unlimid); + if(status != NC_NOERR) return 0; /* no unlimited defined */ + status = nc_inq_varndims(ncid,varid,&ndims); + if(status != NC_NOERR) return 0; /* no unlimited defined */ + if(ndims == 0) return 0; /* scalar */ + status = nc_inq_vardimid(ncid,varid,dimset); + if(status != NC_NOERR) return 0; /* no unlimited defined */ + status = nc_inq_dim(ncid,dimset[0],NULL,nrecs); + if(status != NC_NOERR) return 0; + return (dimset[0] == unlimid ? 1: 0); +} + +/* Ok to use NC pointers because + all IOSP's will use that structure, + but not ok to use e.g. NC_Var pointers + because they may be different structure + entirely. +*/ + +/** \internal +\ingroup variables +Find the length of a type. This is how much space is required by the user, as in +\code +vals = malloc(nel * nctypelen(var.type)); +ncvarget(cdfid, varid, cor, edg, vals); +\endcode + */ +int +nctypelen(nc_type type) +{ + switch(type){ + case NC_CHAR : + return((int)sizeof(char)); + case NC_BYTE : + return((int)sizeof(signed char)); + case NC_SHORT : + return(int)(sizeof(short)); + case NC_INT : + return((int)sizeof(int)); + case NC_FLOAT : + return((int)sizeof(float)); + case NC_DOUBLE : + return((int)sizeof(double)); + + /* These can occur in netcdf-3 code */ + case NC_UBYTE : + return((int)sizeof(unsigned char)); + case NC_USHORT : + return((int)(sizeof(unsigned short))); + case NC_UINT : + return((int)sizeof(unsigned int)); + case NC_INT64 : + return((int)sizeof(signed long long)); + case NC_UINT64 : + return((int)sizeof(unsigned long long)); +#ifdef USE_NETCDF4 + case NC_STRING : + return((int)sizeof(char*)); +#endif /*USE_NETCDF4*/ + + default: + return -1; + } +} + +/** \internal +\ingroup variables +Find the length of a type. Redunant over nctypelen() above. */ +int +NC_atomictypelen(nc_type xtype) +{ + int sz = 0; + switch(xtype) { + case NC_NAT: sz = 0; break; + case NC_BYTE: sz = sizeof(signed char); break; + case NC_CHAR: sz = sizeof(char); break; + case NC_SHORT: sz = sizeof(short); break; + case NC_INT: sz = sizeof(int); break; + case NC_FLOAT: sz = sizeof(float); break; + case NC_DOUBLE: sz = sizeof(double); break; + case NC_INT64: sz = sizeof(signed long long); break; + case NC_UBYTE: sz = sizeof(unsigned char); break; + case NC_USHORT: sz = sizeof(unsigned short); break; + case NC_UINT: sz = sizeof(unsigned int); break; + case NC_UINT64: sz = sizeof(unsigned long long); break; +#ifdef USE_NETCDF4 + case NC_STRING: sz = sizeof(char*); break; +#endif + default: break; + } + return sz; +} + +/** \internal +\ingroup variables + Get the type name. */ +char * +NC_atomictypename(nc_type xtype) +{ + char* nm = NULL; + switch(xtype) { + case NC_NAT: nm = "undefined"; break; + case NC_BYTE: nm = "byte"; break; + case NC_CHAR: nm = "char"; break; + case NC_SHORT: nm = "short"; break; + case NC_INT: nm = "int"; break; + case NC_FLOAT: nm = "float"; break; + case NC_DOUBLE: nm = "double"; break; + case NC_INT64: nm = "int64"; break; + case NC_UBYTE: nm = "ubyte"; break; + case NC_USHORT: nm = "ushort"; break; + case NC_UINT: nm = "uint"; break; + case NC_UINT64: nm = "uint64"; break; +#ifdef USE_NETCDF4 + case NC_STRING: nm = "string"; break; +#endif + default: break; + } + return nm; +} + +/** \internal +\ingroup variables +Get the shape of a variable. + */ +int +NC_getshape(int ncid, int varid, int ndims, size_t* shape) +{ + int dimids[NC_MAX_VAR_DIMS]; + int i; + int status = NC_NOERR; + + if ((status = nc_inq_vardimid(ncid, varid, dimids))) + return status; + for(i = 0; i < ndims; i++) + if ((status = nc_inq_dimlen(ncid, dimids[i], &shape[i]))) + break; + + return status; +} + +#ifdef USE_NETCDF4 +/** \ingroup variables + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param size The total size of the raw data chunk cache, in bytes. + +\param nelems The number of chunk slots in the raw data chunk cache. + +\param preemption The preemption, a value between 0 and 1 inclusive +that indicates how much chunks that have been fully read are favored +for preemption. A value of zero means fully read chunks are treated no +differently than other chunks (the preemption is strictly LRU) while a +value of one means fully read chunks are always preempted before other +chunks. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. +\returns ::NC_ESTRICTNC3 Attempting netcdf-4 operation on strict nc3 netcdf-4 file. +\returns ::NC_EINVAL Invalid input + */ +int +nc_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, + float preemption) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->set_var_chunk_cache(ncid, varid, size, + nelems, preemption); +} + +/** \ingroup variables + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param sizep The total size of the raw data chunk cache, in bytes, +will be put here. \ref ignored_if_null. + +\param nelemsp The number of chunk slots in the raw data chunk cache +hash table will be put here. \ref ignored_if_null. + +\param preemptionp The preemption will be put here. The preemtion +value is between 0 and 1 inclusive and indicates how much chunks that +have been fully read are favored for preemption. A value of zero means +fully read chunks are treated no differently than other chunks (the +preemption is strictly LRU) while a value of one means fully read +chunks are always preempted before other chunks. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. +\returns ::NC_ESTRICTNC3 Attempting netcdf-4 operation on strict nc3 netcdf-4 file. +\returns ::NC_EINVAL Invalid input +*/ +int +nc_get_var_chunk_cache(int ncid, int varid, size_t *sizep, size_t *nelemsp, + float *preemptionp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_var_chunk_cache(ncid, varid, sizep, + nelemsp, preemptionp); +} + +/** \ingroup variables +Free string space allocated by the library. + +When you read string type the library will allocate the storage space +for the data. This storage space must be freed, so pass the pointer +back to this function, when you're done with the data, and it will +free the string memory. + +\param len The number of character arrays in the array. +\param data The pointer to the data array. + +\returns ::NC_NOERR No error. +*/ +int +nc_free_string(size_t len, char **data) +{ + int i; + for (i = 0; i < len; i++) + free(data[i]); + return NC_NOERR; +} + +int +nc_def_var_deflate(int ncid, int varid, int shuffle, int deflate, int deflate_level) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_var_deflate(ncid,varid,shuffle,deflate,deflate_level); +} + +int +nc_def_var_fletcher32(int ncid, int varid, int fletcher32) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_var_fletcher32(ncid,varid,fletcher32); +} + +int +nc_def_var_chunking(int ncid, int varid, int storage, + const size_t *chunksizesp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_var_chunking(ncid, varid, storage, + chunksizesp); +} + +int +nc_def_var_fill(int ncid, int varid, int no_fill, const void *fill_value) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_var_fill(ncid,varid,no_fill,fill_value); +} + +int +nc_def_var_endian(int ncid, int varid, int endian) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_var_endian(ncid,varid,endian); +} + +#endif /* USE_NETCDF4 */ diff --git a/extern/src_netcdf4/dvarget.c b/extern/src_netcdf4/dvarget.c new file mode 100644 index 0000000..3d86f1f --- /dev/null +++ b/extern/src_netcdf4/dvarget.c @@ -0,0 +1,1432 @@ +/*! \file +Functions for getting data from variables. + +Copyright 2011 University Corporation for Atmospheric +Research/Unidata. See \ref COPYRIGHT file for more info. */ + +#include "ncdispatch.h" + + +/** \internal +\ingroup variables + + */ +int +NC_get_vara(int ncid, int varid, + const size_t *start, const size_t *edges, + void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; +#ifdef USE_NETCDF4 + if(memtype >= NC_FIRSTUSERTYPEID) memtype = NC_NAT; +#endif + if(edges == NULL) { + size_t shape[NC_MAX_VAR_DIMS]; + int ndims; + stat = nc_inq_varndims(ncid, varid, &ndims); + if(stat != NC_NOERR) return stat; + stat = NC_getshape(ncid,varid,ndims,shape); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_vara(ncid,varid,start,shape,value,memtype); + } else + return ncp->dispatch->get_vara(ncid,varid,start,edges,value,memtype); +} + +/** \ingroup variables +\internal + */ +static int +NC_get_var(int ncid, int varid, void *value, nc_type memtype) +{ + int ndims; + size_t shape[NC_MAX_VAR_DIMS]; + int stat = nc_inq_varndims(ncid,varid, &ndims); + if(stat) return stat; + stat = NC_getshape(ncid,varid, ndims, shape); + if(stat) return stat; + return NC_get_vara(ncid, varid, NC_coord_zero, shape, value, memtype); +} + +/** \internal +\ingroup variables + Most dispatch tables will use the default procedures +*/ +int +NCDEFAULT_get_vars(int ncid, int varid, const size_t * start, + const size_t * edges, const ptrdiff_t * stride, + void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_varm(ncid,varid,start,edges,stride,NULL,value,memtype); +} + +/** \internal +\ingroup variables + */ +static int +NC_get_var1(int ncid, int varid, const size_t *coord, void* value, + nc_type memtype) +{ + return NC_get_vara(ncid, varid, coord, NC_coord_one, value, memtype); +} + +/** \internal +\ingroup variables + */ +int +NCDEFAULT_get_varm(int ncid, int varid, const size_t *start, + const size_t *edges, const ptrdiff_t *stride, + const ptrdiff_t *imapp, void *value0, nc_type memtype) +{ + int status = NC_NOERR; + nc_type vartype = NC_NAT; + int varndims,maxidim; + NC* ncp; + size_t memtypelen; + ptrdiff_t cvtmap[NC_MAX_VAR_DIMS]; + char* value = (char*)value0; + + status = NC_check_id (ncid, &ncp); + if(status != NC_NOERR) return status; + +/* + if(NC_indef(ncp)) return NC_EINDEFINE; +*/ + + status = nc_inq_vartype(ncid, varid, &vartype); + if(status != NC_NOERR) return status; + /* Check that this is an atomic type */ + if(vartype >= NC_MAX_ATOMIC_TYPE) + return NC_EMAPTYPE; + + status = nc_inq_varndims(ncid, varid, &varndims); + if(status != NC_NOERR) return status; + + if(memtype == NC_NAT) { + if(imapp != NULL && varndims != 0) { + /* + * convert map units from bytes to units of sizeof(type) + */ + size_t ii; + const ptrdiff_t szof = (ptrdiff_t) nctypelen(vartype); + for(ii = 0; ii < varndims; ii++) { + if(imapp[ii] % szof != 0) { + /*free(cvtmap);*/ + return NC_EINVAL; + } + cvtmap[ii] = imapp[ii] / szof; + } + imapp = cvtmap; + } + memtype = vartype; + } + + if(memtype == NC_CHAR && vartype != NC_CHAR) + return NC_ECHAR; + else if(memtype != NC_CHAR && vartype == NC_CHAR) + return NC_ECHAR; + + memtypelen = nctypelen(memtype); + + maxidim = (int) varndims - 1; + + if (maxidim < 0) + { + /* + * The variable is a scalar; consequently, + * there s only one thing to get and only one place to put it. + * (Why was I called?) + */ + size_t edge1[1] = {1}; + return NC_get_vara(ncid, varid, start, edge1, value, memtype); + } + + /* + * else + * The variable is an array. + */ + { + int idim; + size_t *mystart = NULL; + size_t *myedges; + size_t *iocount; /* count vector */ + size_t *stop; /* stop indexes */ + size_t *length; /* edge lengths in bytes */ + ptrdiff_t *mystride; + ptrdiff_t *mymap; + size_t varshape[NC_MAX_VAR_DIMS]; + int isrecvar; + size_t numrecs; + + /* Compute some dimension related values */ + isrecvar = NC_is_recvar(ncid,varid,&numrecs); + NC_getshape(ncid,varid,varndims,varshape); + + /* + * Verify stride argument; also see if stride is all ones + */ + if(stride != NULL) { + int stride1 = 1; + for (idim = 0; idim <= maxidim; ++idim) + { + if (stride[idim] == 0 + /* cast needed for braindead systems with signed size_t */ + || ((unsigned long) stride[idim] >= X_INT_MAX)) + { + return NC_ESTRIDE; + } + if(stride[idim] != 1) stride1 = 0; + } + /* If stride1 is true, and there is no imap + then call get_vara directly. + */ + if(stride1 && imapp == NULL) { + return NC_get_vara(ncid, varid, start, edges, value, memtype); + } + } + + /* assert(sizeof(ptrdiff_t) >= sizeof(size_t)); */ + /* Allocate space for mystart,mystride,mymap etc.all at once */ + mystart = (size_t *)calloc(varndims * 7, sizeof(ptrdiff_t)); + if(mystart == NULL) return NC_ENOMEM; + myedges = mystart + varndims; + iocount = myedges + varndims; + stop = iocount + varndims; + length = stop + varndims; + mystride = (ptrdiff_t *)(length + varndims); + mymap = mystride + varndims; + + /* + * Initialize I/O parameters. + */ + for (idim = maxidim; idim >= 0; --idim) + { + mystart[idim] = start != NULL + ? start[idim] + : 0; + + if (edges != NULL && edges[idim] == 0) + { + status = NC_NOERR; /* read/write no data */ + goto done; + } + +#ifdef COMPLEX + myedges[idim] = edges != NULL + ? edges[idim] + : idim == 0 && isrecvar + ? numrecs - mystart[idim] + : varshape[idim] - mystart[idim]; +#else + if(edges != NULL) + myedges[idim] = edges[idim]; + else if (idim == 0 && isrecvar) + myedges[idim] = numrecs - mystart[idim]; + else + myedges[idim] = varshape[idim] - mystart[idim]; +#endif + + mystride[idim] = stride != NULL + ? stride[idim] + : 1; + + /* Remember: imapp is byte oriented, not index oriented */ +#ifdef COMPLEX + mymap[idim] = (imapp != NULL + ? imapp[idim] + : (idim == maxidim ? 1 + : mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1])); +#else + if(imapp != NULL) + mymap[idim] = imapp[idim]; + else if (idim == maxidim) + mymap[idim] = 1; + else + mymap[idim] = + mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1]; +#endif + iocount[idim] = 1; + length[idim] = mymap[idim] * myedges[idim]; + stop[idim] = mystart[idim] + myedges[idim] * mystride[idim]; + } + + /* + * Check start, edges + */ + for (idim = maxidim; idim >= 0; --idim) + { + size_t dimlen = + idim == 0 && isrecvar + ? numrecs + : varshape[idim]; + if (mystart[idim] >= dimlen) + { + status = NC_EINVALCOORDS; + goto done; + } + + if (mystart[idim] + myedges[idim] > dimlen) + { + status = NC_EEDGE; + goto done; + } + + } + + + /* Lower body */ + /* + * As an optimization, adjust I/O parameters when the fastest + * dimension has unity stride both externally and internally. + * In this case, the user could have called a simpler routine + * (i.e. ncvar$1() + */ + if (mystride[maxidim] == 1 + && mymap[maxidim] == 1) + { + iocount[maxidim] = myedges[maxidim]; + mystride[maxidim] = (ptrdiff_t) myedges[maxidim]; + mymap[maxidim] = (ptrdiff_t) length[maxidim]; + } + + /* + * Perform I/O. Exit when done. + */ + for (;;) + { + /* TODO: */ + int lstatus = NC_get_vara(ncid, varid, mystart, iocount, + value, memtype); + if (lstatus != NC_NOERR) { + if(status == NC_NOERR || lstatus != NC_ERANGE) + status = lstatus; + } + /* + * The following code permutes through the variable s + * external start-index space and it s internal address + * space. At the UPC, this algorithm is commonly + * called "odometer code". + */ + idim = maxidim; + carry: + value += (mymap[idim] * memtypelen); + mystart[idim] += mystride[idim]; + if (mystart[idim] == stop[idim]) + { + mystart[idim] = start[idim]; + value -= (length[idim] * memtypelen); + if (--idim < 0) + break; /* normal return */ + goto carry; + } + } /* I/O loop */ + done: + free(mystart); + } /* variable is array */ + return status; +} + +/** \ingroup variables +\internal +Called by externally visible nc_get_vars_xxx routines */ +static int +NC_get_vars(int ncid, int varid, const size_t *start, + const size_t *edges, const ptrdiff_t *stride, void *value, + nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + + if(stat != NC_NOERR) return stat; +#ifdef USE_NETCDF4 + if(memtype >= NC_FIRSTUSERTYPEID) memtype = NC_NAT; +#endif + return ncp->dispatch->get_vars(ncid,varid,start,edges,stride,value,memtype); +} + +/** \ingroup variables +\internal +Called by externally visible nc_get_varm_xxx routines + */ +static int +NC_get_varm(int ncid, int varid, const size_t *start, + const size_t *edges, const ptrdiff_t *stride, const ptrdiff_t* map, + void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + + if(stat != NC_NOERR) return stat; +#ifdef USE_NETCDF4 + if(memtype >= NC_FIRSTUSERTYPEID) memtype = NC_NAT; +#endif + return ncp->dispatch->get_varm(ncid,varid,start,edges,stride,map,value,memtype); +} + +/** \name Reading Data from Variables + +Functions to read data from variables. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** \ingroup variables +Read an array of values from a variable. + +The array to be read is specified by giving a corner and a vector of +edge lengths to \ref specify_hyperslab. + +The data values are read into consecutive locations with the last +dimension varying fastest. The netCDF dataset must be in data mode +(for netCDF-4/HDF5 files, the switch to data mode will happen +automatically, unless the classic model is used). + +The nc_get_vara() function will read a variable of any type, +including user defined type. For this function, the type of the data +in memory must match the type of the variable - no data conversion is +done. + +Other nc_get_vara_ functions will convert data to the desired output +type as needed. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param startp Start vector with one element for each dimension to \ref +specify_hyperslab. + +\param countp Count vector with one element for each dimension to \ref +specify_hyperslab. + +\param ip Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_EEDGE Start+count exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. + +\section Example + +Here is an example using nc_get_vara_double() to read all the values of +the variable named rh from an existing netCDF dataset named +foo.nc. For simplicity in this example, we assume that we know that rh +is dimensioned with time, lat, and lon, and that there are three time +values, five lat values, and ten lon values. + +\code + #include + ... + #define TIMES 3 + #define LATS 5 + #define LONS 10 + int status; + int ncid; + int rh_id; + static size_t start[] = {0, 0, 0}; + static size_t count[] = {TIMES, LATS, LONS}; + double rh_vals[TIMES*LATS*LONS]; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_get_vara_double(ncid, rh_id, start, count, rh_vals); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +/**@{*/ +int +nc_get_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, void *ip) +{ + NC* ncp = NULL; + nc_type xtype = NC_NAT; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + stat = nc_inq_vartype(ncid, varid, &xtype); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid, varid, startp, countp, ip, xtype); +} + +int +nc_get_vara_text(int ncid, int varid, const size_t *startp, + const size_t *countp, char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid, varid, startp, countp, + (void *)ip, NC_CHAR); +} + +int +nc_get_vara_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, signed char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid, varid, startp, countp, + (void *)ip, NC_BYTE); +} + +int +nc_get_vara_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid, varid, startp, countp, + (void *)ip, T_uchar); +} + +int +nc_get_vara_short(int ncid, int varid, const size_t *startp, + const size_t *countp, short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid, varid, startp, countp, + (void *)ip, NC_SHORT); +} + +int +nc_get_vara_int(int ncid, int varid, + const size_t *startp, const size_t *countp, int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,NC_INT); +} + +int +nc_get_vara_long(int ncid, int varid, + const size_t *startp, const size_t *countp, long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_long); +} + +int +nc_get_vara_float(int ncid, int varid, + const size_t *startp, const size_t *countp, float *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_float); +} + + +int +nc_get_vara_double(int ncid, int varid, const size_t *startp, + const size_t *countp, double *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_double); +} + +int +nc_get_vara_ubyte(int ncid, int varid, + const size_t *startp, const size_t *countp, unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_ubyte); +} + +int +nc_get_vara_ushort(int ncid, int varid, + const size_t *startp, const size_t *countp, unsigned short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_ushort); +} + +int +nc_get_vara_uint(int ncid, int varid, + const size_t *startp, const size_t *countp, unsigned int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_uint); +} + +int +nc_get_vara_longlong(int ncid, int varid, + const size_t *startp, const size_t *countp, long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,T_longlong); +} + +int +nc_get_vara_ulonglong(int ncid, int varid, + const size_t *startp, const size_t *countp, unsigned long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_get_vara_string(int ncid, int varid, + const size_t *startp, const size_t *countp, char* *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vara(ncid,varid,startp,countp, (void *)ip,NC_STRING); +} + +#endif /*USE_NETCDF4*/ +/**@}*/ + +/** \ingroup variables +Read a single datum from a variable. + +Inputs are the netCDF ID, the variable ID, a multidimensional index +that specifies which value to get, and the address of a location into +which the data value will be read. The value is converted from the +external data type of the variable, if necessary. + +The nc_get_var1() function will read a variable of any type, including +user defined type. For this function, the type of the data in memory +must match the type of the variable - no data conversion is done. + +Other nc_get_var1_ functions will convert data to the desired output +type as needed. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param indexp Index vector with one element for each dimension. + +\param ip Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. +*/ +/** \{ */ +int +nc_get_var1(int ncid, int varid, const size_t *indexp, void *ip) +{ + return NC_get_var1(ncid, varid, indexp, ip, NC_NAT); +} + +int +nc_get_var1_text(int ncid, int varid, const size_t *indexp, char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_CHAR); +} + +int +nc_get_var1_schar(int ncid, int varid, const size_t *indexp, signed char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_BYTE); +} + +int +nc_get_var1_uchar(int ncid, int varid, const size_t *indexp, unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_UBYTE); +} + +int +nc_get_var1_short(int ncid, int varid, const size_t *indexp, short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_SHORT); +} + +int +nc_get_var1_int(int ncid, int varid, const size_t *indexp, int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_INT); +} + +int +nc_get_var1_long(int ncid, int varid, const size_t *indexp, + long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, longtype); +} + +int +nc_get_var1_float(int ncid, int varid, const size_t *indexp, + float *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_FLOAT); +} + +int +nc_get_var1_double(int ncid, int varid, const size_t *indexp, + double *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_DOUBLE); +} + +int +nc_get_var1_ubyte(int ncid, int varid, const size_t *indexp, + unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_UBYTE); +} + +int +nc_get_var1_ushort(int ncid, int varid, const size_t *indexp, + unsigned short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_USHORT); +} + +int +nc_get_var1_uint(int ncid, int varid, const size_t *indexp, + unsigned int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_INT); +} + +int +nc_get_var1_longlong(int ncid, int varid, const size_t *indexp, + long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_INT64); +} + +int +nc_get_var1_ulonglong(int ncid, int varid, const size_t *indexp, + unsigned long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_get_var1_string(int ncid, int varid, const size_t *indexp, char* *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var1(ncid, varid, indexp, (void *)ip, NC_STRING); +} +#endif /*USE_NETCDF4*/ +/** \} */ + +/** \ingroup variables +Read an entire variable in one call. + +This function will read all the values from a netCDF variable of an +open netCDF dataset. + +This is the simplest interface to use for reading the value of a +scalar variable or when all the values of a multidimensional variable +can be read at once. The values are read into consecutive locations +with the last dimension varying fastest. The netCDF dataset must be in +data mode. + +Take care when using this function with record variables (variables +that use the ::NC_UNLIMITED dimension). If you try to read all the +values of a record variable into an array but there are more records +in the file than you assume, more data will be read than you expect, +which may cause a segmentation violation. To avoid such problems, it +is better to use the nc_get_vara interfaces for variables that use the +::NC_UNLIMITED dimension. + +The functions for types ubyte, ushort, uint, longlong, ulonglong, and +string are only available for netCDF-4/HDF5 files. + +The nc_get_var() function will read a variable of any type, including +user defined type. For this function, the type of the data in memory +must match the type of the variable - no data conversion is done. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param ip Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. +*/ +/** \{ */ +int +nc_get_var(int ncid, int varid, void *ip) +{ + return NC_get_var(ncid, varid, ip, NC_NAT); +} + +int +nc_get_var_text(int ncid, int varid, char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid, varid, (void *)ip, NC_CHAR); +} + +int +nc_get_var_schar(int ncid, int varid, signed char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid, varid, (void *)ip, NC_BYTE); +} + +int +nc_get_var_uchar(int ncid, int varid, unsigned char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_UBYTE); +} + +int +nc_get_var_short(int ncid, int varid, short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid, varid, (void *)ip, NC_SHORT); +} + +int +nc_get_var_int(int ncid, int varid, int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_INT); +} + +int +nc_get_var_long(int ncid, int varid, long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, longtype); +} + +int +nc_get_var_float(int ncid, int varid, float *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_FLOAT); +} + +int +nc_get_var_double(int ncid, int varid, double *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_DOUBLE); +} + +int +nc_get_var_ubyte(int ncid, int varid, unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_UBYTE); +} + +int +nc_get_var_ushort(int ncid, int varid, unsigned short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_USHORT); +} + +int +nc_get_var_uint(int ncid, int varid, unsigned int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_UINT); +} + +int +nc_get_var_longlong(int ncid, int varid, long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip, NC_INT64); +} + +int +nc_get_var_ulonglong(int ncid, int varid, unsigned long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip,NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_get_var_string(int ncid, int varid, char* *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_var(ncid,varid, (void *)ip,NC_STRING); +} +#endif /*USE_NETCDF4*/ +/** \} */ + +/** \ingroup variables +Read a strided array from a variable. + +This function reads a subsampled (strided) array section of values +from a netCDF variable of an open netCDF dataset. The subsampled array +section is specified by giving a corner, a vector of edge lengths, and +a stride vector. The values are read with the last dimension of the +netCDF variable varying fastest. The netCDF dataset must be in data +mode. + +The nc_get_vars() function will read a variable of any type, including +user defined type. For this function, the type of the data in memory +must match the type of the variable - no data conversion is done. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param startp Start vector with one element for each dimension to \ref +specify_hyperslab. + +\param countp Count vector with one element for each dimension to \ref +specify_hyperslab. + +\param stridep Stride vector with one element for each dimension to +\ref specify_hyperslab. + +\param ip Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. +*/ +/** \{ */ +int +nc_get_vars (int ncid, int varid, const size_t * startp, + const size_t * countp, const ptrdiff_t * stridep, + void *ip) +{ + NC* ncp; + int stat = NC_NOERR; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + return ncp->dispatch->get_vars(ncid, varid, startp, countp, stridep, + ip, NC_NAT); +} + +int +nc_get_vars_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, NC_CHAR); +} + +int +nc_get_vars_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + signed char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, NC_BYTE); +} + +int +nc_get_vars_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, T_uchar); +} + +int +nc_get_vars_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, NC_SHORT); +} + +int +nc_get_vars_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, NC_INT); +} + +int +nc_get_vars_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, T_long); +} + +int +nc_get_vars_float(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + float *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, T_float); +} + +int +nc_get_vars_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + double *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, T_double); +} + +int +nc_get_vars_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + unsigned char *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid, startp, countp, stridep, + (void *)ip, T_ubyte); +} + +int +nc_get_vars_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + unsigned short *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp,countp, stridep, + (void *)ip, T_ushort); +} + +int +nc_get_vars_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + unsigned int *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid,varid,startp, countp, stridep, + (void *)ip, T_uint); +} + +int +nc_get_vars_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid, varid, startp, countp, stridep, + (void *)ip, T_longlong); +} + +int +nc_get_vars_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t * stridep, + unsigned long long *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid, varid, startp, countp, stridep, + (void *)ip, NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_get_vars_string(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t * stridep, + char* *ip) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_vars(ncid, varid, startp, countp, stridep, + (void *)ip, NC_STRING); +} +#endif /*USE_NETCDF4*/ +/** \} */ + +/** \ingroup variables +Read a mapped array from a variable. + +The nc_get_varm_ type family of functions reads a mapped array section +of values from a netCDF variable of an open netCDF dataset. The mapped +array section is specified by giving a corner, a vector of edge +lengths, a stride vector, and an index mapping vector. The index +mapping vector is a vector of integers that specifies the mapping +between the dimensions of a netCDF variable and the in-memory +structure of the internal data array. No assumptions are made about +the ordering or length of the dimensions of the data array. The netCDF +dataset must be in data mode. + +The functions for types ubyte, ushort, uint, longlong, ulonglong, and +string are only available for netCDF-4/HDF5 files. + +The nc_get_varm() function will read a variable of any type, including +user defined type. For this function, the type of the data in memory +must match the type of the variable - no data conversion is done. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param startp Start vector with one element for each dimension to \ref +specify_hyperslab. + +\param countp Count vector with one element for each dimension to \ref +specify_hyperslab. + +\param stridep Stride vector with one element for each dimension to +\ref specify_hyperslab. + +\param imapp Mapping vector with one element for each dimension to +\ref specify_hyperslab. + +\param ip Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. +*/ +/** \{ */ +int +nc_get_varm(int ncid, int varid, const size_t * startp, + const size_t * countp, const ptrdiff_t * stridep, + const ptrdiff_t * imapp, void *ip) +{ + NC* ncp; + int stat = NC_NOERR; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + return ncp->dispatch->get_varm(ncid, varid, startp, countp, + stridep, imapp, ip, NC_NAT); +} + +int +nc_get_varm_schar(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const ptrdiff_t *imapp, signed char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, + stridep, imapp, (void *)ip, NC_BYTE); +} + +int +nc_get_varm_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + unsigned char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (void *)ip,T_uchar); +} + +int +nc_get_varm_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, short *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (void *)ip,NC_SHORT); +} + +int +nc_get_varm_int(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + int *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (void *)ip,NC_INT); +} + +int +nc_get_varm_long(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + long *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (void *)ip,T_long); +} + +int +nc_get_varm_float(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + float *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (void *)ip,T_float); +} + +int +nc_get_varm_double(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + double *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep,imapp, (void *)ip,T_double); +} + +int +nc_get_varm_ubyte(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + unsigned char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid,varid,startp,countp,stridep, + imapp, (void *)ip, T_ubyte); +} + +int +nc_get_varm_ushort(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + unsigned short *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, stridep, + imapp, (void *)ip, T_ushort); +} + +int +nc_get_varm_uint(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + unsigned int *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, + stridep, imapp, (void *)ip, T_uint); +} + +int +nc_get_varm_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, long long *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)ip, T_longlong); +} + +int +nc_get_varm_ulonglong(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + unsigned long long *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)ip, NC_UINT64); +} + +int +nc_get_varm_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, char *ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)ip, NC_CHAR); +} + +#ifdef USE_NETCDF4 +int +nc_get_varm_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, char **ip) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_get_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)ip, NC_STRING); +} +/** \} */ +#endif /*USE_NETCDF4*/ + +/*! \} */ /* End of named group... */ + diff --git a/extern/src_netcdf4/dvarinq.c b/extern/src_netcdf4/dvarinq.c new file mode 100644 index 0000000..3f94770 --- /dev/null +++ b/extern/src_netcdf4/dvarinq.c @@ -0,0 +1,573 @@ +/*! \file +Functions for inquiring about variables. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include "ncdispatch.h" + +/** \name Learning about Variables + +Functions to learn about the variables in a file. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** +\ingroup variables +Find the ID of a variable, from the name. + +The function nc_inq_varid returns the ID of a netCDF variable, given +its name. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param name Name of the variable. + +\param varidp Pointer to location for returned variable ID. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. + +\section Example + +Here is an example using nc_inq_varid to find out the ID of a variable +named rh in an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status, ncid, rh_id; + ... + status = nc_open("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); +\endcode + */ +int +nc_inq_varid(int ncid, const char *name, int *varidp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_varid(ncid, name, varidp); +} + +/** +\ingroup variables +Learn about a variable. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param name Returned \ref object_name of variable. \ref +ignored_if_null. + +\param xtypep Pointer where typeid will be stored. \ref ignored_if_null. + +\param ndimsp Pointer where number of dimensions will be +stored. \ref ignored_if_null. + +\param dimidsp Pointer where array of dimension IDs will be +stored. \ref ignored_if_null. + +\param nattsp Pointer where number of attributes will be +stored. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. + +\section Example + +Here is an example using nc_inq_var() to find out about a variable named +rh in an existing netCDF dataset named foo.nc: + +\code + #include + ... + int status + int ncid; + int rh_id; + nc_type rh_type; + int rh_ndims; + int rh_dimids[NC_MAX_VAR_DIMS]; + int rh_natts + ... + status = nc_open ("foo.nc", NC_NOWRITE, &ncid); + if (status != NC_NOERR) handle_error(status); + ... + status = nc_inq_varid (ncid, "rh", &rh_id); + if (status != NC_NOERR) handle_error(status); + status = nc_inq_var (ncid, rh_id, 0, &rh_type, &rh_ndims, rh_dimids, + &rh_natts); + if (status != NC_NOERR) handle_error(status); +\endcode + + */ +int +nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all(ncid, varid, name, xtypep, ndimsp, + dimidsp, nattsp, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +} + +/** +\ingroup variables +Learn the name of a variable. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param name Returned variable name. The caller must allocate space for +the returned name. The maximum length is ::NC_MAX_NAME. Ignored if +NULL. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. + */ +int +nc_inq_varname(int ncid, int varid, char *name) +{ + return nc_inq_var(ncid, varid, name, NULL, NULL, + NULL, NULL); +} + +/** Learn the type of a variable. +\ingroup variables + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param typep Pointer where typeid will be stored. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. + */ +int +nc_inq_vartype(int ncid, int varid, nc_type *typep) +{ + return nc_inq_var(ncid, varid, NULL, typep, NULL, + NULL, NULL); +} + +/** Learn how many dimensions are associated with a variable. +\ingroup variables + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param ndimsp Pointer where number of dimensions will be +stored. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. + */ +int +nc_inq_varndims(int ncid, int varid, int *ndimsp) +{ + return nc_inq_var(ncid, varid, NULL, NULL, ndimsp, NULL, NULL); +} + +/** Learn the dimension IDs associated with a variable. +\ingroup variables + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param dimidsp Pointer where array of dimension IDs will be +stored. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. + */ +int +nc_inq_vardimid(int ncid, int varid, int *dimidsp) +{ + return nc_inq_var(ncid, varid, NULL, NULL, NULL, + dimidsp, NULL); +} + +/** Learn how many attributes are associated with a variable. +\ingroup variables + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param nattsp Pointer where number of attributes will be +stored. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. + */ +int +nc_inq_varnatts(int ncid, int varid, int *nattsp) +{ + if (varid == NC_GLOBAL) + return nc_inq_natts(ncid,nattsp); + /*else*/ + return nc_inq_var(ncid, varid, NULL, NULL, NULL, NULL, + nattsp); +} + +#ifdef USE_NETCDF4 +/** \ingroup variables +Learn the storage and deflate settings for a variable. + +This is a wrapper for nc_inq_var_all(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param shufflep A 1 will be written here if the shuffle filter is +turned on for this variable, and a 0 otherwise. \ref ignored_if_null. + +\param deflatep If this pointer is non-NULL, the nc_inq_var_deflate +function will write a 1 if the deflate filter is turned on for this +variable, and a 0 otherwise. \ref ignored_if_null. + +\param deflate_levelp If the deflate filter is in use for this +variable, the deflate_level will be writen here. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTNC4 Not a netCDF-4 file. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. +*/ +int +nc_inq_var_deflate(int ncid, int varid, int *shufflep, int *deflatep, + int *deflate_levelp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all( + ncid, varid, + NULL, /*name*/ + NULL, /*xtypep*/ + NULL, /*ndimsp*/ + NULL, /*dimidsp*/ + NULL, /*nattsp*/ + shufflep, /*shufflep*/ + deflatep, /*deflatep*/ + deflate_levelp, /*deflatelevelp*/ + NULL, /*fletcher32p*/ + NULL, /*contiguousp*/ + NULL, /*chunksizep*/ + NULL, /*nofillp*/ + NULL, /*fillvaluep*/ + NULL, /*endianp*/ + NULL, /*optionsmaskp*/ + NULL /*pixelsp*/ + ); +} + +/** \ingroup variables +Learn the szip settings of a variable. + +This function returns the szip settings for a variable. NetCDF does +not allow variables to be created with szip (due to license problems +with the szip library), but we do enable read-only access of HDF5 +files with szip compression. + +This is a wrapper for nc_inq_var_all(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param options_maskp The szip options mask will be copied to this +pointer. \ref ignored_if_null. + +\param pixels_per_blockp The szip pixels per block will be copied +here. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTNC4 Not a netCDF-4 file. +\returns ::NC_ENOTVAR Invalid variable ID. +*/ +int +nc_inq_var_szip(int ncid, int varid, int *options_maskp, int *pixels_per_blockp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all( + ncid, varid, + NULL, /*name*/ + NULL, /*xtypep*/ + NULL, /*ndimsp*/ + NULL, /*dimidsp*/ + NULL, /*nattsp*/ + NULL, /*shufflep*/ + NULL, /*deflatep*/ + NULL, /*deflatelevelp*/ + NULL, /*fletcher32p*/ + NULL, /*contiguousp*/ + NULL, /*chunksizep*/ + NULL, /*nofillp*/ + NULL, /*fillvaluep*/ + NULL, /*endianp*/ + options_maskp, /*optionsmaskp*/ + pixels_per_blockp /*pixelsp*/ + ); +} + +/** \ingroup variables +Learn the checksum settings for a variable. + +This is a wrapper for nc_inq_var_all(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param fletcher32p Will be set to ::NC_FLETCHER32 if the fletcher32 +checksum filter is turned on for this variable, and ::NC_NOCHECKSUM if +it is not. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTNC4 Not a netCDF-4 file. +\returns ::NC_ENOTVAR Invalid variable ID. +*/ +int +nc_inq_var_fletcher32(int ncid, int varid, int *fletcher32p) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all( + ncid, varid, + NULL, /*name*/ + NULL, /*xtypep*/ + NULL, /*ndimsp*/ + NULL, /*dimidsp*/ + NULL, /*nattsp*/ + NULL, /*shufflep*/ + NULL, /*deflatep*/ + NULL, /*deflatelevelp*/ + fletcher32p, /*fletcher32p*/ + NULL, /*contiguousp*/ + NULL, /*chunksizep*/ + NULL, /*nofillp*/ + NULL, /*fillvaluep*/ + NULL, /*endianp*/ + NULL, /*optionsmaskp*/ + NULL /*pixelsp*/ + ); +} + +/** \ingroup variables + +This is a wrapper for nc_inq_var_all(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param storagep Address of returned storage property, returned as +::NC_CONTIGUOUS if this variable uses contiguous storage, or +::NC_CHUNKED if it uses chunked storage. \ref ignored_if_null. + +\param chunksizesp The chunksizes will be copied here. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTNC4 Not a netCDF-4 file. +\returns ::NC_ENOTVAR Invalid variable ID. +*/ +int +nc_inq_var_chunking(int ncid, int varid, int *storagep, size_t *chunksizesp) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all(ncid, varid, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, storagep, + chunksizesp, NULL, NULL, NULL, NULL, NULL); +} + +/** \ingroup variables +Learn the fill mode of a variable. + +The fill mode of a variable is set by nc_def_var_fill(). + +This is a wrapper for nc_inq_var_all(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param no_fill Pointer to an integer which will get a 1 if no_fill +mode is set for this variable. \ref ignored_if_null. + +\param fill_valuep A pointer which will get the fill value for this +variable. \ref ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. +*/ +int +nc_inq_var_fill(int ncid, int varid, int *no_fill, void *fill_valuep) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all( + ncid, varid, + NULL, /*name*/ + NULL, /*xtypep*/ + NULL, /*ndimsp*/ + NULL, /*dimidsp*/ + NULL, /*nattsp*/ + NULL, /*shufflep*/ + NULL, /*deflatep*/ + NULL, /*deflatelevelp*/ + NULL, /*fletcher32p*/ + NULL, /*contiguousp*/ + NULL, /*chunksizep*/ + no_fill, /*nofillp*/ + fill_valuep, /*fillvaluep*/ + NULL, /*endianp*/ + NULL, /*optionsmaskp*/ + NULL /*pixelsp*/ + ); +} + +/** \ingroup variables +Find the endianness of a variable. + +This is a wrapper for nc_inq_var_all(). + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param endianp Storage which will get ::NC_ENDIAN_LITTLE if this +variable is stored in little-endian format, ::NC_ENDIAN_BIG if it is +stored in big-endian format, and ::NC_ENDIAN_NATIVE if the endianness +is not set, and the variable is not created yet. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTNC4 Not a netCDF-4 file. +\returns ::NC_EBADID Bad ncid. +\returns ::NC_ENOTVAR Invalid variable ID. +*/ +int +nc_inq_var_endian(int ncid, int varid, int *endianp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_var_all( + ncid, varid, + NULL, /*name*/ + NULL, /*xtypep*/ + NULL, /*ndimsp*/ + NULL, /*dimidsp*/ + NULL, /*nattsp*/ + NULL, /*shufflep*/ + NULL, /*deflatep*/ + NULL, /*deflatelevelp*/ + NULL, /*fletcher32p*/ + NULL, /*contiguousp*/ + NULL, /*chunksizep*/ + NULL, /*nofillp*/ + NULL, /*fillvaluep*/ + endianp, /*endianp*/ + NULL, /*optionsmaskp*/ + NULL /*pixelsp*/ + ); +} + +/** Return number and list of unlimited dimensions. + +In netCDF-4 files, it's possible to have multiple unlimited +dimensions. This function returns a list of the unlimited dimension +ids visible in a group. + +Dimensions are visible in a group if they have been defined in that +group, or any ancestor group. + +ncid + NetCDF group ID, from a previous call to nc_open, nc_create, nc_def_grp, etc. +nunlimdimsp + A pointer to an int which will get the number of visible unlimited dimensions. Ignored if NULL. +unlimdimidsp + A pointer to an already allocated array of int which will get the ids of all visible unlimited dimensions. Ignored if NULL. To allocate the correct length for this array, call nc_inq_unlimdims with a NULL for this parameter and use the nunlimdimsp parameter to get the number of visible unlimited dimensions. + +Errors + +NC_NOERR + No error. +NC_EBADID + Bad group id. +NC_ENOTNC4 + Attempting a netCDF-4 operation on a netCDF-3 file. NetCDF-4 operations can only be performed on files defined with a create mode which includes flag HDF5. (see nc_open). +NC_ESTRICTNC3 + This file was created with the strict netcdf-3 flag, therefore netcdf-4 operations are not allowed. (see nc_open). +NC_EHDFERR + An error was reported by the HDF5 layer. + + */ +int +nc_inq_unlimdims(int ncid, int *nunlimdimsp, int *unlimdimidsp) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->inq_unlimdims(ncid, nunlimdimsp, + unlimdimidsp); +} + +#endif /* USE_NETCDF4 */ +/*! \} */ /* End of named group ...*/ diff --git a/extern/src_netcdf4/dvarput.c b/extern/src_netcdf4/dvarput.c new file mode 100644 index 0000000..bb18c4a --- /dev/null +++ b/extern/src_netcdf4/dvarput.c @@ -0,0 +1,1358 @@ +/*! \file +Functions for writing data to variables. + +Copyright 2010 University Corporation for Atmospheric +Research/Unidata. See COPYRIGHT file for more info. +*/ + +#include "ncdispatch.h" + +/** \internal +\ingroup variables +*/ +static int +NC_put_vara(int ncid, int varid, const size_t *start, + const size_t *edges, const void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + if(edges == NULL) { + size_t shape[NC_MAX_VAR_DIMS]; + int ndims; + stat = nc_inq_varndims(ncid, varid, &ndims); + if(stat != NC_NOERR) return stat; + stat = NC_getshape(ncid, varid, ndims, shape); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_vara(ncid, varid, start, shape, value, memtype); + } else + return ncp->dispatch->put_vara(ncid, varid, start, edges, value, memtype); +} + +/** \internal +\ingroup variables +*/ +static int +NC_put_var(int ncid, int varid, const void *value, nc_type memtype) +{ + int ndims; + size_t shape[NC_MAX_VAR_DIMS]; + int stat = nc_inq_varndims(ncid,varid, &ndims); + if(stat) return stat; + stat = NC_getshape(ncid,varid, ndims, shape); + if(stat) return stat; + return NC_put_vara(ncid, varid, NC_coord_zero, shape, value, memtype); +} + +/** \internal +\ingroup variables +*/ +static int +NC_put_var1(int ncid, int varid, const size_t *coord, const void* value, + nc_type memtype) +{ + return NC_put_vara(ncid, varid, coord, NC_coord_one, value, memtype); +} + +/** \internal +\ingroup variables +*/ +int +NCDEFAULT_put_vars(int ncid, int varid, const size_t * start, + const size_t * edges, const ptrdiff_t * stride, + const void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_varm(ncid,varid,start,edges,stride,NULL,value,memtype); +} + +/** \internal +\ingroup variables +*/ +int +NCDEFAULT_put_varm( + int ncid, + int varid, + const size_t * start, + const size_t * edges, + const ptrdiff_t * stride, + const ptrdiff_t * imapp, + const void *value0, + nc_type memtype) +{ + int status = NC_NOERR; + nc_type vartype = NC_NAT; + int varndims = 0; + int maxidim = 0; + NC* ncp; + size_t memtypelen; + ptrdiff_t cvtmap[NC_MAX_VAR_DIMS]; + const char* value = (char*)value0; + + status = NC_check_id (ncid, &ncp); + if(status != NC_NOERR) return status; + +/* + if(NC_indef(ncp)) return NC_EINDEFINE; + if(NC_readonly (ncp)) return NC_EPERM; +*/ + + /* mid body */ + status = nc_inq_vartype(ncid, varid, &vartype); + if(status != NC_NOERR) return status; + /* Check that this is an atomic type */ + if(vartype >= NC_MAX_ATOMIC_TYPE) + return NC_EMAPTYPE; + + status = nc_inq_varndims(ncid, varid, &varndims); + if(status != NC_NOERR) return status; + + if(memtype == NC_NAT) { + if(imapp != NULL && varndims != 0) { + /* + * convert map units from bytes to units of sizeof(type) + */ + size_t ii; + const ptrdiff_t szof = (ptrdiff_t) nctypelen(vartype); + for(ii = 0; ii < varndims; ii++) { + if(imapp[ii] % szof != 0) { + /*free(cvtmap);*/ + return NC_EINVAL; + } + cvtmap[ii] = imapp[ii] / szof; + } + imapp = cvtmap; + } + memtype = vartype; + } + + if(memtype == NC_CHAR && vartype != NC_CHAR) + return NC_ECHAR; + else if(memtype != NC_CHAR && vartype == NC_CHAR) + return NC_ECHAR; + + memtypelen = nctypelen(memtype); + + maxidim = (int) varndims - 1; + + if (maxidim < 0) + { + /* + * The variable is a scalar; consequently, + * there s only one thing to get and only one place to put it. + * (Why was I called?) + */ + size_t edge1[1] = {1}; + return NC_put_vara(ncid, varid, start, edge1, value, memtype); + } + + /* + * else + * The variable is an array. + */ + { + int idim; + size_t *mystart = NULL; + size_t *myedges; + size_t *iocount; /* count vector */ + size_t *stop; /* stop indexes */ + size_t *length; /* edge lengths in bytes */ + ptrdiff_t *mystride; + ptrdiff_t *mymap; + size_t varshape[NC_MAX_VAR_DIMS]; + int isrecvar; + size_t numrecs; + int stride1; /* is stride all ones? */ + + /* + * Verify stride argument. + */ + stride1 = 1; /* assume ok; */ + if(stride != NULL) { + for (idim = 0; idim <= maxidim; ++idim) { + if ((stride[idim] == 0) + /* cast needed for braindead systems with signed size_t */ + || ((unsigned long) stride[idim] >= X_INT_MAX)) + { + return NC_ESTRIDE; + } + if(stride[idim] != 1) stride1 = 0; + } + } + + /* If stride1 is true, and there is no imap, then call get_vara + directly + */ + if(stride1 && imapp == NULL) { + return NC_put_vara(ncid, varid, start, edges, value, memtype); + } + + /* Compute some dimension related values */ + isrecvar = NC_is_recvar(ncid,varid,&numrecs); + NC_getshape(ncid,varid,varndims,varshape); + + /* assert(sizeof(ptrdiff_t) >= sizeof(size_t)); */ + mystart = (size_t *)calloc(varndims * 7, sizeof(ptrdiff_t)); + if(mystart == NULL) return NC_ENOMEM; + myedges = mystart + varndims; + iocount = myedges + varndims; + stop = iocount + varndims; + length = stop + varndims; + mystride = (ptrdiff_t *)(length + varndims); + mymap = mystride + varndims; + + /* + * Initialize I/O parameters. + */ + for (idim = maxidim; idim >= 0; --idim) + { + mystart[idim] = start != NULL + ? start[idim] + : 0; + + if (edges != NULL && edges[idim] == 0) + { + status = NC_NOERR; /* read/write no data */ + goto done; + } + + myedges[idim] = edges != NULL + ? edges[idim] + : idim == 0 && isrecvar + ? numrecs - mystart[idim] + : varshape[idim] - mystart[idim]; + mystride[idim] = stride != NULL + ? stride[idim] + : 1; + mymap[idim] = imapp != NULL + ? imapp[idim] + : idim == maxidim + ? 1 + : mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1]; + + iocount[idim] = 1; + length[idim] = mymap[idim] * myedges[idim]; + stop[idim] = mystart[idim] + myedges[idim] * mystride[idim]; + } + + /* + * Check start, edges + */ + for (idim = isrecvar; idim < maxidim; ++idim) + { + if (mystart[idim] > varshape[idim]) + { + status = NC_EINVALCOORDS; + goto done; + } + if (mystart[idim] + myedges[idim] > varshape[idim]) + { + status = NC_EEDGE; + goto done; + } + } + + /* Lower body */ + /* + * As an optimization, adjust I/O parameters when the fastest + * dimension has unity stride both externally and internally. + * In this case, the user could have called a simpler routine + * (i.e. ncvar$1() + */ + if (mystride[maxidim] == 1 + && mymap[maxidim] == 1) + { + iocount[maxidim] = myedges[maxidim]; + mystride[maxidim] = (ptrdiff_t) myedges[maxidim]; + mymap[maxidim] = (ptrdiff_t) length[maxidim]; + } + + /* + * Perform I/O. Exit when done. + */ + for (;;) + { + /* TODO: */ + int lstatus = NC_put_vara(ncid, varid, mystart, iocount, + value, memtype); + if (lstatus != NC_NOERR) { + if(status == NC_NOERR || lstatus != NC_ERANGE) + status = lstatus; + } + + /* + * The following code permutes through the variable s + * external start-index space and it s internal address + * space. At the UPC, this algorithm is commonly + * called "odometer code". + */ + idim = maxidim; + carry: + value += (mymap[idim] * memtypelen); + mystart[idim] += mystride[idim]; + if (mystart[idim] == stop[idim]) + { + mystart[idim] = start[idim]; + value -= (length[idim] * memtypelen); + if (--idim < 0) + break; /* normal return */ + goto carry; + } + } /* I/O loop */ + done: + free(mystart); + } /* variable is array */ + return status; +} + +/** \internal +\ingroup variables +*/ +static int +NC_put_vars(int ncid, int varid, const size_t *start, + const size_t *edges, const ptrdiff_t *stride, + const void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + + if(stat != NC_NOERR) return stat; +#ifdef USE_NETCDF4 + if(memtype >= NC_FIRSTUSERTYPEID) memtype = NC_NAT; +#endif + return ncp->dispatch->put_vars(ncid,varid,start,edges,stride,value,memtype); +} + +/** \internal +\ingroup variables +*/ +static int +NC_put_varm(int ncid, int varid, const size_t *start, + const size_t *edges, const ptrdiff_t *stride, const ptrdiff_t* map, + const void *value, nc_type memtype) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + + if(stat != NC_NOERR) return stat; +#ifdef USE_NETCDF4 + if(memtype >= NC_FIRSTUSERTYPEID) memtype = NC_NAT; +#endif + return ncp->dispatch->put_varm(ncid,varid,start,edges,stride,map,value,memtype); +} + +/** \name Writing Data to Variables + +Functions to write data from variables. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** \ingroup variables +Write an array of values to a variable. + +The values to be written are associated with the netCDF variable by +assuming that the last dimension of the netCDF variable varies fastest +in the C interface. The netCDF dataset must be in data mode. The array +to be written is specified by giving a corner and a vector of edge +lengths to \ref specify_hyperslab. + +The functions for types ubyte, ushort, uint, longlong, ulonglong, and +string are only available for netCDF-4/HDF5 files. + +The nc_put_var() function will write a variable of any type, including +user defined type. For this function, the type of the data in memory +must match the type of the variable - no data conversion is done. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param startp Start vector with one element for each dimension to \ref +specify_hyperslab. + +\param countp Count vector with one element for each dimension to \ref +specify_hyperslab. + +\param op Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_EEDGE Start+count exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. + */ +/**@{*/ +int +nc_put_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, const void *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + nc_type xtype; + if(stat != NC_NOERR) return stat; + stat = nc_inq_vartype(ncid, varid, &xtype); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, op, xtype); +} + +int +nc_put_vara_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const char *op) +{ + return NC_put_vara(ncid, varid, startp, countp, + (void*)op, NC_CHAR); +} + +int +nc_put_vara_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const signed char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + NC_BYTE); +} + +int +nc_put_vara_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_uchar); +} + +int +nc_put_vara_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const short *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + NC_SHORT); +} + +int +nc_put_vara_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const int *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + NC_INT); +} + +int +nc_put_vara_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_long); +} + +int +nc_put_vara_float(int ncid, int varid, const size_t *startp, + const size_t *countp, const float *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_float); +} + +int +nc_put_vara_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const double *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_double); +} + +int +nc_put_vara_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_ubyte); +} + +int +nc_put_vara_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned short *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_ushort); +} + +int +nc_put_vara_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned int *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_uint); +} + +int +nc_put_vara_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const long long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + T_longlong); +} + +int +nc_put_vara_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned long long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_put_vara_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const char* *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vara(ncid, varid, startp, countp, (void *)op, + NC_STRING); +} + +#endif /*USE_NETCDF4*/ +/**@}*/ + +/** \ingroup variables +Write one datum. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param indexp Index vector with one element for each dimension. + +\param op Pointer from where the data will be copied. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_EEDGE Start+count exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. + */ +/**@{*/ +int +nc_put_var1(int ncid, int varid, const size_t *indexp, const void *op) +{ + return NC_put_var1(ncid, varid, indexp, op, NC_NAT); +} + +int +nc_put_var1_text(int ncid, int varid, const size_t *indexp, const char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_CHAR); +} + +int +nc_put_var1_schar(int ncid, int varid, const size_t *indexp, const signed char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_BYTE); +} + +int +nc_put_var1_uchar(int ncid, int varid, const size_t *indexp, const unsigned char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_UBYTE); +} + +int +nc_put_var1_short(int ncid, int varid, const size_t *indexp, const short *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_SHORT); +} + +int +nc_put_var1_int(int ncid, int varid, const size_t *indexp, const int *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_INT); +} + +int +nc_put_var1_long(int ncid, int varid, const size_t *indexp, const long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void*)op, longtype); +} + +int +nc_put_var1_float(int ncid, int varid, const size_t *indexp, const float *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void*)op, NC_FLOAT); +} + +int +nc_put_var1_double(int ncid, int varid, const size_t *indexp, const double *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_DOUBLE); +} + +int +nc_put_var1_ubyte(int ncid, int varid, const size_t *indexp, const unsigned char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_UBYTE); +} + +int +nc_put_var1_ushort(int ncid, int varid, const size_t *indexp, const unsigned short *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_USHORT); +} + +int +nc_put_var1_uint(int ncid, int varid, const size_t *indexp, const unsigned int *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_UINT); +} + +int +nc_put_var1_longlong(int ncid, int varid, const size_t *indexp, const long long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_INT64); +} + +int +nc_put_var1_ulonglong(int ncid, int varid, const size_t *indexp, const unsigned long long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void *)op, NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_put_var1_string(int ncid, int varid, const size_t *indexp, const char* *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var1(ncid, varid, indexp, (void*)op, NC_STRING); +} +#endif /*USE_NETCDF4*/ +/**@}*/ + +/** \ingroup variables +Write an entire variable with one call. + +The nc_put_var_ type family of functions write all the values of a +variable into a netCDF variable of an open netCDF dataset. This is the +simplest interface to use for writing a value in a scalar variable or +whenever all the values of a multidimensional variable can all be +written at once. The values to be written are associated with the +netCDF variable by assuming that the last dimension of the netCDF +variable varies fastest in the C interface. The values are converted +to the external data type of the variable, if necessary. + +Take care when using this function with record variables (variables +that use the ::NC_UNLIMITED dimension). If you try to write all the +values of a record variable into a netCDF file that has no record data +yet (hence has 0 records), nothing will be written. Similarly, if you +try to write all the values of a record variable but there are more +records in the file than you assume, more in-memory data will be +accessed than you supply, which may result in a segmentation +violation. To avoid such problems, it is better to use the nc_put_vara +interfaces for variables that use the ::NC_UNLIMITED dimension. + +The functions for types ubyte, ushort, uint, longlong, ulonglong, and +string are only available for netCDF-4/HDF5 files. + +The nc_put_var() function will write a variable of any type, including +user defined type. For this function, the type of the data in memory +must match the type of the variable - no data conversion is done. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param op Pointer from where the data will be copied. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_EEDGE Start+count exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. + */ +/**@{*/ +int +nc_put_var(int ncid, int varid, const void *op) +{ + return NC_put_var(ncid, varid, op, NC_NAT); +} + +int +nc_put_var_text(int ncid, int varid, const char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,NC_CHAR); +} + +int +nc_put_var_schar(int ncid, int varid, const signed char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,NC_BYTE); +} + +int +nc_put_var_uchar(int ncid, int varid, const unsigned char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_uchar); +} + +int +nc_put_var_short(int ncid, int varid, const short *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,NC_SHORT); +} + +int +nc_put_var_int(int ncid, int varid, const int *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,NC_INT); +} + +int +nc_put_var_long(int ncid, int varid, const long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_long); +} + +int +nc_put_var_float(int ncid, int varid, const float *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_float); +} + +int +nc_put_var_double(int ncid, int varid, const double *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_double); +} + +int +nc_put_var_ubyte(int ncid, int varid, const unsigned char *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_ubyte); +} + +int +nc_put_var_ushort(int ncid, int varid, const unsigned short *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_ushort); +} + +int +nc_put_var_uint(int ncid, int varid, const unsigned int *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_uint); +} + +int +nc_put_var_longlong(int ncid, int varid, const long long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,T_longlong); +} + +int +nc_put_var_ulonglong(int ncid, int varid, const unsigned long long *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_put_var_string(int ncid, int varid, const char* *op) +{ + NC* ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_var(ncid,varid,(void*)op,NC_STRING); +} +#endif /*USE_NETCDF4*/ +/**\} */ + +/** \ingroup variables +Write a strided array of values to a variable. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param startp Start vector with one element for each dimension to \ref +specify_hyperslab. + +\param countp Count vector with one element for each dimension to \ref +specify_hyperslab. + +\param stridep Stride vector with one element for each dimension to +\ref specify_hyperslab. + +\param op Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_EEDGE Start+count exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. + */ +/**@{*/ +int +nc_put_vars (int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const void *op) +{ + NC *ncp; + int stat = NC_NOERR; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + return ncp->dispatch->put_vars(ncid, varid, startp, countp, + stridep, op, NC_NAT); +} + +int +nc_put_vars_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep,(void*)op,NC_CHAR); +} + +int +nc_put_vars_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const signed char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep,(void*)op,NC_BYTE); +} + +int +nc_put_vars_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const unsigned char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_uchar); +} + +int +nc_put_vars_short(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const short *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, NC_SHORT); +} + +int +nc_put_vars_int(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const int *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, NC_INT); +} + +int +nc_put_vars_long(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const long *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_long); +} + +int +nc_put_vars_float(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const float *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_float); +} + +int +nc_put_vars_double(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const double *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_double); +} + +int +nc_put_vars_ubyte(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const unsigned char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_ubyte); +} + +int +nc_put_vars_ushort(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const unsigned short *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_ushort); +} + +int +nc_put_vars_uint(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const unsigned int *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_uint); +} + +int +nc_put_vars_longlong(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const long long *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, T_longlong); +} + +int +nc_put_vars_ulonglong(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const unsigned long long *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, + stridep, (void *)op, NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_put_vars_string(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, + const char**op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_vars(ncid, varid, startp, countp, stridep, + (void *)op, NC_STRING); +} +#endif /*USE_NETCDF4*/ +/**\} */ + +/** \ingroup variables +Write a mapped array of values to a variable. + +\param ncid NetCDF or group ID, from a previous call to nc_open(), +nc_create(), nc_def_grp(), or associated inquiry functions such as +nc_inq_ncid(). + +\param varid Variable ID + +\param startp Start vector with one element for each dimension to \ref +specify_hyperslab. + +\param countp Count vector with one element for each dimension to \ref +specify_hyperslab. + +\param stridep Stride vector with one element for each dimension to +\ref specify_hyperslab. + +\param imapp Mapping vector with one element for each dimension to +\ref specify_hyperslab. + +\param op Pointer where the data will be copied. Memory must be +allocated by the user before this function is called. + +\returns ::NC_NOERR No error. +\returns ::NC_ENOTVAR Variable not found. +\returns ::NC_EINVALCOORDS Index exceeds dimension bound. +\returns ::NC_EEDGE Start+count exceeds dimension bound. +\returns ::NC_ERANGE One or more of the values are out of range. +\returns ::NC_EINDEFINE Operation not allowed in define mode. +\returns ::NC_EBADID Bad ncid. + */ +/**@{*/ +int +nc_put_varm (int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const void *op) +{ + NC *ncp; + int stat = NC_NOERR; + + if ((stat = NC_check_id(ncid, &ncp))) + return stat; + return ncp->dispatch->put_varm(ncid, varid, startp, countp, + stridep, imapp, op, NC_NAT); +} + +int +nc_put_varm_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, NC_CHAR); +} + +int +nc_put_varm_schar(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const signed char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, NC_BYTE); +} + +int +nc_put_varm_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const unsigned char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_uchar); +} + +int +nc_put_varm_short(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const short *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, NC_SHORT); +} + +int +nc_put_varm_int(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const int *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, NC_INT); +} + +int +nc_put_varm_long(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const long *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_long); +} + +int +nc_put_varm_float(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const float *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_float); +} + +int +nc_put_varm_double(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const double *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_double); +} + +int +nc_put_varm_ubyte(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const unsigned char *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_ubyte); +} + +int +nc_put_varm_ushort(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const unsigned short *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_ushort); +} + +int +nc_put_varm_uint(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const unsigned int *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_uint); +} + +int +nc_put_varm_longlong(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const long long *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, T_longlong); +} + +int +nc_put_varm_ulonglong(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const unsigned long long *op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, NC_UINT64); +} + +#ifdef USE_NETCDF4 +int +nc_put_varm_string(int ncid, int varid, + const size_t *startp, const size_t *countp, + const ptrdiff_t *stridep, const ptrdiff_t *imapp, + const char**op) +{ + NC *ncp; + int stat = NC_check_id(ncid, &ncp); + if(stat != NC_NOERR) return stat; + return NC_put_varm(ncid, varid, startp, countp, stridep, imapp, + (void *)op, NC_STRING); +} +#endif /*USE_NETCDF4*/ +/**\} */ + + +/*! \} */ /*End of named group... */ + diff --git a/extern/src_netcdf4/dvlen.c b/extern/src_netcdf4/dvlen.c new file mode 100644 index 0000000..13d3560 --- /dev/null +++ b/extern/src_netcdf4/dvlen.c @@ -0,0 +1,192 @@ +/*! \file + Functions for VLEN Types + + Copyright 2011 University Corporation for Atmospheric + Research/Unidata. See \ref copyright file for more info. */ + +#include "ncdispatch.h" + +/** \name Variable Length Array Types + + Functions to create and learn about VLEN types. */ +/*! \{ */ /* All these functions are part of this named group... */ + +/** +\ingroup user_types +Free memory in a VLEN object. + +When you read VLEN type the library will actually allocate the storage +space for the data. This storage space must be freed, so pass the +pointer back to this function, when you're done with the data, and it +will free the vlen memory. + +The function nc_free_vlens() is more useful than this function, +because it can free an array of VLEN objects. + +\param vl pointer to the vlen object. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +*/ +int +nc_free_vlen(nc_vlen_t *vl) +{ + free(vl->p); + return NC_NOERR; +} + +/** +\ingroup user_types +Free an array of vlens given the number of elements and an array. + +When you read VLEN type the library will actually allocate the storage +space for the data. This storage space must be freed, so pass the +pointer back to this function, when you're done with the data, and it +will free the vlen memory. + +\param len number of elements in the array. +\param vlens pointer to the vlen object. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +*/ +int +nc_free_vlens(size_t len, nc_vlen_t vlens[]) +{ + int ret; + size_t i; + + for(i = 0; i < len; i++) + if ((ret = nc_free_vlen(&vlens[i]))) + return ret; + + return NC_NOERR; +} + +/** +\ingroup user_types +Use this function to define a variable length array type. + +\param ncid \ref ncid +\param name \ref object_name of new type. + +\param base_typeid The typeid of the base type of the VLEN. For +example, for a VLEN of shorts, the base type is ::NC_SHORT. This can be +a user defined type. + +\param xtypep A pointer to an nc_type variable. The typeid of the new +VLEN type will be set here. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_ENAMEINUSE That name is in use. +\returns ::NC_EMAXNAME Name exceeds max length NC_MAX_NAME. +\returns ::NC_EBADNAME Name contains illegal characters. +\returns ::NC_EPERM Attempt to write to a read-only file. +\returns ::NC_ENOTINDEFINE Not in define mode. + */ +int +nc_def_vlen(int ncid, const char *name, nc_type base_typeid, nc_type *xtypep) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->def_vlen(ncid,name,base_typeid,xtypep); +} + +/** \ingroup user_types +Learn about a VLEN type. + +\param ncid \ref ncid +\param xtype The type of the VLEN to inquire about. +\param name \ref object_name of the type. \ref ignored_if_null. + +\param datum_sizep A pointer to a size_t, this will get the size of +one element of this vlen. \ref ignored_if_null. + +\param base_nc_typep Pointer to get the base type of the VLEN. \ref +ignored_if_null. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_inq_vlen(int ncid, nc_type xtype, char *name, size_t *datum_sizep, nc_type *base_nc_typep) +{ + int class = 0; + int stat = nc_inq_user_type(ncid,xtype,name,datum_sizep,base_nc_typep,NULL,&class); + if(stat != NC_NOERR) return stat; + if(class != NC_VLEN) stat = NC_EBADTYPE; + return stat; +} +/*! \} */ /* End of named group ...*/ + +/** \internal +\ingroup user_types + +Put a VLEN element. This function writes an element of a VLEN for the +Fortran APIs. + +\param ncid \ref ncid +\param typeid1 Typeid of the VLEN. +\param vlen_element Pointer to the element of the VLEN. +\param len Lenth of the VLEN element. +\param data VLEN data. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. +\returns ::NC_EPERM Attempt to write to a read-only file. + */ +int +nc_put_vlen_element(int ncid, int typeid1, void *vlen_element, size_t len, const void *data) +{ + NC* ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->put_vlen_element(ncid,typeid1,vlen_element,len,data); +} + +/** +\internal +\ingroup user_types + +Get a VLEN element. This function reads an element of a VLEN for the +Fortran APIs. + +\param ncid \ref ncid +\param typeid1 Typeid of the VLEN. +\param vlen_element Pointer to the element of the VLEN. +\param len Lenth of the VLEN element. +\param data VLEN data. + +\returns ::NC_NOERR No error. +\returns ::NC_EBADID Bad \ref ncid. +\returns ::NC_EBADTYPE Bad type id. +\returns ::NC_ENOTNC4 Not an netCDF-4 file, or classic model enabled. +\returns ::NC_EHDFERR An error was reported by the HDF5 layer. + */ +int +nc_get_vlen_element(int ncid, int typeid1, const void *vlen_element, + size_t *len, void *data) +{ + NC *ncp; + int stat = NC_check_id(ncid,&ncp); + if(stat != NC_NOERR) return stat; + return ncp->dispatch->get_vlen_element(ncid, typeid1, vlen_element, + len, data); +} diff --git a/extern/src_netcdf4/err_macros.h b/extern/src_netcdf4/err_macros.h new file mode 100644 index 0000000..c087f1c --- /dev/null +++ b/extern/src_netcdf4/err_macros.h @@ -0,0 +1,81 @@ +/* This is part of the netCDF package. + Copyright 2005 University Corporation for Atmospheric Research/Unidata + See COPYRIGHT file for conditions of use. + + Common includes, defines, etc., for test code in the libsrc4 and + nc_test4 directories. +*/ + +#ifndef _ERR_MACROS_H +#define _ERR_MACROS_H + +#include +#include +#include +#include +#include + +/* Err is used to keep track of errors within each set of tests, + * total_err is the number of errors in the entire test program, which + * generally cosists of several sets of tests. */ +static int total_err = 0, err = 0; + +#if 0 +/* This is handy for print statements. */ +static char *format_name[] = {"", "classic", "64-bit offset", "netCDF-4", + "netCDF-4 classic model"}; +#endif + +/* This macro prints an error message with line number and name of + * test program. */ +#define ERR do { \ +fflush(stdout); /* Make sure our stdout is synced with stderr. */ \ +err++; \ +fprintf(stderr, "Sorry! Unexpected result, %s, line: %d\n", \ + __FILE__, __LINE__); \ +return 2; \ +} while (0) + +/* This macro prints an error message with line number and name of + * test program, and then exits the program. */ + +#define ERR_RET do { \ +fflush(stdout); /* Make sure our stdout is synced with stderr. */ \ +fprintf(stderr, "Sorry! Unexpected result, %s, line: %d\n", \ + __FILE__, __LINE__); \ +return 2; \ +} while (0) + +/* After a set of tests, report the number of errors, and increment + * total_err. */ +#define SUMMARIZE_ERR do { \ + if (err) \ + { \ + printf("%d failures\n", err); \ + total_err += err; \ + err = 0; \ + } \ + else \ + printf("ok.\n"); \ +} while (0) + +/* If extra memory debugging is not in use (as it usually isn't), + * define away the nc_exit function, which may be in some tests. */ +#ifndef EXTRA_MEM_DEBUG +#define nc_exit() +#endif + +/* This macro prints out our total number of errors, if any, and exits + * with a 0 if there are not, or a 2 if there were errors. Make will + * stop if a non-zero value is returned from a test program. */ +#define FINAL_RESULTS do { \ + if (total_err) \ + { \ + printf("%d errors detected! Sorry!\n", total_err); \ + return 2; \ + } \ + printf("*** Tests successful!\n"); \ + return 0; \ +} while (0) + +#endif /* _ERR_MACROS_H */ diff --git a/extern/src_netcdf4/error4.c b/extern/src_netcdf4/error4.c new file mode 100644 index 0000000..557bdb9 --- /dev/null +++ b/extern/src_netcdf4/error4.c @@ -0,0 +1,75 @@ +/* + +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file contains functions relating to logging errors. Also it +contains the functions nc_malloc, nc_calloc, and nc_free. + +Copyright 2003, University Corporation for Atmospheric Research. See +netcdf-4/docs/COPYRIGHT file for copying and redistribution +conditions. + +$Id: error4.c,v 1.4 2010/06/01 17:48:55 ed Exp $ +*/ + +#include +#include +#include +#include +#include +#include + +/* This contents of this file get skipped if LOGGING is not defined + * during compile. */ +#ifdef LOGGING + +extern int nc_log_level; + +/* This function prints out a message, if the severity of the message + is lower than the global nc_log_level. To use it, do something like + this: + + nc_log(0, "this computer will explode in %d seconds", i); + + After the first arg (the severity), use the rest like a normal + printf statement. Output will appear on stdout. + + This function is heavily based on the function in section 15.5 of + the C FAQ. */ +void +nc_log(int severity, const char *fmt, ...) +{ + va_list argp; + int t; + + /* If the severity is greater than the log level, we don' care to + print this message. */ + if (severity > nc_log_level) + return; + + /* If the severity is zero, this is an error. Otherwise insert that + many tabs before the message. */ + if (!severity) + fprintf(stdout, "ERROR: "); + for (t=0; t fetch whole dataset +b. The target variable (as specified in nc_get_vara()) + is already in the cache and is whole variable. + fetchprojection = N.A. since variable is in the cache +c. Vara is requesting part of a variable but NCF_WHOLEVAR flag is set. + fetchprojection = unsliced vara variable => fetch whole variable +d. Vara is requesting part of a variable and NCF_WHOLEVAR flag is not set. + fetchprojection = sliced vara variable => fetch part variable + +2. At this point, all or part of the target variable is available in the cache. + +3. We build a projection to walk (guide) the use of the oc + data procedures in extract the required data from the cache. + For cases a,b,c: + walkprojection = merge(urlprojection,varaprojection) + For case d: + walkprojection = varaprojection without slicing. + This means we need only extract the complete contents of the cache. + Notice that this will not necessarily be a direct memory to + memory copy because the dap encoding still needs to be + interpreted. For this case, we derive a walk projection + from the vara projection that will properly access the cached data. + This walk projection shifts the merged projection so all slices + start at 0 and have a stride of 1. + +*/ + +NCerror +nc3d_getvarx(int ncid, int varid, + const size_t *startp, + const size_t *countp, + const ptrdiff_t* stridep, + void *data, + nc_type dsttype0) +{ + NCerror ncstat = NC_NOERR; + OCerror ocstat = OC_NOERR; + int i; + NC* drno; + NC* substrate; + NCDAPCOMMON* dapcomm; + CDFnode* cdfvar; /* cdf node mapping to var*/ + NClist* varnodes; + nc_type dsttype; + Getvara* varainfo = NULL; + CDFnode* xtarget = NULL; /* target in DATADDS */ + CDFnode* target = NULL; /* target in constrained DDS */ + DCEprojection* varaprojection = NULL; + NCcachenode* cachenode = NULL; + size_t localcount[NC_MAX_VAR_DIMS]; + NClist* ncdimsall; + size_t ncrank; + NClist* vars = NULL; + DCEconstraint* fetchconstraint = NULL; + DCEprojection* fetchprojection = NULL; + DCEprojection* walkprojection = NULL; + int state; +#define FETCHWHOLE 1 /* fetch whole data set */ +#define FETCHVAR 2 /* fetch whole variable */ +#define FETCHPART 4 /* fetch constrained variable */ +#define CACHED 8 /* whole variable is already in the cache */ + + ncstat = NC_check_id(ncid, (NC**)&drno); + if(ncstat != NC_NOERR) goto fail; + dapcomm = (NCDAPCOMMON*)drno->dispatchdata; + + ncstat = NC_check_id(drno->substrate, (NC**)&substrate); + if(ncstat != NC_NOERR) goto fail; + + /* Locate var node via varid */ + varnodes = dapcomm->cdf.varnodes; + for(i=0;iarray.basevar == NULL + && node->nctype == NC_Primitive + && node->ncid == varid) { + cdfvar = node; + break; + } + } + + ASSERT((cdfvar != NULL)); + + /* Get the dimension info */ + ncdimsall = cdfvar->array.dimsetall; + ncrank = nclistlength(ncdimsall); + +#ifdef DEBUG + { +int i; +fprintf(stderr,"getvarx: %s",cdfvar->ncfullname); +for(i=0;idim.declsize; + } + countp = localcount; + } + + if(stridep == NULL) + stridep = nc_ptrdiffvector1; + + /* Validate the dimension sizes */ + for(i=0;i dim->dim.declsize + || startp[i]+countp[i] > dim->dim.declsize) { + ncstat = NC_EINVALCOORDS; + goto fail; + } + } + +#ifdef DEBUG + { +NClist* dims = cdfvar->array.dimsetall; +fprintf(stderr,"getvarx: %s",cdfvar->ncfullname); +if(nclistlength(dims) > 0) {int i; +for(i=0;i "); +for(i=0;iexternaltype; + + /* Validate any implied type conversion*/ + if(cdfvar->etype != dsttype && dsttype == NC_CHAR) { + /* The only disallowed conversion is to/from char and non-byte + numeric types*/ + switch (cdfvar->etype) { + case NC_STRING: case NC_URL: + case NC_CHAR: case NC_BYTE: case NC_UBYTE: + break; + default: + return THROW(NC_ECHAR); + } + } + + ncstat = makegetvar34(dapcomm,cdfvar,data,dsttype,&varainfo); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + + state = 0; + if(iscached(dapcomm,cdfvar,&cachenode)) { + state = CACHED; + ASSERT((cachenode != NULL)); +#ifdef DEBUG +fprintf(stderr,"var is in cache\n"); +#endif + /* If it is cached, then it is a whole variable but may still + need to apply constraints during the walk */ + ASSERT(cachenode->wholevariable); /* by construction */ + } else if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { + state = FETCHWHOLE; + } else {/* load using constraints */ + if(FLAGSET(dapcomm->controls,NCF_WHOLEVAR)) + state = FETCHVAR; + else + state = FETCHPART; + } + + ASSERT(state != 0); + + /* Convert the start/stop/stride info into a projection */ + ncstat = buildvaraprojection3(varainfo, + startp,countp,stridep, + &varaprojection); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + + fetchprojection = NULL; + walkprojection = NULL; + + /* Create walkprojection as the merge of the url projections + and the vara projection; may change in FETCHPART case below*/ + ncstat = daprestrictprojection(dapcomm->oc.dapconstraint->projections, + varaprojection,&walkprojection); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + +#ifdef DEBUG +fprintf(stderr,"getvarx: walkprojection: |%s|\n",dumpprojection(walkprojection)); +#endif + + /* define the var list of interest */ + vars = nclistnew(); + nclistpush(vars,(ncelem)varainfo->target); + + switch (state) { + + case FETCHWHOLE: { + /* buildcachenode3 will create a new cachenode and + will also fetch the whole corresponding datadds. + */ + /* Build the complete constraint to use in the fetch */ + fetchconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); + /* Use no projections or selections */ + fetchconstraint->projections = nclistnew(); + fetchconstraint->selections = nclistnew(); +#ifdef DEBUG +fprintf(stderr,"getvarx: FETCHWHOLE: fetchconstraint: %s\n",dumpconstraint(fetchconstraint)); +#endif + ncstat = buildcachenode34(dapcomm,fetchconstraint,vars,&cachenode,0); + fetchconstraint = NULL; /*buildcachenode34 takes control of fetchconstraint.*/ + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + } break; + + case CACHED: { + } break; + + case FETCHVAR: { /* Fetch a complete single variable */ + /* Create fetch projection as the merge of the url projections + and the vara projection */ + ncstat = daprestrictprojection(dapcomm->oc.dapconstraint->projections, + varaprojection,&fetchprojection); + /* elide any sequence and string dimensions (dap servers do not allow such). */ + ncstat = removepseudodims(fetchprojection); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + + /* Convert to a whole variable projection */ + dcemakewholeprojection(fetchprojection); + +#ifdef DEBUG +fprintf(stderr,"getvarx: FETCHVAR: fetchprojection: |%s|\n",dumpprojection(fetchprojection)); +#endif + + /* Build the complete constraint to use in the fetch */ + fetchconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); + /* merged constraint just uses the url constraint selection */ + fetchconstraint->selections = dceclonelist(dapcomm->oc.dapconstraint->selections); + /* and the created fetch projection */ + fetchconstraint->projections = nclistnew(); + nclistpush(fetchconstraint->projections,(ncelem)fetchprojection); +#ifdef DEBUG +fprintf(stderr,"getvarx: FETCHVAR: fetchconstraint: %s\n",dumpconstraint(fetchconstraint)); +#endif + /* buildcachenode3 will create a new cachenode and + will also fetch the corresponding datadds. + */ + ncstat = buildcachenode34(dapcomm,fetchconstraint,vars,&cachenode,0); + fetchconstraint = NULL; /*buildcachenode34 takes control of fetchconstraint.*/ + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + } break; + + case FETCHPART: { + /* Create fetch projection as the merge of the url projections + and the vara projection */ + ncstat = daprestrictprojection(dapcomm->oc.dapconstraint->projections, + varaprojection,&fetchprojection); + /* elide any sequence and string dimensions (dap servers do not allow such). */ + ncstat = removepseudodims(fetchprojection); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + + /* Shift the varaprojection for simple walk */ + dcefree((DCEnode*)walkprojection) ; /* reclaim any existing walkprojection */ + walkprojection = (DCEprojection*)dceclone((DCEnode*)varaprojection); + dapshiftprojection(walkprojection); + +#ifdef DEBUG +fprintf(stderr,"getvarx: FETCHPART: fetchprojection: |%s|\n",dumpprojection(fetchprojection)); +#endif + + /* Build the complete constraint to use in the fetch */ + fetchconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); + /* merged constraint just uses the url constraint selection */ + fetchconstraint->selections = dceclonelist(dapcomm->oc.dapconstraint->selections); + /* and the created fetch projection */ + fetchconstraint->projections = nclistnew(); + nclistpush(fetchconstraint->projections,(ncelem)fetchprojection); +#ifdef DEBUG +fprintf(stderr,"getvarx: FETCHPART: fetchconstraint: %s\n",dumpconstraint(fetchconstraint)); +#endif + /* buildcachenode3 will create a new cachenode and + will also fetch the corresponding datadds. + */ + ncstat = buildcachenode34(dapcomm,fetchconstraint,vars,&cachenode,0); + fetchconstraint = NULL; /*buildcachenode34 takes control of fetchconstraint.*/ + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + } break; + + default: PANIC1("unknown fetch state: %d\n",state); + } + + ASSERT(cachenode != NULL); + +#ifdef DEBUG +fprintf(stderr,"cache.datadds=%s\n",dumptree(cachenode->datadds)); +#endif + + /* attach DATADDS to (constrained) DDS */ + unattach34(dapcomm->cdf.ddsroot); + ncstat = attachsubset34(cachenode->datadds,dapcomm->cdf.ddsroot); + if(ncstat) goto fail; + + /* Fix up varainfo to use the cache */ + varainfo->cache = cachenode; + cachenode = NULL; + varainfo->varaprojection = walkprojection; + walkprojection = NULL; + + /* Get the var correlate from the datadds */ + target = varainfo->target; + xtarget = target->attachment; + if(xtarget == NULL) + {THROWCHK(ncstat=NC_ENODATA); goto fail;} + + /* Switch to datadds tree space*/ + varainfo->target = xtarget; + ncstat = moveto(dapcomm,varainfo,varainfo->cache->datadds,data); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + + goto ok; + +fail: + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); +ok: + nclistfree(vars); + dcefree((DCEnode*)varaprojection); + dcefree((DCEnode*)fetchconstraint); + freegetvara(varainfo); + return THROW(ncstat); +} + +/* Remove any pseudodimensions (sequence and string)*/ +static NCerror +removepseudodims(DCEprojection* proj) +{ + int i; +#ifdef DEBUG1 +fprintf(stderr,"removesequencedims.before: %s\n",dumpprojection(proj)); +#endif + for(i=0;ivar->segments);i++) { + DCEsegment* seg = (DCEsegment*)nclistget(proj->var->segments,i); + CDFnode* cdfnode = (CDFnode*)seg->annotation; + if(cdfnode->array.seqdim != NULL) + seg->rank = 0; + else if(cdfnode->array.stringdim != NULL) + seg->rank--; + } +#ifdef DEBUG1 +fprintf(stderr,"removepseudodims.after: %s\n",dumpprojection(proj)); +#endif + return NC_NOERR; +} + +static NCerror +moveto(NCDAPCOMMON* nccomm, Getvara* xgetvar, CDFnode* xrootnode, void* memory) +{ + OCerror ocstat = OC_NOERR; + NCerror ncstat = NC_NOERR; + OCconnection conn = nccomm->oc.conn; + OCdata xrootcontent; + OCobject ocroot; + NClist* path = nclistnew(); + struct NCMEMORY memstate; + + memstate.next = (memstate.memory = memory); + + /* Get the root content*/ + ocroot = xrootnode->tree->ocroot; + xrootcontent = oc_data_new(conn); + ocstat = oc_data_root(conn,ocroot,xrootcontent); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} + + /* Remember: xgetvar->target is in DATADDS tree */ + collectnodepath3(xgetvar->target,path,WITHDATASET); + ncstat = movetor(nccomm,xrootcontent, + path,0,xgetvar,0,&memstate, + xgetvar->varaprojection->var->segments); + +done: + nclistfree(path); + oc_data_free(conn,xrootcontent); + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return THROW(ncstat); +} + +static NCerror +movetor(NCDAPCOMMON* nccomm, + OCdata currentcontent, + NClist* path, + int depth, /* depth is position in segment list*/ + Getvara* xgetvar, + int dimindex, /* dimindex is position in xgetvar->slices*/ + struct NCMEMORY* memory, + NClist* segments) +{ + int i; + OCerror ocstat = OC_NOERR; + NCerror ncstat = NC_NOERR; + size_t fieldindex,gridindex,rank; + OCconnection conn = nccomm->oc.conn; + CDFnode* xnode = (CDFnode*)nclistget(path,depth); + OCdata reccontent = OCNULL; + OCdata dimcontent = OCNULL; + OCdata fieldcontent = OCNULL; + Dapodometer* odom = OCNULL; + OCmode currentmode = OCNULLMODE; + CDFnode* xnext; + int hasstringdim = 0; + size_t dimoffset; + DCEsegment* segment; + int newdepth; + int caching = FLAGSET(nccomm->controls,NCF_CACHE); + int unconstrainable = FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE); + + /* Note that we use depth-1 because the path contains the DATASET + but the segment list does not */ + segment = (DCEsegment*)nclistget(segments,depth-1); /*may be NULL*/ + if(xnode->etype == NC_STRING || xnode->etype == NC_URL) hasstringdim = 1; + + ocstat = oc_data_mode(conn,currentcontent,¤tmode); + +#ifdef DEBUG2 +fprintf(stderr,"moveto: nctype=%d currentmode=%d depth=%d dimindex=%d", + xnode->nctype, currentmode, depth,dimindex); +fprintf(stderr," segment=%s hasstringdim=%d\n", + dcetostring((DCEnode*)segment),hasstringdim); +#endif + + /* Switch on the combination of nctype and mode */ +#define CASE(nc1,nc2) (nc1*1024+nc2) + + /* This must be consistent with the oc mode transition function */ + switch (CASE(xnode->nctype,currentmode)) { + + default: + PANIC2("Illegal combination: nctype=%d mode=%d", + (int)xnode->nctype,(int)currentmode); + break; + + case CASE(NC_Sequence,OCFIELDMODE): + case CASE(NC_Dataset,OCFIELDMODE): + case CASE(NC_Grid,OCFIELDMODE): + case CASE(NC_Structure,OCFIELDMODE): + /* currentcontent points to the grid/dataset/structure instance */ + xnext = (CDFnode*)nclistget(path,depth+1); + ASSERT((xnext != NULL)); + fieldindex = findfield(xnode,xnext); + /* If the next node is a virtual node, then + we need to effectively + ignore it and use the appropriate subnode. + If the next node is a structuregrid node, then + use it as is. + */ + if(xnext->virtual) { + CDFnode* xgrid = xnext; + xnext = (CDFnode*)nclistget(path,depth+2); /* real node */ + gridindex = fieldindex; + fieldindex = findfield(xgrid,xnext); + fieldindex += gridindex; + newdepth = depth+2; + } else { + newdepth = depth+1; + } + fieldcontent = oc_data_new(conn); + ocstat = oc_data_ith(conn,currentcontent,fieldindex,fieldcontent); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto fail;} + ncstat = movetor(nccomm,fieldcontent, + path,newdepth,xgetvar,dimindex,memory, + segments); + break; + + case CASE(NC_Sequence,OCARRAYMODE): /* will actually always be scalar, but will have + rank == 1 to account for the sequence dim */ + case CASE(NC_Grid,OCARRAYMODE): /* will actually always be scalar */ + case CASE(NC_Structure,OCARRAYMODE): + /* figure out which slices refer to this node: + dimindex upto dimindex+rank; */ + ASSERT((segment != NULL)); + rank = segment->rank; + if(xnode->nctype == NC_Sequence) + rank--; /* ignore the sequence dim */ + if(rank == 0) { + odom = newdapodometer1(1); + } else if(caching || unconstrainable) { + odom = newdapodometer(segment->slices,0,rank); + } else { /*Since vara was projected out, build a simple odometer*/ + odom = newsimpledapodometer(segment,rank); + } + while(dapodometermore(odom)) { + OCmode mode; + /* Compute which instance to move to*/ + dimoffset = dapodometercount(odom); + dimcontent = oc_data_new(conn); + ocstat = oc_data_ith(conn,currentcontent,dimoffset,dimcontent); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto fail;} + ocstat = oc_data_mode(conn,dimcontent,&mode); + ASSERT((mode == OCFIELDMODE + || (mode == OCSEQUENCEMODE && xnode->nctype == NC_Sequence))); + ncstat = movetor(nccomm,dimcontent, + path,depth, + xgetvar,dimindex+rank, + memory,segments); + dapodometerincr(odom); + } + freedapodometer(odom); + break; + + case CASE(NC_Sequence,OCSEQUENCEMODE): { + DCEslice* uslice; + ASSERT((segment != NULL)); + /* Get and check the corresponding sequence dimension from DDS */ + ASSERT((xnode->attachment != NULL)); + /* use uslice to walk the sequence; however, watch out + for the case when the user set a limit and that limit + is not actually reached in this request. + */ + /* By construction, this sequence represents the first + (and only) dimension of this segment */ + uslice = &segment->slices[0]; + reccontent = oc_data_new(conn); + for(i=uslice->first;istop;i+=uslice->stride) { + OCmode eos; + ocstat = oc_data_ith(conn,currentcontent,i,reccontent); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto fail;} + ocstat = oc_data_mode(conn,reccontent,&eos); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto fail;} + if(eos == OCNULLMODE) { + /* We asked for too much */ + ncstat = THROW(NC_EINVALCOORDS); + goto fail; + } + ncstat = movetor(nccomm,reccontent, + path,depth, + xgetvar,dimindex+1, + memory,segments); + if(ncstat != OC_NOERR) {THROWCHK(ncstat); goto fail;} + } + } break; + + case CASE(NC_Primitive,OCPRIMITIVEMODE): + if(hasstringdim) + ncstat = extractstring(nccomm, xgetvar, xnode, segment, conn, currentcontent, memory); + else + ncstat = extract(nccomm, xgetvar, xnode, segment, conn, currentcontent, memory); + break; + + } + goto ok; + +fail: +ok: + oc_data_free(conn,dimcontent); + oc_data_free(conn,fieldcontent); + oc_data_free(conn,reccontent); + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return THROW(ncstat); +} + +/* Determine the index in the odometer at which + the odometer will be walking the whole subslice + This will allow us to optimize. +*/ +static int +wholeslicepoint(Dapodometer* odom) +{ + unsigned int i; + int point; + for(point=-1,i=0;irank;i++) { + ASSERT((odom->slices[i].declsize != 0)); + if(odom->slices[i].first != 0 || odom->slices[i].stride != 1 + || odom->slices[i].length != odom->slices[i].declsize) + point = i; + } + if(point == -1) + point = 0; /* wholevariable */ + else if(point == (odom->rank - 1)) + point = -1; /* no whole point */ + else + point += 1; /* intermediate point */ + return point; +} + +static int +findfield(CDFnode* node, CDFnode* field) +{ + size_t i; + for(i=0;isubnodes);i++) { + CDFnode* test = (CDFnode*) nclistget(node->subnodes,i); + if(test == field) return i; + } + return -1; +} + + +int +nc3d_getvarmx(int ncid, int varid, + const size_t *start, + const size_t *edges, + const ptrdiff_t* stride, + const ptrdiff_t* map, + void* data, + nc_type dsttype0) +{ + NCerror ncstat = NC_NOERR; + int i; + NC* drno; + NC* substrate; + NCDAPCOMMON* dapcomm; + NC_var* var; + CDFnode* cdfvar; /* cdf node mapping to var*/ + NClist* varnodes; + nc_type dsttype; + size_t externsize; + size_t dimsizes[NC_MAX_VAR_DIMS]; + Dapodometer* odom = NULL; + unsigned int ncrank; + NClist* ncdims = NULL; + size_t nelems; +#ifdef NEWVARM + char* localcopy; /* of whole variable */ +#endif + + ncstat = NC_check_id(ncid, (NC**)&drno); + if(ncstat != NC_NOERR) goto done; + dapcomm = (NCDAPCOMMON*)drno->dispatchdata; + + ncstat = NC_check_id(drno->substrate, (NC**)&substrate); + if(ncstat != NC_NOERR) goto done; + var = NC_lookupvar(substrate,varid); + if(var == NULL) {ncstat = NC_ENOTVAR; goto done;} + + /* Locate var node via varid */ + varnodes = dapcomm->cdf.varnodes; + for(i=0;iarray.basevar == NULL + && node->nctype == NC_Primitive + && node->ncid == varid) { + cdfvar = node; + break; + } + } + + ASSERT((cdfvar != NULL)); + ASSERT((strcmp(cdfvar->ncfullname,var->name->cp)==0)); + + if(nclistlength(cdfvar->array.dimsetplus) == 0) { + /* The variable is a scalar; consequently, there is only one + thing to get and only one place to put it. (Why was I + called?) */ + /* recurse with additional parameters */ + return THROW(nc3d_getvarx(ncid,varid, + NULL,NULL,NULL, + data,dsttype0)); + } + + dsttype = (dsttype0); + + /* Default to using the inquiry type for this var*/ + if(dsttype == NC_NAT) dsttype = cdfvar->externaltype; + + /* Validate any implied type conversion*/ + if(cdfvar->etype != dsttype && dsttype == NC_CHAR) { + /* The only disallowed conversion is to/from char and non-byte + numeric types*/ + switch (cdfvar->etype) { + case NC_STRING: case NC_URL: + case NC_CHAR: case NC_BYTE: case NC_UBYTE: + break; + default: + return THROW(NC_ECHAR); + } + } + + externsize = nctypesizeof(dsttype); + + /* Accumulate the dimension sizes and the total # of elements */ + ncdims = cdfvar->array.dimsetall; + ncrank = nclistlength(ncdims); + + nelems = 1; /* also Compute the number of elements being retrieved */ + for(i=0;idim.declsize; + nelems *= edges[i]; + } + + /* Originally, this code repeatedly extracted single values + using get_var1. In an attempt to improve performance, + I have converted to reading the whole variable at once + and walking it locally. + */ + +#ifdef NEWVARM + localcopy = (char*)malloc(nelems*externsize); + + /* We need to use the varieties of get_vars in order to + properly do conversion to the external type + */ + + switch (dsttype) { + + case NC_CHAR: + ncstat = nc_get_vars_text(ncid,varid,start, edges, stride, + (char*)localcopy); + break; + case NC_BYTE: + ncstat = nc_get_vars_schar(ncid,varid,start, edges, stride, + (signed char*)localcopy); + break; + case NC_SHORT: + ncstat = nc_get_vars_short(ncid,varid, start, edges, stride, + (short*)localcopy); + break; + case NC_INT: + ncstat = nc_get_vars_int(ncid,varid,start, edges, stride, + (int*)localcopy); + break; + case NC_FLOAT: + ncstat = nc_get_vars_float(ncid,varid,start, edges, stride, + (float*)localcopy); + break; + case NC_DOUBLE: + ncstat = nc_get_vars_double(ncid,varid, start, edges, stride, + (double*)localcopy); + break; + default: break; + } + + odom = newdapodometer2(start,edges,stride,0,ncrank); + + /* Walk the local copy */ + for(i=0;i %lu %f\n", + (unsigned long)(i), + (unsigned long)voffset, + *(float*)localpos); +*/ + dapodometerincr(odom); + } +#else + odom = newdapodometer2(start,edges,stride,0,ncrank); + while(dapodometermore(odom)) { + size_t* indexset = dapodometerindices(odom); + size_t voffset = dapodometervarmcount(odom,map,dimsizes); + char internalmem[128]; + char externalmem[128]; + void* dataoffset = (void*)(((char*)data) + (externsize*voffset)); + + /* get the indexset'th value using variable's internal type */ + ncstat = nc_get_var1(ncid,varid,indexset,(void*)&internalmem); + if(ncstat != NC_NOERR) goto done; + /* Convert to external type */ + ncstat = dapconvert3(cdfvar->etype,dsttype,externalmem,internalmem); + if(ncstat != NC_NOERR) goto done; + memcpy(dataoffset,(void*)externalmem,externsize); +/* +fprintf(stderr,"old: %lu -> %lu %f\n", + (unsigned long)dapodometercount(odom), + (unsigned long)voffset, + *(float*)externalmem); +*/ + dapodometerincr(odom); + } +#endif + +done: + return ncstat; +} + +static int +conversionrequired(nc_type t1, nc_type t2) +{ + if(t1 == t2) + return 0; + if(nctypesizeof(t1) != nctypesizeof(t2)) + return 1; + /* Avoid too many cases by making t1 < t2 */ + if(t1 > t2) {int tmp = t1; t1 = t2; t2 = tmp;} +#undef CASE +#define CASE(t1,t2) ((t1)<<5 | (t2)) + switch (CASE(t1,t2)) { + case CASE(NC_BYTE,NC_UBYTE): + case CASE(NC_BYTE,NC_CHAR): + case CASE(NC_CHAR,NC_UBYTE): + case CASE(NC_SHORT,NC_USHORT): + case CASE(NC_INT,NC_UINT): + case CASE(NC_INT64,NC_UINT64): + return 0; + default: break; + } + return 1; +} + +/* We are at a primitive variable or scalar that has no string dimensions. +Extract the data. +(This is way too complicated) +*/ +static int +extract( + NCDAPCOMMON* nccomm, + Getvara* xgetvar, + CDFnode* xnode, + DCEsegment* segment, + OClink conn, + OCdata currentcontent, + struct NCMEMORY* memory + ) +{ + OCerror ocstat = OC_NOERR; + NCerror ncstat = NC_NOERR; + size_t rank; + Dapodometer* odom = OCNULL; + int wholepoint; + size_t externtypesize; + size_t interntypesize; + char* localmemory = NULL; + size_t odomsubsize; + size_t internlen; + int requireconversion; + char value[16]; + + ASSERT((segment != NULL)); + + requireconversion = conversionrequired(xgetvar->dsttype,xnode->etype); + + rank = segment->rank; + + if(rank == 0) {/* scalar */ + char* mem = (requireconversion?value:memory->next); + ASSERT((segment != NULL)); + externtypesize = nctypesizeof(xgetvar->dsttype); + ASSERT(externtypesize <= sizeof(value)); + /* Read the whole scalar directly into memory */ + ocstat = oc_data_get(conn,currentcontent,mem,externtypesize,0,1); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} + if(requireconversion) { + /* convert the value to external type */ + ncstat = dapconvert3(xnode->etype,xgetvar->dsttype,memory->next,value,1); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + } + memory->next += (externtypesize); + + } else {/* rank > 0 */ + +#ifdef DEBUG2 +fprintf(stderr,"moveto: primitive: segment=%s", + dcetostring((DCEnode*)segment)); +fprintf(stderr," iswholevariable=%d",xgetvar->cache->wholevariable); +fprintf(stderr,"\n"); +#endif + + ASSERT(xgetvar->cache != NULL); + if(xgetvar->cache->wholevariable) { + odom = newdapodometer(segment->slices,0,rank); + } else { /*!xgetvar->cache->wholevariable*/ + odom = newsimpledapodometer(segment,rank); + } + /* Optimize off the use of the odometer by checking the slicing + to see if the whole variable, or some whole subslice + is being extracted. + However do not do this if the external type conversion is needed + or if the whole slice point is rank-1 (normal case anyway). + */ + externtypesize = nctypesizeof(xgetvar->dsttype); + interntypesize = nctypesizeof(xnode->etype); + wholepoint = wholeslicepoint(odom); + if(wholepoint == -1) + odomsubsize = 1; /* no whole point */ + else + odomsubsize = dapodometerspace(odom,wholepoint); + internlen = (odomsubsize*interntypesize); + if(requireconversion) { + /* copy the data locally before conversion */ + localmemory = (char*)malloc(internlen); + } else { + localmemory = memory->next; + } + +#ifdef DEBUG2 +fprintf(stderr,"moveto: primitive: "); +fprintf(stderr," wholepoint=%d",wholepoint); +fprintf(stderr,"\n"); +#endif + + if(wholepoint == 0) {/* whole variable */ + /* Read the whole n elements directly into memory.*/ + ocstat = oc_data_get(conn,currentcontent,localmemory, + internlen,0,odomsubsize); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} + if(requireconversion) { + /* do conversion */ + ncstat = dapconvert3(xnode->etype,xgetvar->dsttype, + memory->next,localmemory,odomsubsize); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + } + memory->next += (externtypesize*odomsubsize); + } else if(wholepoint > 0) {/* whole subslice */ + odom->rank = wholepoint; /* truncate */ + while(dapodometermore(odom)) { + size_t dimoffset = dapodometercount(odom) * odomsubsize; + ocstat = oc_data_get(conn,currentcontent,localmemory, + internlen,dimoffset,odomsubsize); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} + if(requireconversion) { + /* do conversion */ + ncstat = dapconvert3(xnode->etype,xgetvar->dsttype, + memory->next,localmemory,odomsubsize); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + } + memory->next += (externtypesize*odomsubsize); + dapodometerincr(odom); + } + } else { /* Oh well, use the odometer to walk to the + appropriate fields*/ + while(dapodometermore(odom)) { + char* mem = (requireconversion?value:memory->next); + size_t dimoffset = dapodometercount(odom); + ocstat = oc_data_get(conn,currentcontent,mem,externtypesize,dimoffset,1); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} + if(requireconversion) { + ncstat = dapconvert3(xnode->etype,xgetvar->dsttype,memory->next,value,1); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + } + memory->next += externtypesize; + dapodometerincr(odom); + } + } + freedapodometer(odom); + if(requireconversion) nullfree(localmemory); + } +done: + return THROW(ncstat); +} + + +static NCerror +slicestring(OCconnection conn, char* stringmem, DCEslice* slice, struct NCMEMORY* memory) +{ + size_t stringlen; + unsigned int i; + NCerror ncstat = NC_NOERR; + char* lastchar; + size_t charcount; /* number of characters inserted into memory */ + + /* libnc-dap chooses to convert string escapes to the corresponding + character; so we do likewise. + */ + dapexpandescapes(stringmem); + stringlen = strlen(stringmem); + +#ifdef DEBUG2 +fprintf(stderr,"moveto: slicestring: string/%lu=%s\n",stringlen,stringmem); +fprintf(stderr,"slicestring: %lu string=|%s|\n",stringlen,stringmem); +fprintf(stderr,"slicestring: slice=[%lu:%lu:%lu/%lu]\n", +slice->first,slice->stride,slice->stop,slice->declsize); +#endif + + /* Stride across string; if we go past end of string, then pad*/ + charcount = 0; + for(i=slice->first;ilength;i+=slice->stride) { + if(i < stringlen) + *memory->next = stringmem[i]; + else /* i >= stringlen*/ + *memory->next = NC_FILL_CHAR; + memory->next++; + charcount++; + } + lastchar = (memory->next); + if(charcount > 0) { + lastchar--; + } + + return THROW(ncstat); +} + +/* +Extract data for a netcdf variable that has a string dimension. +*/ +static int +extractstring( + NCDAPCOMMON* nccomm, + Getvara* xgetvar, + CDFnode* xnode, + DCEsegment* segment, + OClink conn, + OCdata currentcontent, + struct NCMEMORY* memory + ) +{ + NCerror ncstat = NC_NOERR; + OCerror ocstat = OC_NOERR; + int i; + size_t rank; + int caching = FLAGSET(nccomm->controls,NCF_CACHE); + int unconstrainable = FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE); + NClist* strings = NULL; + Dapodometer* odom = OCNULL; + + rank = segment->rank; + + /* A number of optimizations are possible but none is currently used. */ + + /* Use the odometer to walk to the appropriate fields*/ + if(rank == 1) { + odom = newdapodometer1(1); /* scalar case */ + } else if(caching || unconstrainable) { + odom = newdapodometer(segment->slices,0,rank-1); + } else { /*Since vara was projected out, build a simple odometer*/ + odom = newsimpledapodometer(segment,rank-1); + } + + /* step thru the odometer obtaining each string and storing it in an OClist */ + strings = nclistnew(); + nclistsetalloc(strings,dapodometerspace(odom,0)); /* preallocate */ + while(dapodometermore(odom)) { + char* value = NULL; + size_t dimoffset = dapodometercount(odom); + ocstat = oc_data_get(conn,currentcontent,&value,sizeof(value),dimoffset,1); + if(ocstat != OC_NOERR) goto done; + nclistpush(strings,(ncelem)value); + dapodometerincr(odom); + } + freedapodometer(odom); + /* Get each string in turn, slice it and store in user + supplied memory */ + for(i=0;islices[rank-1],memory); + free(s); + } + nclistfree(strings); +done: + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return THROW(ncstat); +} diff --git a/extern/src_netcdf4/lookup3.c b/extern/src_netcdf4/lookup3.c new file mode 100644 index 0000000..525cdff --- /dev/null +++ b/extern/src_netcdf4/lookup3.c @@ -0,0 +1,1017 @@ +/* +------------------------------------------------------------------------------- +lookup3.c, by Bob Jenkins, May 2006, Public Domain. +Original: http://burtleburtle.net/bob/c/lookup3.c +Modified by Russ Rew for adaption in netCDF. +- Make use of Paul Hsieh's pstdint.h, if stdint.h not available. +- Declare unused functions static to keep global namespace clean. +- Provide function hash_fast() that uses either hashlittle() or + hashbig(), depending on endianness. +- Because portability is more important than speed for netCDF use, + we define VALGRIND to skip "#ifndef VALGRIND" code, so reads of + strings don't access extra bytes after end of string. This may + slow it down enough to justify a simpler hash, but blame me, not + original author! + +These are functions for producing 32-bit hashes for hash table lookup. +hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() +are externally useful functions. Routines to test the hash are included +if SELF_TEST is defined. You can use this free for any purpose. It's in +the public domain. It has no warranty. + +You probably want to use hashlittle(). hashlittle() and hashbig() +hash byte arrays. hashlittle() is is faster than hashbig() on +little-endian machines. Intel and AMD are little-endian machines. +On second thought, you probably want hashlittle2(), which is identical to +hashlittle() except it returns two 32-bit hashes for the price of one. +You could implement hashbig2() if you wanted but I haven't bothered here. + +If you want to find a hash of, say, exactly 7 integers, do + a = i1; b = i2; c = i3; + mix(a,b,c); + a += i4; b += i5; c += i6; + mix(a,b,c); + a += i7; + final(a,b,c); +then use c as the hash value. If you have a variable length array of +4-byte integers to hash, use hashword(). If you have a byte array (like +a character string), use hashlittle(). If you have several byte arrays, or +a mix of things, see the comments above hashlittle(). + +Why is this so big? I read 12 bytes at a time into 3 4-byte integers, +then mix those integers. This is fast (you can do a lot more thorough +mixing with 12*3 instructions on 3 integers than you can with 3 instructions +on 1 byte), but shoehorning those bytes into integers efficiently is messy. +------------------------------------------------------------------------------- +*/ +/* #define SELF_TEST 1 */ + +#include +#include /* defines printf for tests */ +#include /* defines time_t for timings in the test */ +#ifndef HAVE_STDINT_H +# include "pstdint.h" /* attempts to define uint32_t etc portably */ +#else +# include +#endif /* HAVE_STDINT_H */ +#ifdef HAVE_SYS_PARAM_H +#include /* attempt to define endianness */ +#endif /* HAVE_SYS_PARAM_H */ +#ifdef linux +# include /* attempt to define endianness */ +#endif + +#define VALGRIND /* added by Russ Rew, for portability over speed */ + +#ifndef WORDS_BIGENDIAN /* from config.h */ +#define HASH_LITTLE_ENDIAN 1 +#define HASH_BIG_ENDIAN 0 +#else +#define HASH_LITTLE_ENDIAN 0 +#define HASH_BIG_ENDIAN 1 +#endif + +#define hashsize(n) ((uint32_t)1<<(n)) +#define hashmask(n) (hashsize(n)-1) +#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) + +/* +------------------------------------------------------------------------------- +mix -- mix 3 32-bit values reversibly. + +This is reversible, so any information in (a,b,c) before mix() is +still in (a,b,c) after mix(). + +If four pairs of (a,b,c) inputs are run through mix(), or through +mix() in reverse, there are at least 32 bits of the output that +are sometimes the same for one pair and different for another pair. +This was tested for: +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that +satisfy this are + 4 6 8 16 19 4 + 9 15 3 18 27 15 + 14 9 3 7 17 3 +Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing +for "differ" defined as + with a one-bit base and a two-bit delta. I +used http://burtleburtle.net/bob/hash/avalanche.html to choose +the operations, constants, and arrangements of the variables. + +This does not achieve avalanche. There are input bits of (a,b,c) +that fail to affect some output bits of (a,b,c), especially of a. The +most thoroughly mixed value is c, but it doesn't really even achieve +avalanche in c. + +This allows some parallelism. Read-after-writes are good at doubling +the number of bits affected, so the goal of mixing pulls in the opposite +direction as the goal of parallelism. I did what I could. Rotates +seem to cost as much as shifts on every machine I could lay my hands +on, and rotates are much kinder to the top and bottom bits, so I used +rotates. +------------------------------------------------------------------------------- +*/ +#define mix(a,b,c) \ +{ \ + a -= c; a ^= rot(c, 4); c += b; \ + b -= a; b ^= rot(a, 6); a += c; \ + c -= b; c ^= rot(b, 8); b += a; \ + a -= c; a ^= rot(c,16); c += b; \ + b -= a; b ^= rot(a,19); a += c; \ + c -= b; c ^= rot(b, 4); b += a; \ +} + +/* +------------------------------------------------------------------------------- +final -- final mixing of 3 32-bit values (a,b,c) into c + +Pairs of (a,b,c) values differing in only a few bits will usually +produce values of c that look totally different. This was tested for +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +These constants passed: + 14 11 25 16 4 14 24 + 12 14 25 16 4 14 24 +and these came close: + 4 8 15 26 3 22 24 + 10 8 15 26 3 22 24 + 11 8 15 26 3 22 24 +------------------------------------------------------------------------------- +*/ +#define final(a,b,c) \ +{ \ + c ^= b; c -= rot(b,14); \ + a ^= c; a -= rot(c,11); \ + b ^= a; b -= rot(a,25); \ + c ^= b; c -= rot(b,16); \ + a ^= c; a -= rot(c,4); \ + b ^= a; b -= rot(a,14); \ + c ^= b; c -= rot(b,24); \ +} + +/* +-------------------------------------------------------------------- + This works on all machines. To be useful, it requires + -- that the key be an array of uint32_t's, and + -- that the length be the number of uint32_t's in the key + + The function hashword() is identical to hashlittle() on little-endian + machines, and identical to hashbig() on big-endian machines, + except that the length has to be measured in uint32_ts rather than in + bytes. hashlittle() is more complicated than hashword() only because + hashlittle() has to dance around fitting the key bytes into registers. +-------------------------------------------------------------------- +*/ +#ifdef SELF_TEST +static +uint32_t hashword( +const uint32_t *k, /* the key, an array of uint32_t values */ +size_t length, /* the length of the key, in uint32_ts */ +uint32_t initval) /* the previous hash, or an arbitrary value */ +{ + uint32_t a,b,c; + + /* Set up the internal state */ + a = b = c = 0xdeadbeef + (((uint32_t)length)<<2) + initval; + + /*------------------------------------------------- handle most of the key */ + while (length > 3) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 3; + k += 3; + } + + /*------------------------------------------- handle the last 3 uint32_t's */ + switch(length) /* all the case statements fall through */ + { + case 3 : c+=k[2]; + case 2 : b+=k[1]; + case 1 : a+=k[0]; + final(a,b,c); + case 0: /* case 0: nothing left to add */ + break; + } + /*------------------------------------------------------ report the result */ + return c; +} + +/* +-------------------------------------------------------------------- +hashword2() -- same as hashword(), but take two seeds and return two +32-bit values. pc and pb must both be nonnull, and *pc and *pb must +both be initialized with seeds. If you pass in (*pb)==0, the output +(*pc) will be the same as the return value from hashword(). +-------------------------------------------------------------------- +*/ +static +void hashword2 ( +const uint32_t *k, /* the key, an array of uint32_t values */ +size_t length, /* the length of the key, in uint32_ts */ +uint32_t *pc, /* IN: seed OUT: primary hash value */ +uint32_t *pb) /* IN: more seed OUT: secondary hash value */ +{ + uint32_t a,b,c; + + /* Set up the internal state */ + a = b = c = 0xdeadbeef + ((uint32_t)(length<<2)) + *pc; + c += *pb; + + /*------------------------------------------------- handle most of the key */ + while (length > 3) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 3; + k += 3; + } + + /*------------------------------------------- handle the last 3 uint32_t's */ + switch(length) /* all the case statements fall through */ + { + case 3 : c+=k[2]; + case 2 : b+=k[1]; + case 1 : a+=k[0]; + final(a,b,c); + case 0: /* case 0: nothing left to add */ + break; + } + /*------------------------------------------------------ report the result */ + *pc=c; *pb=b; +} + +/* + * hashlittle2: return 2 32-bit hash values + * + * This is identical to hashlittle(), except it returns two 32-bit hash + * values instead of just one. This is good enough for hash table + * lookup with 2^^64 buckets, or if you want a second hash if you're not + * happy with the first, or if you want a probably-unique 64-bit ID for + * the key. *pc is better mixed than *pb, so use *pc first. If you want + * a 64-bit value do something like "*pc + (((uint64_t)*pb)<<32)". + */ +static void +hashlittle2( + const void *key, /* the key to hash */ + size_t length, /* length of the key */ + uint32_t *pc, /* IN: primary initval, OUT: primary hash */ + uint32_t *pb) /* IN: secondary initval, OUT: secondary hash */ +{ + uint32_t a,b,c; /* internal state */ + union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */ + + /* Set up the internal state */ + a = b = c = 0xdeadbeef + ((uint32_t)length) + *pc; + c += *pb; + + u.ptr = key; + if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) { + const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */ + const uint8_t *k8; + + /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 12; + k += 3; + } + + /*----------------------------- handle the last (probably partial) block */ + /* + * "k[2]&0xffffff" actually reads beyond the end of the string, but + * then masks off the part it's not allowed to read. Because the + * string is aligned, the masked-off tail is in the same word as the + * rest of the string. Every machine with memory protection I've seen + * does it on word boundaries, so is OK with this. But VALGRIND will + * still catch it and complain. The masking trick does make the hash + * noticably faster for short strings (like English words). + */ +#ifndef VALGRIND + + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break; + case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break; + case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break; + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=k[1]&0xffffff; a+=k[0]; break; + case 6 : b+=k[1]&0xffff; a+=k[0]; break; + case 5 : b+=k[1]&0xff; a+=k[0]; break; + case 4 : a+=k[0]; break; + case 3 : a+=k[0]&0xffffff; break; + case 2 : a+=k[0]&0xffff; break; + case 1 : a+=k[0]&0xff; break; + case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */ + } + +#else /* make valgrind happy */ + + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=((uint32_t)k8[9])<<8; /* fall through */ + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */ + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]; break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */ + case 1 : a+=k8[0]; break; + case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */ + } + +#endif /* !valgrind */ + + } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) { + const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */ + const uint8_t *k8; + + /*--------------- all but last block: aligned reads and different mixing */ + while (length > 12) + { + a += k[0] + (((uint32_t)k[1])<<16); + b += k[2] + (((uint32_t)k[3])<<16); + c += k[4] + (((uint32_t)k[5])<<16); + mix(a,b,c); + length -= 12; + k += 6; + } + + /*----------------------------- handle the last (probably partial) block */ + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[4]+(((uint32_t)k[5])<<16); + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=k[4]; + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=k[2]; + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=k[0]; + break; + case 1 : a+=k8[0]; + break; + case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */ + } + + } else { /* need to read the key one byte at a time */ + const uint8_t *k = (const uint8_t *)key; + + /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + a += ((uint32_t)k[1])<<8; + a += ((uint32_t)k[2])<<16; + a += ((uint32_t)k[3])<<24; + b += k[4]; + b += ((uint32_t)k[5])<<8; + b += ((uint32_t)k[6])<<16; + b += ((uint32_t)k[7])<<24; + c += k[8]; + c += ((uint32_t)k[9])<<8; + c += ((uint32_t)k[10])<<16; + c += ((uint32_t)k[11])<<24; + mix(a,b,c); + length -= 12; + k += 12; + } + + /*-------------------------------- last block: affect all 32 bits of (c) */ + switch(length) /* all the case statements fall through */ + { + case 12: c+=((uint32_t)k[11])<<24; + case 11: c+=((uint32_t)k[10])<<16; + case 10: c+=((uint32_t)k[9])<<8; + case 9 : c+=k[8]; + case 8 : b+=((uint32_t)k[7])<<24; + case 7 : b+=((uint32_t)k[6])<<16; + case 6 : b+=((uint32_t)k[5])<<8; + case 5 : b+=k[4]; + case 4 : a+=((uint32_t)k[3])<<24; + case 3 : a+=((uint32_t)k[2])<<16; + case 2 : a+=((uint32_t)k[1])<<8; + case 1 : a+=k[0]; + break; + case 0 : *pc=c; *pb=b; return; /* zero length strings require no mixing */ + } + } + + final(a,b,c); + *pc=c; *pb=b; +} +#endif /*SELF_TEST*/ + + +#ifdef WORDS_BIGENDIAN +/* + * hashbig(): + * This is the same as hashword() on big-endian machines. It is different + * from hashlittle() on all machines. hashbig() takes advantage of + * big-endian byte ordering. + */ +static uint32_t +hashbig( const void *key, size_t length, uint32_t initval) +{ + uint32_t a,b,c; + union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */ + + /* Set up the internal state */ + a = b = c = 0xdeadbeef + ((uint32_t)length) + initval; + + u.ptr = key; + if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) { + const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */ + const uint8_t *k8; + + /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 12; + k += 3; + } + + /*----------------------------- handle the last (probably partial) block */ + /* + * "k[2]<<8" actually reads beyond the end of the string, but + * then shifts out the part it's not allowed to read. Because the + * string is aligned, the illegal read is in the same word as the + * rest of the string. Every machine with memory protection I've seen + * does it on word boundaries, so is OK with this. But VALGRIND will + * still catch it and complain. The masking trick does make the hash + * noticably faster for short strings (like English words). + */ +#ifndef VALGRIND + + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=k[2]&0xffffff00; b+=k[1]; a+=k[0]; break; + case 10: c+=k[2]&0xffff0000; b+=k[1]; a+=k[0]; break; + case 9 : c+=k[2]&0xff000000; b+=k[1]; a+=k[0]; break; + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=k[1]&0xffffff00; a+=k[0]; break; + case 6 : b+=k[1]&0xffff0000; a+=k[0]; break; + case 5 : b+=k[1]&0xff000000; a+=k[0]; break; + case 4 : a+=k[0]; break; + case 3 : a+=k[0]&0xffffff00; break; + case 2 : a+=k[0]&0xffff0000; break; + case 1 : a+=k[0]&0xff000000; break; + case 0 : return c; /* zero length strings require no mixing */ + } + +#else /* make valgrind happy */ + + k8 = (const uint8_t *)k; + switch(length) /* all the case statements fall through */ + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=((uint32_t)k8[10])<<8; /* fall through */ + case 10: c+=((uint32_t)k8[9])<<16; /* fall through */ + case 9 : c+=((uint32_t)k8[8])<<24; /* fall through */ + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=((uint32_t)k8[6])<<8; /* fall through */ + case 6 : b+=((uint32_t)k8[5])<<16; /* fall through */ + case 5 : b+=((uint32_t)k8[4])<<24; /* fall through */ + case 4 : a+=k[0]; break; + case 3 : a+=((uint32_t)k8[2])<<8; /* fall through */ + case 2 : a+=((uint32_t)k8[1])<<16; /* fall through */ + case 1 : a+=((uint32_t)k8[0])<<24; break; + case 0 : return c; + } + +#endif /* !VALGRIND */ + + } else { /* need to read the key one byte at a time */ + const uint8_t *k = (const uint8_t *)key; + + /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) + { + a += ((uint32_t)k[0])<<24; + a += ((uint32_t)k[1])<<16; + a += ((uint32_t)k[2])<<8; + a += ((uint32_t)k[3]); + b += ((uint32_t)k[4])<<24; + b += ((uint32_t)k[5])<<16; + b += ((uint32_t)k[6])<<8; + b += ((uint32_t)k[7]); + c += ((uint32_t)k[8])<<24; + c += ((uint32_t)k[9])<<16; + c += ((uint32_t)k[10])<<8; + c += ((uint32_t)k[11]); + mix(a,b,c); + length -= 12; + k += 12; + } + + /*-------------------------------- last block: affect all 32 bits of (c) */ + switch(length) /* all the case statements fall through */ + { + case 12: c+=k[11]; + case 11: c+=((uint32_t)k[10])<<8; + case 10: c+=((uint32_t)k[9])<<16; + case 9 : c+=((uint32_t)k[8])<<24; + case 8 : b+=k[7]; + case 7 : b+=((uint32_t)k[6])<<8; + case 6 : b+=((uint32_t)k[5])<<16; + case 5 : b+=((uint32_t)k[4])<<24; + case 4 : a+=k[3]; + case 3 : a+=((uint32_t)k[2])<<8; + case 2 : a+=((uint32_t)k[1])<<16; + case 1 : a+=((uint32_t)k[0])<<24; + break; + case 0 : return c; + } + } + + final(a,b,c); + return c; +} +#endif /*WORDS_BIGENDIAN*/ + +/* +------------------------------------------------------------------------------- +hashlittle() -- hash a variable-length key into a 32-bit value + k : the key (the unaligned variable-length array of bytes) + length : the length of the key, counting by bytes + initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Two keys differing by one or two bits will have +totally different hash values. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8_t **)k, do it like this: + for (i=0, h=0; i 12) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 12; + k += 3; + } + + /*----------------------------- handle the last (probably partial) block */ + /* + * "k[2]&0xffffff" actually reads beyond the end of the string, but + * then masks off the part it's not allowed to read. Because the + * string is aligned, the masked-off tail is in the same word as the + * rest of the string. Every machine with memory protection I've seen + * does it on word boundaries, so is OK with this. But VALGRIND will + * still catch it and complain. The masking trick does make the hash + * noticably faster for short strings (like English words). + */ +#ifndef VALGRIND + + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break; + case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break; + case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break; + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=k[1]&0xffffff; a+=k[0]; break; + case 6 : b+=k[1]&0xffff; a+=k[0]; break; + case 5 : b+=k[1]&0xff; a+=k[0]; break; + case 4 : a+=k[0]; break; + case 3 : a+=k[0]&0xffffff; break; + case 2 : a+=k[0]&0xffff; break; + case 1 : a+=k[0]&0xff; break; + case 0 : return c; /* zero length strings require no mixing */ + } + +#else /* make valgrind happy */ + + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=((uint32_t)k8[9])<<8; /* fall through */ + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */ + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]; break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */ + case 1 : a+=k8[0]; break; + case 0 : return c; + } + +#endif /* !valgrind */ + + } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) { + const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */ + const uint8_t *k8; + + /*--------------- all but last block: aligned reads and different mixing */ + while (length > 12) + { + a += k[0] + (((uint32_t)k[1])<<16); + b += k[2] + (((uint32_t)k[3])<<16); + c += k[4] + (((uint32_t)k[5])<<16); + mix(a,b,c); + length -= 12; + k += 6; + } + + /*----------------------------- handle the last (probably partial) block */ + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[4]+(((uint32_t)k[5])<<16); + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=k[4]; + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=k[2]; + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=k[0]; + break; + case 1 : a+=k8[0]; + break; + case 0 : return c; /* zero length requires no mixing */ + } + + } else { /* need to read the key one byte at a time */ + const uint8_t *k = (const uint8_t *)key; + + /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + a += ((uint32_t)k[1])<<8; + a += ((uint32_t)k[2])<<16; + a += ((uint32_t)k[3])<<24; + b += k[4]; + b += ((uint32_t)k[5])<<8; + b += ((uint32_t)k[6])<<16; + b += ((uint32_t)k[7])<<24; + c += k[8]; + c += ((uint32_t)k[9])<<8; + c += ((uint32_t)k[10])<<16; + c += ((uint32_t)k[11])<<24; + mix(a,b,c); + length -= 12; + k += 12; + } + + /*-------------------------------- last block: affect all 32 bits of (c) */ + switch(length) /* all the case statements fall through */ + { + case 12: c+=((uint32_t)k[11])<<24; + case 11: c+=((uint32_t)k[10])<<16; + case 10: c+=((uint32_t)k[9])<<8; + case 9 : c+=k[8]; + case 8 : b+=((uint32_t)k[7])<<24; + case 7 : b+=((uint32_t)k[6])<<16; + case 6 : b+=((uint32_t)k[5])<<8; + case 5 : b+=k[4]; + case 4 : a+=((uint32_t)k[3])<<24; + case 3 : a+=((uint32_t)k[2])<<16; + case 2 : a+=((uint32_t)k[1])<<8; + case 1 : a+=k[0]; + break; + case 0 : return c; + } + } + + final(a,b,c); + return c; +} + + +/* + * hash_fast(key, length, initval) + * Wrapper that calls either hashlittle or hashbig, depending on endianness. + */ +uint32_t +hash_fast( const void *key, size_t length) { +#define NC_ARBITRARY_UINT (992099683U) +#ifndef WORDS_BIGENDIAN + return hashlittle(key, length, NC_ARBITRARY_UINT); +#else + return hashbig(key, length, NC_ARBITRARY_UINT); +#endif +} + +#ifdef SELF_TEST +/* used for timings */ +void driver1() +{ + uint8_t buf[256]; + uint32_t i; + uint32_t h=0; + time_t a,z; + + time(&a); + for (i=0; i<256; ++i) buf[i] = 'x'; + for (i=0; i<1; ++i) + { + h = hashlittle(&buf[0],1,h); + } + time(&z); + if (z-a > 0) printf("time %d %.8x\n", z-a, h); +} + +/* check that every input bit changes every output bit half the time */ +#define HASHSTATE 1 +#define HASHLEN 1 +#define MAXPAIR 60 +#define MAXLEN 70 +void driver2() +{ + uint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1]; + uint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z; + uint32_t e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE]; + uint32_t x[HASHSTATE],y[HASHSTATE]; + uint32_t hlen; + + printf("No more than %d trials should ever be needed \n",MAXPAIR/2); + for (hlen=0; hlen < MAXLEN; ++hlen) + { + z=0; + for (i=0; i>(8-j)); + c[0] = hashlittle(a, hlen, m); + b[i] ^= ((k+1)<>(8-j)); + d[0] = hashlittle(b, hlen, m); + /* check every bit is 1, 0, set, and not set at least once */ + for (l=0; lz) z=k; + if (k==MAXPAIR) + { + printf("Some bit didn't change: "); + printf("%.8x %.8x %.8x %.8x %.8x %.8x ", + e[0],f[0],g[0],h[0],x[0],y[0]); + printf("i %d j %d m %d len %d\n", i, j, m, hlen); + } + if (z==MAXPAIR) goto done; + } + } + } + done: + if (z < MAXPAIR) + { + printf("Mix success %2d bytes %2d initvals ",i,m); + printf("required %d trials\n", z/2); + } + } + printf("\n"); +} + +/* Check for reading beyond the end of the buffer and alignment problems */ +void driver3() +{ + uint8_t buf[MAXLEN+20], *b; + uint32_t len; + uint8_t q[] = "This is the time for all good men to come to the aid of their country..."; + uint32_t h; + uint8_t qq[] = "xThis is the time for all good men to come to the aid of their country..."; + uint32_t i; + uint8_t qqq[] = "xxThis is the time for all good men to come to the aid of their country..."; + uint32_t j; + uint8_t qqqq[] = "xxxThis is the time for all good men to come to the aid of their country..."; + uint32_t ref,x,y; + uint8_t *p; + + printf("Endianness. These lines should all be the same (for values filled in):\n"); + printf("%.8x %.8x %.8x\n", + hashword((const uint32_t *)q, (sizeof(q)-1)/4, 13), + hashword((const uint32_t *)q, (sizeof(q)-5)/4, 13), + hashword((const uint32_t *)q, (sizeof(q)-9)/4, 13)); + p = q; + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13), + hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13), + hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13), + hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13), + hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13), + hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13)); + p = &qq[1]; + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13), + hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13), + hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13), + hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13), + hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13), + hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13)); + p = &qqq[2]; + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13), + hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13), + hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13), + hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13), + hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13), + hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13)); + p = &qqqq[3]; + printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n", + hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13), + hashlittle(p, sizeof(q)-3, 13), hashlittle(p, sizeof(q)-4, 13), + hashlittle(p, sizeof(q)-5, 13), hashlittle(p, sizeof(q)-6, 13), + hashlittle(p, sizeof(q)-7, 13), hashlittle(p, sizeof(q)-8, 13), + hashlittle(p, sizeof(q)-9, 13), hashlittle(p, sizeof(q)-10, 13), + hashlittle(p, sizeof(q)-11, 13), hashlittle(p, sizeof(q)-12, 13)); + printf("\n"); + + /* check that hashlittle2 and hashlittle produce the same results */ + i=47; j=0; + hashlittle2(q, sizeof(q), &i, &j); + if (hashlittle(q, sizeof(q), 47) != i) + printf("hashlittle2 and hashlittle mismatch\n"); + + /* check that hashword2 and hashword produce the same results */ + len = 0xdeadbeef; + i=47, j=0; + hashword2(&len, 1, &i, &j); + if (hashword(&len, 1, 47) != i) + printf("hashword2 and hashword mismatch %x %x\n", + i, hashword(&len, 1, 47)); + + /* check hashlittle doesn't read before or after the ends of the string */ + for (h=0, b=buf+1; h<8; ++h, ++b) + { + for (i=0; i +#include +#include +#define lseek64 lseek +#endif + +#include "config.h" +#include +#include +#include +#include +#ifdef _MSC_VER /* Microsoft Compilers */ +#include +#else +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include "nc.h" + +#undef DEBUG + +#ifdef DEBUG +#include +#endif + +#ifndef HAVE_SSIZE_T +#define ssize_t int +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +/* Define the mode flags for create: let umask rule */ +#define OPENMODE 0666 + +#include "ncio.h" +#include "fbits.h" +#include "rnd.h" + +/* #define INSTRUMENT 1 */ +#if INSTRUMENT /* debugging */ +#undef NDEBUG +#include +/*#include "instr.h"*/ +#endif + +#ifndef MEMIO_MAXBLOCKSIZE +#define MEMIO_MAXBLOCKSIZE 268435456 /* sanity check, about X_SIZE_T_MAX/8 */ +#endif + +#undef MIN /* system may define MIN somewhere and complain */ +#define MIN(mm,nn) (((mm) < (nn)) ? (mm) : (nn)) + +#if !defined(NDEBUG) && !defined(X_INT_MAX) +#define X_INT_MAX 2147483647 +#endif + +#if 0 /* !defined(NDEBUG) && !defined(X_ALIGN) */ +#define X_ALIGN 4 +#else +#undef X_ALIGN +#endif + +/* Private data for memio */ + +typedef struct NCMEMIO { + int locked; /* => we cannot realloc */ + int persist; /* => save to a file; triggered by NC_WRITE */ + char* memory; + off_t alloc; + off_t size; + off_t pos; +} NCMEMIO; + +/* Forward */ +static int memio_rel(ncio *const nciop, off_t offset, int rflags); +static int memio_get(ncio *const nciop, off_t offset, size_t extent, int rflags, void **const vpp); +static int memio_move(ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags); +static int memio_sync(ncio *const nciop); +static int memio_filesize(ncio* nciop, off_t* filesizep); +static int memio_pad_length(ncio* nciop, off_t length); +static int memio_close(ncio* nciop, int); + +/* Mnemonic */ +#define DOOPEN 1 + +static long pagesize = 0; + +/* Create a new ncio struct to hold info about the file. */ +static int +memio_new(const char* path, int ioflags, off_t initialsize, ncio** nciopp, NCMEMIO** memiop) +{ + int status = NC_NOERR; + ncio* nciop = NULL; + NCMEMIO* memio = NULL; + int openfd = -1; + + if(pagesize == 0) { + +#if defined (_WIN32) || defined(_WIN64) + SYSTEM_INFO info; + GetSystemInfo (&info); + pagesize = info.dwPageSize; +#elif defined HAVE_SYSCONF + pagesize = sysconf(_SC_PAGE_SIZE); +#elif defined HAVE_GETPAGESIZE + pagesize = getpagesize(); +#else + pagesize = 4096; /* good guess */ +#endif + } + + errno = 0; + + /* Always force the allocated size to be a multiple of pagesize */ + if(initialsize == 0) initialsize = pagesize; + if((initialsize % pagesize) != 0) + initialsize += (pagesize - (initialsize % pagesize)); + + nciop = (ncio* )calloc(1,sizeof(ncio)); + if(nciop == NULL) {status = NC_ENOMEM; goto fail;} + + nciop->ioflags = ioflags; + *((int*)&nciop->fd) = -1; /* caller will fix */ + + *((char**)&nciop->path) = strdup(path); + if(nciop->path == NULL) {status = NC_ENOMEM; goto fail;} + + *((ncio_relfunc**)&nciop->rel) = memio_rel; + *((ncio_getfunc**)&nciop->get) = memio_get; + *((ncio_movefunc**)&nciop->move) = memio_move; + *((ncio_syncfunc**)&nciop->sync) = memio_sync; + *((ncio_filesizefunc**)&nciop->filesize) = memio_filesize; + *((ncio_pad_lengthfunc**)&nciop->pad_length) = memio_pad_length; + *((ncio_closefunc**)&nciop->close) = memio_close; + + memio = (NCMEMIO*)calloc(1,sizeof(NCMEMIO)); + if(memio == NULL) {status = NC_ENOMEM; goto fail;} + *((void* *)&nciop->pvt) = memio; + + memio->alloc = initialsize; + + memio->memory = NULL; + memio->size = 0; + memio->pos = 0; + memio->persist = fIsSet(ioflags,NC_WRITE); + + if(nciopp) *nciopp = nciop; + if(memiop) *memiop = memio; + +done: + if(openfd >= 0) close(openfd); + return status; + +fail: + if(nciop != NULL) { + if(nciop->path != NULL) free((char*)nciop->path); + } + goto done; +} + +/* Create a file, and the ncio struct to go with it. This function is + only called from nc__create_mp. + + path - path of file to create. + ioflags - flags from nc_create + initialsz - From the netcdf man page: "The argument + Iinitialsize sets the initial size of the file at creation time." + igeto - + igetsz - + sizehintp - the size of a page of data for buffered reads and writes. + nciopp - pointer to a pointer that will get location of newly + created and inited ncio struct. + mempp - pointer to pointer to the initial memory read. +*/ +int +memio_create(const char* path, int ioflags, + size_t initialsz, + off_t igeto, size_t igetsz, size_t* sizehintp, + ncio* *nciopp, void** const mempp) +{ + ncio* nciop; + int fd; + int status; + NCMEMIO* memio = NULL; + int persist = (ioflags & NC_WRITE?1:0); + int oflags; + + if(path == NULL ||* path == 0) + return NC_EINVAL; + + /* For diskless open has, the file must be classic version 1 or 2.*/ + if(fIsSet(ioflags,NC_NETCDF4)) + return NC_EDISKLESS; /* violates constraints */ + + status = memio_new(path, ioflags, initialsz, &nciop, &memio); + if(status != NC_NOERR) + return status; + memio->size = 0; + + if(!persist) { + memio->memory = (char*)malloc(memio->alloc); + if(memio->memory == NULL) {status = NC_ENOMEM; goto unwind_open;} + } else { /*persist */ + /* Open the file, but make sure we can write it if needed */ + oflags = (persist ? O_RDWR : O_RDONLY); +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif + oflags |= (O_CREAT|O_TRUNC); + if(fIsSet(ioflags,NC_NOCLOBBER)) + oflags |= O_EXCL; +#ifdef vms + fd = open(path, oflags, 0, "ctx=stm"); +#else + fd = open(path, oflags, OPENMODE); +#endif + if(fd < 0) {status = errno; goto unwind_open;} + + (void)close(fd); /* will reopen at nc_close */ + /* malloc memory */ + memio->memory = (char*)malloc(memio->alloc); + if(memio->memory == NULL) {status = NC_ENOMEM; goto unwind_open;} + } /*!persist*/ + +#ifdef DEBUG +fprintf(stderr,"memio_create: initial memory: %lu/%lu\n",(unsigned long)memio->memory,(unsigned long)memio->alloc); +#endif + + fd = nc__pseudofd(); + *((int* )&nciop->fd) = fd; + + fSet(nciop->ioflags, NC_WRITE); + + if(igetsz != 0) + { + status = nciop->get(nciop, + igeto, igetsz, + RGN_WRITE, + mempp); + if(status != NC_NOERR) + goto unwind_open; + } + + /* Pick a default sizehint */ + if(sizehintp) *sizehintp = pagesize; + + *nciopp = nciop; + return NC_NOERR; + +unwind_open: + memio_close(nciop,1); + return status; +} + +/* This function opens the data file. It is only called from nc.c, + from nc__open_mp and nc_delete_mp. + + path - path of data file. + ioflags - flags passed into nc_open. + igeto - looks like this function can do an initial page get, and + igeto is going to be the offset for that. But it appears to be + unused + igetsz - the size in bytes of initial page get (a.k.a. extent). Not + ever used in the library. + sizehintp - the size of a page of data for buffered reads and writes. + nciopp - pointer to pointer that will get address of newly created + and inited ncio struct. + mempp - pointer to pointer to the initial memory read. +*/ +int +memio_open(const char* path, + int ioflags, + off_t igeto, size_t igetsz, size_t* sizehintp, + ncio* *nciopp, void** const mempp) +{ + ncio* nciop; + int fd; + int status; + int persist = (fIsSet(ioflags,NC_WRITE)?1:0); + int oflags; + NCMEMIO* memio = NULL; + size_t sizehint; + off_t filesize; + + if(path == NULL ||* path == 0) + return EINVAL; + + assert(sizehintp != NULL); + sizehint = *sizehintp; + + /* Open the file, but make sure we can write it if needed */ + oflags = (persist ? O_RDWR : O_RDONLY); +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif + oflags |= O_EXCL; +#ifdef vms + fd = open(path, oflags, 0, "ctx=stm"); +#else + fd = open(path, oflags, OPENMODE); +#endif +#ifdef DEBUG + if(fd < 0) { + fprintf(stderr,"open failed: file=%s err=",path); + perror(""); + } +#endif + if(fd < 0) {status = errno; goto unwind_open;} + + /* get current filesize = max(|file|,initialize)*/ + filesize = lseek(fd,0,SEEK_END); + if(filesize < 0) {status = errno; goto unwind_open;} + /* move pointer back to beginning of file */ + (void)lseek(fd,0,SEEK_SET); + if(filesize < (off_t)sizehint) + filesize = (off_t)sizehint; + + status = memio_new(path, ioflags, filesize, &nciop, &memio); + if(status != NC_NOERR) + return status; + memio->size = filesize; + + memio->memory = (char*)malloc(memio->alloc); + if(memio->memory == NULL) {status = NC_ENOMEM; goto unwind_open;} + +#ifdef DEBUG +fprintf(stderr,"memio_open: initial memory: %lu/%lu\n",(unsigned long)memio->memory,(unsigned long)memio->alloc); +#endif + + /* Read the file into the memio memory */ + /* We need to do multiple reads because there is no + guarantee that the amount read will be the full amount */ + { + off_t red = memio->size; + char* pos = memio->memory; + while(red > 0) { + ssize_t count = read(fd, pos, red); + if(count < 0) + {close(fd); status = errno; goto unwind_open;} + if(count == 0) + {close(fd); status = NC_ENOTNC; goto unwind_open;} + red -= count; + pos += count; + } + } + (void)close(fd); /* until memio_close() */ + + /* Use half the filesize as the blocksize */ + sizehint = filesize/2; + + fd = nc__pseudofd(); + *((int* )&nciop->fd) = fd; + + if(igetsz != 0) + { + status = nciop->get(nciop, + igeto, igetsz, + 0, + mempp); + if(status != NC_NOERR) + goto unwind_open; + } + + *sizehintp = sizehint; + *nciopp = nciop; + return NC_NOERR; + +unwind_open: + memio_close(nciop,0); + return status; +} + + +/* + * Get file size in bytes. + */ +static int +memio_filesize(ncio* nciop, off_t* filesizep) +{ + NCMEMIO* memio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + memio = (NCMEMIO*)nciop->pvt; + if(filesizep != NULL) *filesizep = memio->size; + return NC_NOERR; +} + +/* + * Sync any changes to disk, then truncate or extend file so its size + * is length. This is only intended to be called before close, if the + * file is open for writing and the actual size does not match the + * calculated size, perhaps as the result of having been previously + * written in NOFILL mode. + */ +static int +memio_pad_length(ncio* nciop, off_t length) +{ + NCMEMIO* memio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + memio = (NCMEMIO*)nciop->pvt; + + if(!fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file*/ + + if(memio->locked > 0) + return NC_EDISKLESS; + + if(length > memio->alloc) { + /* Realloc the allocated memory to a multiple of the pagesize*/ + off_t newsize = length; + void* newmem = NULL; + /* Round to a multiple of pagesize */ + if((newsize % pagesize) != 0) + newsize += (pagesize - (newsize % pagesize)); + + newmem = (char*)realloc(memio->memory,newsize); + if(newmem == NULL) return NC_ENOMEM; + + /* zero out the extra memory */ + memset((void*)(newmem+memio->alloc),0,(newsize - memio->alloc)); + +#ifdef DEBUG +fprintf(stderr,"realloc: %lu/%lu -> %lu/%lu\n", +(unsigned long)memio->memory,(unsigned long)memio->alloc, +(unsigned long)newmem,(unsigned long)newsize); +#endif + memio->memory = newmem; + memio->alloc = newsize; + } + memio->size = length; + return NC_NOERR; +} + +/* Write out any dirty buffers to disk and + ensure that next read will get data from disk. + Sync any changes, then close the open file associated with the ncio + struct, and free its memory. + nciop - pointer to ncio to close. + doUnlink - if true, unlink file +*/ + +static int +memio_close(ncio* nciop, int doUnlink) +{ + int status = NC_NOERR; + NCMEMIO* memio; + int fd = -1; + if(nciop == NULL || nciop->pvt == NULL) return NC_NOERR; + + memio = (NCMEMIO*)nciop->pvt; + assert(memio != NULL); + + /* See if the user wants the contents persisted to a file */ + if(memio->persist) { + /* Try to open the file for writing */ + int oflags = O_WRONLY|O_CREAT|O_TRUNC; +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif + fd = open(nciop->path, oflags, OPENMODE); + if(fd >= 0) { + /* We need to do multiple writes because there is no + guarantee that the amount written will be the full amount */ + off_t written = memio->size; + char* pos = memio->memory; + while(written > 0) { + ssize_t count = write(fd, pos, written); + if(count < 0) + {status = errno; goto done;} + if(count == 0) + {status = NC_ENOTNC; goto done;} + written -= count; + pos += count; + } + } else + status = errno; + /* Free up things */ + if(memio->memory != NULL) free(memio->memory); + } + +done: + /* do cleanup */ + if(fd >= 0) (void)close(fd); + if(memio != NULL) free(memio); + if(nciop->path != NULL) free((char*)nciop->path); + free(nciop); + return status; +} + +static int +guarantee(ncio* nciop, off_t endpoint) +{ + NCMEMIO* memio = (NCMEMIO*)nciop->pvt; + if(endpoint > memio->alloc) { + /* extend the allocated memory and size */ + int status = memio_pad_length(nciop,endpoint); + if(status != NC_NOERR) return status; + } + if(memio->size < endpoint) + memio->size = endpoint; + return NC_NOERR; +} + +/* + * Request that the region (offset, extent) + * be made available through *vpp. + */ +static int +memio_get(ncio* const nciop, off_t offset, size_t extent, int rflags, void** const vpp) +{ + int status = NC_NOERR; + NCMEMIO* memio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + memio = (NCMEMIO*)nciop->pvt; + status = guarantee(nciop, offset+extent); + memio->locked++; + if(status != NC_NOERR) return status; + if(vpp) *vpp = memio->memory+offset; + return NC_NOERR; +} + +/* + * Like memmove(), safely move possibly overlapping data. + */ +static int +memio_move(ncio* const nciop, off_t to, off_t from, size_t nbytes, int ignored) +{ + int status = NC_NOERR; + NCMEMIO* memio; + + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + memio = (NCMEMIO*)nciop->pvt; + if(from < to) { + /* extend if "to" is not currently allocated */ + status = guarantee(nciop,to+nbytes); + if(status != NC_NOERR) return status; + } + /* check for overlap */ + if((to + nbytes) > from || (from + nbytes) > to) { + /* Ranges overlap */ +#ifdef HAVE_MEMMOVE + memmove((void*)(memio->memory+to),(void*)(memio->memory+from),nbytes); +#else + off_t overlap; + off_t nbytes1; + if((from + nbytes) > to) { + overlap = ((from + nbytes) - to); /* # bytes of overlap */ + nbytes1 = (nbytes - overlap); /* # bytes of non-overlap */ + /* move the non-overlapping part */ + memcpy((void*)(memio->memory+(to+overlap)), + (void*)(memio->memory+(from+overlap)), + nbytes1); + /* move the overlapping part */ + memcpy((void*)(memio->memory+to), + (void*)(memio->memory+from), + overlap); + } else { /*((to + nbytes) > from) */ + overlap = ((to + nbytes) - from); /* # bytes of overlap */ + nbytes1 = (nbytes - overlap); /* # bytes of non-overlap */ + /* move the non-overlapping part */ + memcpy((void*)(memio->memory+to), + (void*)(memio->memory+from), + nbytes1); + /* move the overlapping part */ + memcpy((void*)(memio->memory+(to+nbytes1)), + (void*)(memio->memory+(from+nbytes1)), + overlap); + } +#endif + } else {/* no overlap */ + memcpy((void*)(memio->memory+to),(void*)(memio->memory+from),nbytes); + } + return status; +} + +static int +memio_rel(ncio* const nciop, off_t offset, int rflags) +{ + NCMEMIO* memio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + memio = (NCMEMIO*)nciop->pvt; + memio->locked--; + return NC_NOERR; /* do nothing */ +} + +/* + * Write out any dirty buffers to disk and + * ensure that next read will get data from disk. + */ +static int +memio_sync(ncio* const nciop) +{ + return NC_NOERR; /* do nothing */ +} diff --git a/extern/src_netcdf4/mmapio.c b/extern/src_netcdf4/mmapio.c new file mode 100644 index 0000000..b80b943 --- /dev/null +++ b/extern/src_netcdf4/mmapio.c @@ -0,0 +1,595 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ + +#include "config.h" +#include +#include +#include +#include +#ifdef _MSC_VER /* Microsoft Compilers */ +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#include "nc.h" + +#undef DEBUG + +#ifdef DEBUG +#include +#endif + +#include + +#ifndef MAP_ANONYMOUS +# ifdef MAP_ANON +# define MAP_ANONYMOUS MAP_ANON +# endif +#endif + +/* !MAP_ANONYMOUS => !HAVE_MMAP */ +#ifndef MAP_ANONYMOUS +#error mmap not fully implemented: missing MAP_ANONYMOUS +#endif + +#ifdef HAVE_MMAP + /* This is conditionalized by __USE_GNU ; why? */ + extern void *mremap(void*,size_t,size_t,int); +# ifndef MREMAP_MAYMOVE +# define MREMAP_MAYMOVE 1 +# endif +#endif /*HAVE_MMAP*/ + +#ifndef HAVE_SSIZE_T +#define ssize_t int +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +/* Define the mode flags for create: let umask decide */ +#define OPENMODE 0666 + +#include "ncio.h" +#include "fbits.h" +#include "rnd.h" + +/* #define INSTRUMENT 1 */ +#if INSTRUMENT /* debugging */ +#undef NDEBUG +#include +/*#include "instr.h"*/ +#endif + +#ifndef MMAP_MAXBLOCKSIZE +#define MMAP_MAXBLOCKSIZE 268435456 /* sanity check, about X_SIZE_T_MAX/8 */ +#endif + +#undef MIN /* system may define MIN somewhere and complain */ +#define MIN(mm,nn) (((mm) < (nn)) ? (mm) : (nn)) + +#if !defined(NDEBUG) && !defined(X_INT_MAX) +#define X_INT_MAX 2147483647 +#endif + +#if 0 /* !defined(NDEBUG) && !defined(X_ALIGN) */ +#define X_ALIGN 4 +#else +#undef X_ALIGN +#endif + +/* Private data for mmap */ + +typedef struct NCMMAPIO { + int locked; /* => we cannot realloc */ + int persist; /* => save to a file; triggered by NC_WRITE */ + char* memory; + off_t alloc; + off_t size; + off_t pos; + int mapfd; +} NCMMAPIO; + +/* Forward */ +static int mmapio_rel(ncio *const nciop, off_t offset, int rflags); +static int mmapio_get(ncio *const nciop, off_t offset, size_t extent, int rflags, void **const vpp); +static int mmapio_move(ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags); +static int mmapio_sync(ncio *const nciop); +static int mmapio_filesize(ncio* nciop, off_t* filesizep); +static int mmapio_pad_length(ncio* nciop, off_t length); +static int mmapio_close(ncio* nciop, int); + +/* Mnemonic */ +#define DOOPEN 1 + +static long pagesize = 0; + +/* Create a new ncio struct to hold info about the file. */ +static int +mmapio_new(const char* path, int ioflags, off_t initialsize, ncio** nciopp, NCMMAPIO** mmapp) +{ + int status = NC_NOERR; + ncio* nciop = NULL; + NCMMAPIO* mmapio = NULL; + int openfd = -1; + + if(pagesize == 0) { +#if defined HAVE_SYSCONF + pagesize = sysconf(_SC_PAGE_SIZE); +#elif defined HAVE_GETPAGESIZE + pagesize = getpagesize(); +#else + pagesize = 4096; /* good guess */ +#endif + } + + errno = 0; + + /* Always force the allocated size to be a multiple of pagesize */ + if(initialsize == 0) initialsize = pagesize; + if((initialsize % pagesize) != 0) + initialsize += (pagesize - (initialsize % pagesize)); + + nciop = (ncio* )calloc(1,sizeof(ncio)); + if(nciop == NULL) {status = NC_ENOMEM; goto fail;} + + nciop->ioflags = ioflags; + *((int*)&nciop->fd) = -1; /* caller will fix */ + + *((char**)&nciop->path) = strdup(path); + if(nciop->path == NULL) {status = NC_ENOMEM; goto fail;} + + *((ncio_relfunc**)&nciop->rel) = mmapio_rel; + *((ncio_getfunc**)&nciop->get) = mmapio_get; + *((ncio_movefunc**)&nciop->move) = mmapio_move; + *((ncio_syncfunc**)&nciop->sync) = mmapio_sync; + *((ncio_filesizefunc**)&nciop->filesize) = mmapio_filesize; + *((ncio_pad_lengthfunc**)&nciop->pad_length) = mmapio_pad_length; + *((ncio_closefunc**)&nciop->close) = mmapio_close; + + mmapio = (NCMMAPIO*)calloc(1,sizeof(NCMMAPIO)); + if(mmapio == NULL) {status = NC_ENOMEM; goto fail;} + *((void* *)&nciop->pvt) = mmapio; + + mmapio->alloc = initialsize; + + mmapio->memory = NULL; + mmapio->size = 0; + mmapio->pos = 0; + mmapio->persist = fIsSet(ioflags,NC_WRITE); + + /* See if ok to use mmap */ + if(sizeof(void*) < 8 && fIsSet(ioflags,NC_64BIT_OFFSET)) + return NC_DISKLESS; /* cannot support */ + mmapio->mapfd = -1; + + if(nciopp) *nciopp = nciop; + if(mmapp) *mmapp = mmapio; + +done: + if(openfd >= 0) close(openfd); + return status; + +fail: + if(nciop != NULL) { + if(nciop->path != NULL) free((char*)nciop->path); + } + goto done; +} + +/* Create a file, and the ncio struct to go with it. This function is + only called from nc__create_mp. + + path - path of file to create. + ioflags - flags from nc_create + initialsz - From the netcdf man page: "The argument + Iinitialsize sets the initial size of the file at creation time." + igeto - + igetsz - + sizehintp - the size of a page of data for buffered reads and writes. + nciopp - pointer to a pointer that will get location of newly + created and inited ncio struct. + mempp - pointer to pointer to the initial memory read. +*/ +int +mmapio_create(const char* path, int ioflags, + size_t initialsz, + off_t igeto, size_t igetsz, size_t* sizehintp, + ncio* *nciopp, void** const mempp) +{ + ncio* nciop; + int fd; + int status; + NCMMAPIO* mmapio = NULL; + int persist = (ioflags & NC_WRITE?1:0); + int oflags; + + if(path == NULL ||* path == 0) + return NC_EINVAL; + + /* For diskless open has, the file must be classic version 1 or 2.*/ + if(fIsSet(ioflags,NC_NETCDF4)) + return NC_EDISKLESS; /* violates constraints */ + + status = mmapio_new(path, ioflags, initialsz, &nciop, &mmapio); + if(status != NC_NOERR) + return status; + mmapio->size = 0; + + if(!persist) { + mmapio->mapfd = -1; + mmapio->memory = (char*)mmap(NULL,mmapio->alloc, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, + mmapio->mapfd,0); + {mmapio->memory[0] = 0;} /* test writing of the mmap'd memory */ + } else { /*persist */ + /* Open the file, but make sure we can write it if needed */ + oflags = (persist ? O_RDWR : O_RDONLY); +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif + oflags |= (O_CREAT|O_TRUNC); + if(fIsSet(ioflags,NC_NOCLOBBER)) + oflags |= O_EXCL; +#ifdef vms + fd = open(path, oflags, 0, "ctx=stm"); +#else + fd = open(path, oflags, OPENMODE); +#endif + if(fd < 0) {status = errno; goto unwind_open;} + mmapio->mapfd = fd; + + { /* Cause the output file to have enough allocated space */ + lseek(fd,mmapio->alloc-1,SEEK_SET); /* cause file to appear */ + write(fd,"",mmapio->alloc); + lseek(fd,0,SEEK_SET); /* rewind */ + } + mmapio->memory = (char*)mmap(NULL,mmapio->alloc, + PROT_READ|PROT_WRITE, + MAP_SHARED, + mmapio->mapfd,0); + if(mmapio->memory == NULL) { + return NC_EDISKLESS; + } + } /*!persist*/ + +#ifdef DEBUG +fprintf(stderr,"mmap_create: initial memory: %lu/%lu\n",(unsigned long)mmapio->memory,(unsigned long)mmapio->alloc); +#endif + + fd = nc__pseudofd(); + *((int* )&nciop->fd) = fd; + + fSet(nciop->ioflags, NC_WRITE); + + if(igetsz != 0) + { + status = nciop->get(nciop, + igeto, igetsz, + RGN_WRITE, + mempp); + if(status != NC_NOERR) + goto unwind_open; + } + + /* Pick a default sizehint */ + if(sizehintp) *sizehintp = pagesize; + + *nciopp = nciop; + return NC_NOERR; + +unwind_open: + mmapio_close(nciop,1); + return status; +} + +/* This function opens the data file. It is only called from nc.c, + from nc__open_mp and nc_delete_mp. + + path - path of data file. + ioflags - flags passed into nc_open. + igeto - looks like this function can do an initial page get, and + igeto is going to be the offset for that. But it appears to be + unused + igetsz - the size in bytes of initial page get (a.k.a. extent). Not + ever used in the library. + sizehintp - the size of a page of data for buffered reads and writes. + nciopp - pointer to pointer that will get address of newly created + and inited ncio struct. + mempp - pointer to pointer to the initial memory read. +*/ +int +mmapio_open(const char* path, + int ioflags, + off_t igeto, size_t igetsz, size_t* sizehintp, + ncio* *nciopp, void** const mempp) +{ + ncio* nciop; + int fd; + int status; + int persist = (fIsSet(ioflags,NC_WRITE)?1:0); + int oflags; + NCMMAPIO* mmapio = NULL; + size_t sizehint; + off_t filesize; + + if(path == NULL ||* path == 0) + return EINVAL; + + assert(sizehintp != NULL); + sizehint = *sizehintp; + + /* Open the file, but make sure we can write it if needed */ + oflags = (persist ? O_RDWR : O_RDONLY); +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif + oflags |= O_EXCL; +#ifdef vms + fd = open(path, oflags, 0, "ctx=stm"); +#else + fd = open(path, oflags, OPENMODE); +#endif + if(fd < 0) {status = errno; goto unwind_open;} + + /* get current filesize = max(|file|,initialize)*/ + filesize = lseek(fd,0,SEEK_END); + if(filesize < 0) {status = errno; goto unwind_open;} + /* move pointer back to beginning of file */ + (void)lseek(fd,0,SEEK_SET); + if(filesize < (off_t)sizehint) + filesize = (off_t)sizehint; + + status = mmapio_new(path, ioflags, filesize, &nciop, &mmapio); + if(status != NC_NOERR) + return status; + mmapio->size = filesize; + + mmapio->mapfd = fd; + mmapio->memory = (char*)mmap(NULL,mmapio->alloc, + persist?(PROT_READ|PROT_WRITE):(PROT_READ), + MAP_SHARED, + mmapio->mapfd,0); +#ifdef DEBUG +fprintf(stderr,"mmapio_open: initial memory: %lu/%lu\n",(unsigned long)mmapio->memory,(unsigned long)mmapio->alloc); +#endif + + /* Use half the filesize as the blocksize */ + sizehint = filesize/2; + + fd = nc__pseudofd(); + *((int* )&nciop->fd) = fd; + + if(igetsz != 0) + { + status = nciop->get(nciop, + igeto, igetsz, + 0, + mempp); + if(status != NC_NOERR) + goto unwind_open; + } + + *sizehintp = sizehint; + *nciopp = nciop; + return NC_NOERR; + +unwind_open: + mmapio_close(nciop,0); + return status; +} + + +/* + * Get file size in bytes. + */ +static int +mmapio_filesize(ncio* nciop, off_t* filesizep) +{ + NCMMAPIO* mmapio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + mmapio = (NCMMAPIO*)nciop->pvt; + if(filesizep != NULL) *filesizep = mmapio->size; + return NC_NOERR; +} + +/* + * Sync any changes to disk, then truncate or extend file so its size + * is length. This is only intended to be called before close, if the + * file is open for writing and the actual size does not match the + * calculated size, perhaps as the result of having been previously + * written in NOFILL mode. + */ +static int +mmapio_pad_length(ncio* nciop, off_t length) +{ + NCMMAPIO* mmapio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + mmapio = (NCMMAPIO*)nciop->pvt; + + if(!fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file*/ + + if(mmapio->locked > 0) + return NC_EDISKLESS; + + if(length > mmapio->alloc) { + /* Realloc the allocated memory to a multiple of the pagesize*/ + off_t newsize = length; + void* newmem = NULL; + /* Round to a multiple of pagesize */ + if((newsize % pagesize) != 0) + newsize += (pagesize - (newsize % pagesize)); + + /* Force file size to be properly extended */ + { /* Cause the output file to have enough allocated space */ + off_t pos = lseek(mmapio->mapfd,0,SEEK_CUR); /* save current position*/ + /* cause file to be extended in size */ + lseek(mmapio->mapfd,newsize-1,SEEK_SET); + write(mmapio->mapfd,"",mmapio->alloc); + lseek(mmapio->mapfd,pos,SEEK_SET); /* reset position */ + } + + newmem = (char*)mremap(mmapio->memory,mmapio->alloc,newsize,MREMAP_MAYMOVE); + if(newmem == NULL) return NC_ENOMEM; + +#ifdef DEBUG +fprintf(stderr,"realloc: %lu/%lu -> %lu/%lu\n", +(unsigned long)mmapio->memory,(unsigned long)mmapio->alloc, +(unsigned long)newmem,(unsigned long)newsize); +#endif + mmapio->memory = newmem; + mmapio->alloc = newsize; + } + mmapio->size = length; + return NC_NOERR; +} + +/* Write out any dirty buffers to disk and + ensure that next read will get data from disk. + Sync any changes, then close the open file associated with the ncio + struct, and free its memory. + nciop - pointer to ncio to close. + doUnlink - if true, unlink file +*/ + +static int +mmapio_close(ncio* nciop, int doUnlink) +{ + int status = NC_NOERR; + NCMMAPIO* mmapio; + if(nciop == NULL || nciop->pvt == NULL) return NC_NOERR; + + mmapio = (NCMMAPIO*)nciop->pvt; + assert(mmapio != NULL); + + /* Since we are using mmap, persisting to a file should be automatic */ + status = munmap(mmapio->memory,mmapio->alloc); + mmapio->memory = NULL; /* so we do not try to free it */ + + /* Close file if it was open */ + if(mmapio->mapfd >= 0) + close(mmapio->mapfd); + + /* do cleanup */ + if(mmapio != NULL) free(mmapio); + if(nciop->path != NULL) free((char*)nciop->path); + free(nciop); + return status; +} + +static int +guarantee(ncio* nciop, off_t endpoint) +{ + NCMMAPIO* mmapio = (NCMMAPIO*)nciop->pvt; + if(endpoint > mmapio->alloc) { + /* extend the allocated memory and size */ + int status = mmapio_pad_length(nciop,endpoint); + if(status != NC_NOERR) return status; + } + if(mmapio->size < endpoint) + mmapio->size = endpoint; + return NC_NOERR; +} + +/* + * Request that the region (offset, extent) + * be made available through *vpp. + */ +static int +mmapio_get(ncio* const nciop, off_t offset, size_t extent, int rflags, void** const vpp) +{ + int status = NC_NOERR; + NCMMAPIO* mmapio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + mmapio = (NCMMAPIO*)nciop->pvt; + status = guarantee(nciop, offset+extent); + mmapio->locked++; + if(status != NC_NOERR) return status; + if(vpp) *vpp = mmapio->memory+offset; + return NC_NOERR; +} + +/* + * Like memmove(), safely move possibly overlapping data. + */ +static int +mmapio_move(ncio* const nciop, off_t to, off_t from, size_t nbytes, int ignored) +{ + int status = NC_NOERR; + NCMMAPIO* mmapio; + + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + mmapio = (NCMMAPIO*)nciop->pvt; + if(from < to) { + /* extend if "to" is not currently allocated */ + status = guarantee(nciop,to+nbytes); + if(status != NC_NOERR) return status; + } + /* check for overlap */ + if((to + nbytes) > from || (from + nbytes) > to) { + /* Ranges overlap */ +#ifdef HAVE_MEMMOVE + memmove((void*)(mmapio->memory+to),(void*)(mmapio->memory+from),nbytes); +#else + off_t overlap; + off_t nbytes1; + if((from + nbytes) > to) { + overlap = ((from + nbytes) - to); /* # bytes of overlap */ + nbytes1 = (nbytes - overlap); /* # bytes of non-overlap */ + /* move the non-overlapping part */ + memcpy((void*)(mmapio->memory+(to+overlap)), + (void*)(mmapio->memory+(from+overlap)), + nbytes1); + /* move the overlapping part */ + memcpy((void*)(mmapio->memory+to), + (void*)(mmapio->memory+from), + overlap); + } else { /*((to + nbytes) > from) */ + overlap = ((to + nbytes) - from); /* # bytes of overlap */ + nbytes1 = (nbytes - overlap); /* # bytes of non-overlap */ + /* move the non-overlapping part */ + memcpy((void*)(mmapio->memory+to), + (void*)(mmapio->memory+from), + nbytes1); + /* move the overlapping part */ + memcpy((void*)(mmapio->memory+(to+nbytes1)), + (void*)(mmapio->memory+(from+nbytes1)), + overlap); + } +#endif + } else {/* no overlap */ + memcpy((void*)(mmapio->memory+to),(void*)(mmapio->memory+from),nbytes); + } + return status; +} + +static int +mmapio_rel(ncio* const nciop, off_t offset, int rflags) +{ + NCMMAPIO* mmapio; + if(nciop == NULL || nciop->pvt == NULL) return NC_EINVAL; + mmapio = (NCMMAPIO*)nciop->pvt; + mmapio->locked--; + return NC_NOERR; /* do nothing */ +} + +/* + * Write out any dirty buffers to disk and + * ensure that next read will get data from disk. + */ +static int +mmapio_sync(ncio* const nciop) +{ + return NC_NOERR; /* do nothing */ +} diff --git a/extern/src_netcdf4/nc.c b/extern/src_netcdf4/nc.c new file mode 100644 index 0000000..c11f922 --- /dev/null +++ b/extern/src_netcdf4/nc.c @@ -0,0 +1,1559 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ + +#include +#include +#include +#include +#if defined(LOCKNUMREC) /* && _CRAYMPP */ +# include +# include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "nc.h" +#include "ncdispatch.h" +#include "nc3dispatch.h" +#include "rnd.h" +#include "ncx.h" + +/* This is the default create format for nc_create and nc__create. */ +int default_create_format = NC_FORMAT_CLASSIC; + +/* These have to do with version numbers. */ +#define MAGIC_NUM_LEN 4 +#define VER_CLASSIC 1 +#define VER_64BIT_OFFSET 2 +#define VER_HDF5 3 + +int +NC_check_id(int ncid, NC **ncpp) +{ + NC* nc = find_in_NCList(ncid); + if(nc == NULL) return NC_EBADID; + if(ncpp) *ncpp = nc; + return NC_NOERR; +} + +static void +free_NC(NC *ncp) +{ + if(ncp == NULL) + return; + free_NC_dimarrayV(&ncp->dims); + free_NC_attrarrayV(&ncp->attrs); + free_NC_vararrayV(&ncp->vars); + if (ncp->path) + free(ncp->path); +#if _CRAYMPP && defined(LOCKNUMREC) + shfree(ncp); +#else + free(ncp); +#endif /* _CRAYMPP && LOCKNUMREC */ +} + +static NC * +new_NC(const size_t *chunkp, NC_Dispatch* dispatch) +{ + NC *ncp; + int stat = dispatch->new_nc(&ncp); + if(stat) return NULL; + ncp->xsz = MIN_NC_XSZ; + assert(ncp->xsz == ncx_len_NC(ncp,0)); + ncp->chunk = chunkp != NULL ? *chunkp : NC_SIZEHINT_DEFAULT; + return ncp; +} + +static NC * +dup_NC(const NC *ref) +{ + NC *ncp; + int stat = ref->dispatch->new_nc(&ncp); + if(stat) return NULL; + if(ncp == NULL) + return NULL; + + if(dup_NC_dimarrayV(&ncp->dims, &ref->dims) != NC_NOERR) + goto err; + if(dup_NC_attrarrayV(&ncp->attrs, &ref->attrs) != NC_NOERR) + goto err; + if(dup_NC_vararrayV(&ncp->vars, &ref->vars) != NC_NOERR) + goto err; + + ncp->xsz = ref->xsz; + ncp->begin_var = ref->begin_var; + ncp->begin_rec = ref->begin_rec; + ncp->recsize = ref->recsize; + NC_set_numrecs(ncp, NC_get_numrecs(ref)); + return ncp; +err: + free_NC(ncp); + return NULL; +} + + +/* + * Verify that this is a user nc_type + * Formerly +NCcktype() + * Sense of the return is changed. + */ +int +nc_cktype(nc_type type) +{ + switch((int)type){ + case NC_BYTE: + case NC_CHAR: + case NC_SHORT: + case NC_INT: + case NC_FLOAT: + case NC_DOUBLE: + return(NC_NOERR); + } + return(NC_EBADTYPE); +} + + +/* + * How many objects of 'type' + * will fit into xbufsize? + */ +size_t +ncx_howmany(nc_type type, size_t xbufsize) +{ + switch(type){ + case NC_BYTE: + case NC_CHAR: + return xbufsize; + case NC_SHORT: + return xbufsize/X_SIZEOF_SHORT; + case NC_INT: + return xbufsize/X_SIZEOF_INT; + case NC_FLOAT: + return xbufsize/X_SIZEOF_FLOAT; + case NC_DOUBLE: + return xbufsize/X_SIZEOF_DOUBLE; + default: + assert("ncx_howmany: Bad type" == 0); + return(0); + } +} + +#define D_RNDUP(x, align) _RNDUP(x, (off_t)(align)) + +/* + * Compute each variable's 'begin' offset, + * update 'begin_rec' as well. + */ +static int +NC_begins(NC *ncp, + size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align) +{ + size_t ii; + int sizeof_off_t; + off_t index = 0; + NC_var **vpp; + NC_var *last = NULL; + + if(v_align == NC_ALIGN_CHUNK) + v_align = ncp->chunk; + if(r_align == NC_ALIGN_CHUNK) + r_align = ncp->chunk; + + if (fIsSet(ncp->flags, NC_64BIT_OFFSET)) { + sizeof_off_t = 8; + } else { + sizeof_off_t = 4; + } + + ncp->xsz = ncx_len_NC(ncp,sizeof_off_t); + + if(ncp->vars.nelems == 0) + return NC_NOERR; + + /* only (re)calculate begin_var if there is not sufficient space in header + or start of non-record variables is not aligned as requested by valign */ + if (ncp->begin_var < ncp->xsz + h_minfree || + ncp->begin_var != D_RNDUP(ncp->begin_var, v_align) ) + { + index = (off_t) ncp->xsz; + ncp->begin_var = D_RNDUP(index, v_align); + if(ncp->begin_var < index + h_minfree) + { + ncp->begin_var = D_RNDUP(index + (off_t)h_minfree, v_align); + } + } + index = ncp->begin_var; + + /* loop thru vars, first pass is for the 'non-record' vars */ + vpp = ncp->vars.value; + for(ii = 0; ii < ncp->vars.nelems ; ii++, vpp++) + { + if( IS_RECVAR(*vpp) ) + { + /* skip record variables on this pass */ + continue; + } +#if 0 +fprintf(stderr, " VAR %d %s: %ld\n", ii, (*vpp)->name->cp, (long)index); +#endif + if( sizeof_off_t == 4 && (index > X_OFF_MAX || index < 0) ) + { + return NC_EVARSIZE; + } + (*vpp)->begin = index; + index += (*vpp)->len; + } + + /* only (re)calculate begin_rec if there is not sufficient + space at end of non-record variables or if start of record + variables is not aligned as requested by r_align */ + if (ncp->begin_rec < index + v_minfree || + ncp->begin_rec != D_RNDUP(ncp->begin_rec, r_align) ) + { + ncp->begin_rec = D_RNDUP(index, r_align); + if(ncp->begin_rec < index + v_minfree) + { + ncp->begin_rec = D_RNDUP(index + (off_t)v_minfree, r_align); + } + } + index = ncp->begin_rec; + + ncp->recsize = 0; + + /* loop thru vars, second pass is for the 'record' vars */ + vpp = (NC_var **)ncp->vars.value; + for(ii = 0; ii < ncp->vars.nelems; ii++, vpp++) + { + if( !IS_RECVAR(*vpp) ) + { + /* skip non-record variables on this pass */ + continue; + } + +#if 0 +fprintf(stderr, " REC %d %s: %ld\n", ii, (*vpp)->name->cp, (long)index); +#endif + if( sizeof_off_t == 4 && (index > X_OFF_MAX || index < 0) ) + { + return NC_EVARSIZE; + } + (*vpp)->begin = index; + index += (*vpp)->len; + /* check if record size must fit in 32-bits */ +#if SIZEOF_OFF_T == SIZEOF_SIZE_T && SIZEOF_SIZE_T == 4 + if( ncp->recsize > X_UINT_MAX - (*vpp)->len ) + { + return NC_EVARSIZE; + } +#endif + if((*vpp)->len != UINT32_MAX) /* flag for vars >= 2**32 bytes */ + ncp->recsize += (*vpp)->len; + last = (*vpp); + } + + /* + * for special case of + */ + if(last != NULL) { + if(ncp->recsize == last->len) { /* exactly one record variable, pack value */ + ncp->recsize = *last->dsizes * last->xsz; + } else if(last->len == UINT32_MAX) { /* huge last record variable */ + ncp->recsize += *last->dsizes * last->xsz; + } + } + if(NC_IsNew(ncp)) + NC_set_numrecs(ncp, 0); + return NC_NOERR; +} + + +/* + * Read just the numrecs member. + * (A relatively expensive way to do things.) + */ +int +read_numrecs(NC *ncp) +{ + int status = NC_NOERR; + const void *xp = NULL; + size_t nrecs = NC_get_numrecs(ncp); + + assert(!NC_indef(ncp)); + +#define NC_NUMRECS_OFFSET 4 +#define NC_NUMRECS_EXTENT 4 + status = ncio_get(ncp->nciop, + NC_NUMRECS_OFFSET, NC_NUMRECS_EXTENT, 0, (void **)&xp); + /* cast away const */ + if(status != NC_NOERR) + return status; + + status = ncx_get_size_t(&xp, &nrecs); + + (void) ncio_rel(ncp->nciop, NC_NUMRECS_OFFSET, 0); + + if(status == NC_NOERR) + { + NC_set_numrecs(ncp, nrecs); + fClr(ncp->flags, NC_NDIRTY); + } + + return status; +} + + +/* + * Write out just the numrecs member. + * (A relatively expensive way to do things.) + */ +int +write_numrecs(NC *ncp) +{ + int status = NC_NOERR; + void *xp = NULL; + + assert(!NC_readonly(ncp)); + assert(!NC_indef(ncp)); + + status = ncio_get(ncp->nciop, + NC_NUMRECS_OFFSET, NC_NUMRECS_EXTENT, RGN_WRITE, &xp); + if(status != NC_NOERR) + return status; + + { + const size_t nrecs = NC_get_numrecs(ncp); + status = ncx_put_size_t(&xp, &nrecs); + } + + (void) ncio_rel(ncp->nciop, NC_NUMRECS_OFFSET, RGN_MODIFIED); + + if(status == NC_NOERR) + fClr(ncp->flags, NC_NDIRTY); + + return status; +} + + +/* + * Read in the header + * It is expensive. + */ +static int +read_NC(NC *ncp) +{ + int status = NC_NOERR; + + free_NC_dimarrayV(&ncp->dims); + free_NC_attrarrayV(&ncp->attrs); + free_NC_vararrayV(&ncp->vars); + + status = nc_get_NC(ncp); + + if(status == NC_NOERR) + fClr(ncp->flags, NC_NDIRTY | NC_HDIRTY); + + return status; +} + + +/* + * Write out the header + */ +static int +write_NC(NC *ncp) +{ + int status = NC_NOERR; + + assert(!NC_readonly(ncp)); + + status = ncx_put_NC(ncp, NULL, 0, 0); + + if(status == NC_NOERR) + fClr(ncp->flags, NC_NDIRTY | NC_HDIRTY); + + return status; +} + + +/* + * Write the header or the numrecs if necessary. + */ +int +NC_sync(NC *ncp) +{ + assert(!NC_readonly(ncp)); + + if(NC_hdirty(ncp)) + { + return write_NC(ncp); + } + /* else */ + + if(NC_ndirty(ncp)) + { + return write_numrecs(ncp); + } + /* else */ + + return NC_NOERR; +} + + +/* + * Initialize the 'non-record' variables. + */ +static int +fillerup(NC *ncp) +{ + int status = NC_NOERR; + size_t ii; + NC_var **varpp; + + assert(!NC_readonly(ncp)); + assert(NC_dofill(ncp)); + + /* loop thru vars */ + varpp = ncp->vars.value; + for(ii = 0; ii < ncp->vars.nelems; ii++, varpp++) + { + if(IS_RECVAR(*varpp)) + { + /* skip record variables */ + continue; + } + + status = fill_NC_var(ncp, *varpp, (*varpp)->len, 0); + if(status != NC_NOERR) + break; + } + return status; +} + +/* Begin endef */ + +/* + */ +static int +fill_added_recs(NC *gnu, NC *old) +{ + NC_var ** const gnu_varpp = (NC_var **)gnu->vars.value; + + const int old_nrecs = (int) NC_get_numrecs(old); + int recno = 0; + NC_var **vpp = gnu_varpp; + NC_var *const *const end = &vpp[gnu->vars.nelems]; + int numrecvars = 0; + + /* Determine if there is only one record variable. If so, we + must treat as a special case because there's no record padding */ + for(; vpp < end; vpp++) { + if(IS_RECVAR(*vpp)) { + numrecvars++; + } + } + + for(; recno < old_nrecs; recno++) + { + int varid = (int)old->vars.nelems; + for(; varid < (int)gnu->vars.nelems; varid++) + { + const NC_var *const gnu_varp = *(gnu_varpp + varid); + if(!IS_RECVAR(gnu_varp)) + { + /* skip non-record variables */ + continue; + } + /* else */ + { + size_t varsize = numrecvars == 1 ? gnu->recsize : gnu_varp->len; + const int status = fill_NC_var(gnu, gnu_varp, varsize, recno); + if(status != NC_NOERR) + return status; + } + } + } + return NC_NOERR; +} + +/* + */ +static int +fill_added(NC *gnu, NC *old) +{ + NC_var ** const gnu_varpp = (NC_var **)gnu->vars.value; + int varid = (int)old->vars.nelems; + + for(; varid < (int)gnu->vars.nelems; varid++) + { + const NC_var *const gnu_varp = *(gnu_varpp + varid); + if(IS_RECVAR(gnu_varp)) + { + /* skip record variables */ + continue; + } + /* else */ + { + const int status = fill_NC_var(gnu, gnu_varp, gnu_varp->len, 0); + if(status != NC_NOERR) + return status; + } + } + + return NC_NOERR; +} + + +/* + * Move the records "out". + * Fill as needed. + */ +static int +move_recs_r(NC *gnu, NC *old) +{ + int status; + int recno; + int varid; + NC_var **gnu_varpp = (NC_var **)gnu->vars.value; + NC_var **old_varpp = (NC_var **)old->vars.value; + NC_var *gnu_varp; + NC_var *old_varp; + off_t gnu_off; + off_t old_off; + const size_t old_nrecs = NC_get_numrecs(old); + + /* Don't parallelize this loop */ + for(recno = (int)old_nrecs -1; recno >= 0; recno--) + { + /* Don't parallelize this loop */ + for(varid = (int)old->vars.nelems -1; varid >= 0; varid--) + { + gnu_varp = *(gnu_varpp + varid); + if(!IS_RECVAR(gnu_varp)) + { + /* skip non-record variables on this pass */ + continue; + } + /* else */ + + /* else, a pre-existing variable */ + old_varp = *(old_varpp + varid); + gnu_off = gnu_varp->begin + (off_t)(gnu->recsize * recno); + old_off = old_varp->begin + (off_t)(old->recsize * recno); + + if(gnu_off == old_off) + continue; /* nothing to do */ + + assert(gnu_off > old_off); + + status = ncio_move(gnu->nciop, gnu_off, old_off, + old_varp->len, 0); + + if(status != NC_NOERR) + return status; + + } + } + + NC_set_numrecs(gnu, old_nrecs); + + return NC_NOERR; +} + + +/* + * Move the "non record" variables "out". + * Fill as needed. + */ +static int +move_vars_r(NC *gnu, NC *old) +{ + int status; + int varid; + NC_var **gnu_varpp = (NC_var **)gnu->vars.value; + NC_var **old_varpp = (NC_var **)old->vars.value; + NC_var *gnu_varp; + NC_var *old_varp; + off_t gnu_off; + off_t old_off; + + /* Don't parallelize this loop */ + for(varid = (int)old->vars.nelems -1; + varid >= 0; varid--) + { + gnu_varp = *(gnu_varpp + varid); + if(IS_RECVAR(gnu_varp)) + { + /* skip record variables on this pass */ + continue; + } + /* else */ + + old_varp = *(old_varpp + varid); + gnu_off = gnu_varp->begin; + old_off = old_varp->begin; + + if(gnu_off == old_off) + continue; /* nothing to do */ + + assert(gnu_off > old_off); + + status = ncio_move(gnu->nciop, gnu_off, old_off, + old_varp->len, 0); + + if(status != NC_NOERR) + return status; + + } + + return NC_NOERR; +} + + +/* + * Given a valid ncp, return NC_EVARSIZE if any variable has a bad len + * (product of non-rec dim sizes too large), else return NC_NOERR. + */ +static int +NC_check_vlens(NC *ncp) +{ + NC_var **vpp; + /* maximum permitted variable size (or size of one record's worth + of a record variable) in bytes. This is different for format 1 + and format 2. */ + size_t vlen_max; + size_t ii; + size_t large_vars_count; + size_t rec_vars_count; + int last = 0; + + if(ncp->vars.nelems == 0) + return NC_NOERR; + + if ((ncp->flags & NC_64BIT_OFFSET) && sizeof(off_t) > 4) { + /* CDF2 format and LFS */ + vlen_max = X_UINT_MAX - 3; /* "- 3" handles rounded-up size */ + } else { + /* CDF1 format */ + vlen_max = X_INT_MAX - 3; + } + /* Loop through vars, first pass is for non-record variables. */ + large_vars_count = 0; + rec_vars_count = 0; + vpp = ncp->vars.value; + for (ii = 0; ii < ncp->vars.nelems; ii++, vpp++) { + if( !IS_RECVAR(*vpp) ) { + last = 0; + if( NC_check_vlen(*vpp, vlen_max) == 0 ) { + large_vars_count++; + last = 1; + } + } else { + rec_vars_count++; + } + } + /* OK if last non-record variable size too large, since not used to + compute an offset */ + if( large_vars_count > 1) { /* only one "too-large" variable allowed */ + return NC_EVARSIZE; + } + /* and it has to be the last one */ + if( large_vars_count == 1 && last == 0) { + return NC_EVARSIZE; + } + if( rec_vars_count > 0 ) { + /* and if it's the last one, there can't be any record variables */ + if( large_vars_count == 1 && last == 1) { + return NC_EVARSIZE; + } + /* Loop through vars, second pass is for record variables. */ + large_vars_count = 0; + vpp = ncp->vars.value; + for (ii = 0; ii < ncp->vars.nelems; ii++, vpp++) { + if( IS_RECVAR(*vpp) ) { + last = 0; + if( NC_check_vlen(*vpp, vlen_max) == 0 ) { + large_vars_count++; + last = 1; + } + } + } + /* OK if last record variable size too large, since not used to + compute an offset */ + if( large_vars_count > 1) { /* only one "too-large" variable allowed */ + return NC_EVARSIZE; + } + /* and it has to be the last one */ + if( large_vars_count == 1 && last == 0) { + return NC_EVARSIZE; + } + } + return NC_NOERR; +} + + +/* + * End define mode. + * Common code for ncendef, ncclose(endef) + * Flushes I/O buffers. + */ +static int +NC_endef(NC *ncp, + size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align) +{ + int status = NC_NOERR; + + assert(!NC_readonly(ncp)); + assert(NC_indef(ncp)); + + status = NC_check_vlens(ncp); + if(status != NC_NOERR) + return status; + status = NC_begins(ncp, h_minfree, v_align, v_minfree, r_align); + if(status != NC_NOERR) + return status; + + if(ncp->old != NULL) + { + /* a plain redef, not a create */ + assert(!NC_IsNew(ncp)); + assert(fIsSet(ncp->flags, NC_INDEF)); + assert(ncp->begin_rec >= ncp->old->begin_rec); + assert(ncp->begin_var >= ncp->old->begin_var); + + if(ncp->vars.nelems != 0) + { + if(ncp->begin_rec > ncp->old->begin_rec) + { + status = move_recs_r(ncp, ncp->old); + if(status != NC_NOERR) + return status; + if(ncp->begin_var > ncp->old->begin_var) + { + status = move_vars_r(ncp, ncp->old); + if(status != NC_NOERR) + return status; + } + /* else if (ncp->begin_var == ncp->old->begin_var) { NOOP } */ + } + else + { /* Even if (ncp->begin_rec == ncp->old->begin_rec) + and (ncp->begin_var == ncp->old->begin_var) + might still have added a new record variable */ + if(ncp->recsize > ncp->old->recsize) + { + status = move_recs_r(ncp, ncp->old); + if(status != NC_NOERR) + return status; + } + } + } + } + + status = write_NC(ncp); + if(status != NC_NOERR) + return status; + + if(NC_dofill(ncp)) + { + if(NC_IsNew(ncp)) + { + status = fillerup(ncp); + if(status != NC_NOERR) + return status; + + } + else if(ncp->vars.nelems > ncp->old->vars.nelems) + { + status = fill_added(ncp, ncp->old); + if(status != NC_NOERR) + return status; + status = fill_added_recs(ncp, ncp->old); + if(status != NC_NOERR) + return status; + } + } + + if(ncp->old != NULL) + { + free_NC(ncp->old); + ncp->old = NULL; + } + + fClr(ncp->flags, NC_CREAT | NC_INDEF); + + return ncio_sync(ncp->nciop); +} + +#ifdef LOCKNUMREC +static int +NC_init_pe(NC *ncp, int basepe) { + if (basepe < 0 || basepe >= _num_pes()) { + return NC_EINVAL; /* invalid base pe */ + } + /* initialize common values */ + ncp->lock[LOCKNUMREC_VALUE] = 0; + ncp->lock[LOCKNUMREC_LOCK] = 0; + ncp->lock[LOCKNUMREC_SERVING] = 0; + ncp->lock[LOCKNUMREC_BASEPE] = basepe; + return NC_NOERR; +} +#endif + + +/* + * Compute the expected size of the file. + */ +int +NC_calcsize(const NC *ncp, off_t *calcsizep) +{ + NC_var **vpp = (NC_var **)ncp->vars.value; + NC_var *const *const end = &vpp[ncp->vars.nelems]; + NC_var *last_fix = NULL; /* last "non-record" var */ + int numrecvars = 0; /* number of record variables */ + + if(ncp->vars.nelems == 0) { /* no non-record variables and + no record variables */ + *calcsizep = ncp->xsz; /* size of header */ + return NC_NOERR; + } + + for( /*NADA*/; vpp < end; vpp++) { + if(IS_RECVAR(*vpp)) { + numrecvars++; + } else { + last_fix = *vpp; + } + } + + if(numrecvars == 0) { + off_t varsize; + assert(last_fix != NULL); + varsize = last_fix->len; + if(last_fix->len == X_UINT_MAX) { /* huge last fixed var */ + int i; + varsize = 1; + for(i = 0; i < last_fix->ndims; i++ ) { + varsize *= last_fix->shape[i]; + } + } + *calcsizep = last_fix->begin + varsize; + /*last_var = last_fix;*/ + } else { /* we have at least one record variable */ + *calcsizep = ncp->begin_rec + ncp->numrecs * ncp->recsize; + } + + return NC_NOERR; +} + +/* Public */ + +int NC3_new_nc(NC** ncpp) +{ + NC *ncp; + +#if _CRAYMPP && defined(LOCKNUMREC) + ncp = (NC *) shmalloc(sizeof(NC)); +#else + ncp = (NC *) malloc(sizeof(NC)); +#endif /* _CRAYMPP && LOCKNUMREC */ + if(ncp == NULL) + return NC_ENOMEM; + (void) memset(ncp, 0, sizeof(NC)); + + ncp->xsz = MIN_NC_XSZ; + assert(ncp->xsz == ncx_len_NC(ncp,0)); + + if(ncpp) *ncpp = ncp; + return NC_NOERR; + +} + +/* WARNING: SIGNATURE CHANGE */ +int +NC3_create(const char *path, int ioflags, + size_t initialsz, int basepe, + size_t *chunksizehintp, + int use_parallel, void* parameters, + NC_Dispatch* dispatch, NC** ncpp) +{ + NC *ncp; + int status; + void *xp = NULL; + int sizeof_off_t = 0; + +#if ALWAYS_NC_SHARE /* DEBUG */ + fSet(ioflags, NC_SHARE); +#endif + + ncp = new_NC(chunksizehintp,dispatch); + if(ncp == NULL) + return NC_ENOMEM; + +#if defined(LOCKNUMREC) /* && _CRAYMPP */ + if (status = NC_init_pe(ncp, basepe)) { + return status; + } +#else + /* + * !_CRAYMPP, only pe 0 is valid + */ + if(basepe != 0) + return NC_EINVAL; +#endif + + assert(ncp->flags == 0); + + /* Apply default create format. */ + if (default_create_format == NC_FORMAT_64BIT) + ioflags |= NC_64BIT_OFFSET; + + if (fIsSet(ioflags, NC_64BIT_OFFSET)) { + fSet(ncp->flags, NC_64BIT_OFFSET); + sizeof_off_t = 8; + } else { + sizeof_off_t = 4; + } + + assert(ncp->xsz == ncx_len_NC(ncp,sizeof_off_t)); + + status = ncio_create(path, ioflags, initialsz, + 0, ncp->xsz, &ncp->chunk, + &ncp->nciop, &xp); + if(status != NC_NOERR) + { + /* translate error status */ + if(status == EEXIST) + status = NC_EEXIST; + goto unwind_alloc; + } + + fSet(ncp->flags, NC_CREAT); + + if(fIsSet(ncp->nciop->ioflags, NC_SHARE)) + { + /* + * NC_SHARE implies sync up the number of records as well. + * (File format version one.) + * Note that other header changes are not shared + * automatically. Some sort of IPC (external to this package) + * would be used to trigger a call to nc_sync(). + */ + fSet(ncp->flags, NC_NSYNC); + } + + status = ncx_put_NC(ncp, &xp, sizeof_off_t, ncp->xsz); + if(status != NC_NOERR) + goto unwind_ioc; + + add_to_NCList(ncp); + + if(chunksizehintp != NULL) + *chunksizehintp = ncp->chunk; + + ncp->int_ncid = ncp->nciop->fd; + + if(ncpp) *ncpp = ncp; + + return NC_NOERR; + +unwind_ioc: + (void) ncio_close(ncp->nciop, 1); /* N.B.: unlink */ + ncp->nciop = NULL; + /*FALLTHRU*/ +unwind_alloc: + free_NC(ncp); + return status; +} + +/* This function sets a default create flag that will be logically + or'd to whatever flags are passed into nc_create for all future + calls to nc_create. + Valid default create flags are NC_64BIT_OFFSET, NC_CLOBBER, + NC_LOCK, NC_SHARE. */ +int +nc_set_default_format(int format, int *old_formatp) +{ + /* Return existing format if desired. */ + if (old_formatp) + *old_formatp = default_create_format; + + /* Make sure only valid format is set. */ +#ifdef USE_NETCDF4 + if (format != NC_FORMAT_CLASSIC && format != NC_FORMAT_64BIT && + format != NC_FORMAT_NETCDF4 && format != NC_FORMAT_NETCDF4_CLASSIC) + return NC_EINVAL; +#else + if (format != NC_FORMAT_CLASSIC && format != NC_FORMAT_64BIT) + return NC_EINVAL; +#endif + default_create_format = format; + return NC_NOERR; +} + +int +NC3_open(const char * path, int ioflags, + int basepe, size_t *chunksizehintp, + int use_parallel,void* parameters, + NC_Dispatch* dispatch, NC** ncpp) +{ + NC *ncp; + int status; + +#if ALWAYS_NC_SHARE /* DEBUG */ + fSet(ioflags, NC_SHARE); +#endif + + ncp = new_NC(chunksizehintp,dispatch); + if(ncp == NULL) + return NC_ENOMEM; + +#if defined(LOCKNUMREC) /* && _CRAYMPP */ + if (status = NC_init_pe(ncp, basepe)) { + return status; + } +#else + /* + * !_CRAYMPP, only pe 0 is valid + */ + if(basepe != 0) + return NC_EINVAL; +#endif + + status = ncio_open(path, ioflags, 0, 0, &ncp->chunk, &ncp->nciop, 0); + if(status) + goto unwind_alloc; + + assert(ncp->flags == 0); + + if(fIsSet(ncp->nciop->ioflags, NC_SHARE)) + { + /* + * NC_SHARE implies sync up the number of records as well. + * (File format version one.) + * Note that other header changes are not shared + * automatically. Some sort of IPC (external to this package) + * would be used to trigger a call to nc_sync(). + */ + fSet(ncp->flags, NC_NSYNC); + } + + status = nc_get_NC(ncp); + if(status != NC_NOERR) + goto unwind_ioc; + + add_to_NCList(ncp); + + if(chunksizehintp != NULL) + *chunksizehintp = ncp->chunk; + + ncp->int_ncid = ncp->nciop->fd; + + if(ncpp) *ncpp = ncp; + + return NC_NOERR; + +unwind_ioc: + (void) ncio_close(ncp->nciop, 0); + ncp->nciop = NULL; + /*FALLTHRU*/ +unwind_alloc: + free_NC(ncp); + return status; +} + +int +NC3__enddef(int ncid, + size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align) +{ + int status; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(!NC_indef(ncp)) + return(NC_ENOTINDEFINE); + + return (NC_endef(ncp, h_minfree, v_align, v_minfree, r_align)); +} + + +int +NC3_close(int ncid) +{ + int status = NC_NOERR; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_indef(ncp)) + { + status = NC_endef(ncp, 0, 1, 0, 1); /* TODO: defaults */ + if(status != NC_NOERR ) + { + (void) nc_abort(ncid); + return status; + } + } + else if(!NC_readonly(ncp)) + { + status = NC_sync(ncp); + /* flush buffers before any filesize comparisons */ + (void) ncio_sync(ncp->nciop); + } + + /* + * If file opened for writing and filesize is less than + * what it should be (due to previous use of NOFILL mode), + * pad it to correct size, as reported by NC_calcsize(). + */ + if (status == ENOERR) { + off_t filesize; /* current size of open file */ + off_t calcsize; /* calculated file size, from header */ + status = ncio_filesize(ncp->nciop, &filesize); + if(status != ENOERR) + return status; + status = NC_calcsize(ncp, &calcsize); + if(status != NC_NOERR) + return status; + if(filesize < calcsize && !NC_readonly(ncp)) { + status = ncio_pad_length(ncp->nciop, calcsize); + if(status != ENOERR) + return status; + } + } + + (void) ncio_close(ncp->nciop, 0); + ncp->nciop = NULL; + + del_from_NCList(ncp); + + free_NC(ncp); + + return status; +} + +/* + * In data mode, same as ncclose. + * In define mode, restore previous definition. + * In create, remove the file. + */ +int +NC3_abort(int ncid) +{ + int status; + NC *ncp; + int doUnlink = 0; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + doUnlink = NC_IsNew(ncp); + + if(ncp->old != NULL) + { + /* a plain redef, not a create */ + assert(!NC_IsNew(ncp)); + assert(fIsSet(ncp->flags, NC_INDEF)); + free_NC(ncp->old); + ncp->old = NULL; + fClr(ncp->flags, NC_INDEF); + } + else if(!NC_readonly(ncp)) + { + status = NC_sync(ncp); + if(status != NC_NOERR) + return status; + } + + + (void) ncio_close(ncp->nciop, doUnlink); + ncp->nciop = NULL; + + del_from_NCList(ncp); + + free_NC(ncp); + + return NC_NOERR; +} + + +int +NC3_redef(int ncid) +{ + int status; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + return NC_EPERM; + + if(NC_indef(ncp)) + return NC_EINDEFINE; + + + if(fIsSet(ncp->nciop->ioflags, NC_SHARE)) + { + /* read in from disk */ + status = read_NC(ncp); + if(status != NC_NOERR) + return status; + } + + ncp->old = dup_NC(ncp); + if(ncp->old == NULL) + return NC_ENOMEM; + + fSet(ncp->flags, NC_INDEF); + + return NC_NOERR; +} + + +int +NC3_inq(int ncid, + int *ndimsp, + int *nvarsp, + int *nattsp, + int *xtendimp) +{ + int status; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(ndimsp != NULL) + *ndimsp = (int) ncp->dims.nelems; + if(nvarsp != NULL) + *nvarsp = (int) ncp->vars.nelems; + if(nattsp != NULL) + *nattsp = (int) ncp->attrs.nelems; + if(xtendimp != NULL) + *xtendimp = find_NC_Udim(&ncp->dims, NULL); + + return NC_NOERR; +} + +int +NC3_inq_unlimdim(int ncid, int *xtendimp) +{ + int status; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(xtendimp != NULL) + *xtendimp = find_NC_Udim(&ncp->dims, NULL); + + return NC_NOERR; +} + +int +NC3_sync(int ncid) +{ + int status; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_indef(ncp)) + return NC_EINDEFINE; + + if(NC_readonly(ncp)) + { + return read_NC(ncp); + } + /* else, read/write */ + + status = NC_sync(ncp); + if(status != NC_NOERR) + return status; + + status = ncio_sync(ncp->nciop); + if(status != NC_NOERR) + return status; + +#ifdef USE_FSYNC + /* may improve concurrent access, but slows performance if + * called frequently */ +#ifndef WIN32 + status = fsync(ncp->nciop->fd); +#else + status = _commit(ncp->nciop->fd); +#endif /* WIN32 */ +#endif /* USE_FSYNC */ + + return status; +} + + +int +NC3_set_fill(int ncid, + int fillmode, int *old_mode_ptr) +{ + int status; + NC *ncp; + int oldmode; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + return NC_EPERM; + + oldmode = fIsSet(ncp->flags, NC_NOFILL) ? NC_NOFILL : NC_FILL; + + if(fillmode == NC_NOFILL) + { + fSet(ncp->flags, NC_NOFILL); + } + else if(fillmode == NC_FILL) + { + if(fIsSet(ncp->flags, NC_NOFILL)) + { + /* + * We are changing back to fill mode + * so do a sync + */ + status = NC_sync(ncp); + if(status != NC_NOERR) + return status; + } + fClr(ncp->flags, NC_NOFILL); + } + else + { + return NC_EINVAL; /* Invalid fillmode */ + } + + if(old_mode_ptr != NULL) + *old_mode_ptr = oldmode; + + return NC_NOERR; +} + +#ifdef LOCKNUMREC + +/* create function versions of the NC_*_numrecs macros */ +size_t +NC_get_numrecs(const NC *ncp) { + shmem_t numrec; + shmem_short_get(&numrec, (shmem_t *) ncp->lock + LOCKNUMREC_VALUE, 1, + ncp->lock[LOCKNUMREC_BASEPE]); + return (size_t) numrec; +} + +void +NC_set_numrecs(NC *ncp, size_t nrecs) +{ + shmem_t numrec = (shmem_t) nrecs; + /* update local value too */ + ncp->lock[LOCKNUMREC_VALUE] = (ushmem_t) numrec; + shmem_short_put((shmem_t *) ncp->lock + LOCKNUMREC_VALUE, &numrec, 1, + ncp->lock[LOCKNUMREC_BASEPE]); +} + +void NC_increase_numrecs(NC *ncp, size_t nrecs) +{ + /* this is only called in one place that's already protected + * by a lock ... so don't worry about it */ + if (nrecs > NC_get_numrecs(ncp)) + NC_set_numrecs(ncp, nrecs); +} + +#endif /* LOCKNUMREC */ + +/* everyone in communicator group will be executing this */ +/*ARGSUSED*/ +int +NC3_set_base_pe(int ncid, int pe) +{ +#if _CRAYMPP && defined(LOCKNUMREC) + int status; + NC *ncp; + shmem_t numrecs; + + if ((status = NC_check_id(ncid, &ncp)) != NC_NOERR) { + return status; + } + if (pe < 0 || pe >= _num_pes()) { + return NC_EINVAL; /* invalid base pe */ + } + + numrecs = (shmem_t) NC_get_numrecs(ncp); + + ncp->lock[LOCKNUMREC_VALUE] = (ushmem_t) numrecs; + + /* update serving & lock values for a "smooth" transition */ + /* note that the "real" server will being doing this as well */ + /* as all the rest in the group */ + /* must have syncronization before & after this step */ + shmem_short_get( + (shmem_t *) ncp->lock + LOCKNUMREC_SERVING, + (shmem_t *) ncp->lock + LOCKNUMREC_SERVING, + 1, ncp->lock[LOCKNUMREC_BASEPE]); + + shmem_short_get( + (shmem_t *) ncp->lock + LOCKNUMREC_LOCK, + (shmem_t *) ncp->lock + LOCKNUMREC_LOCK, + 1, ncp->lock[LOCKNUMREC_BASEPE]); + + /* complete transition */ + ncp->lock[LOCKNUMREC_BASEPE] = (ushmem_t) pe; + +#endif /* _CRAYMPP && LOCKNUMREC */ + return NC_NOERR; +} + +/*ARGSUSED*/ +int +NC3_inq_base_pe(int ncid, int *pe) +{ +#if _CRAYMPP && defined(LOCKNUMREC) + int status; + NC *ncp; + + if ((status = NC_check_id(ncid, &ncp)) != NC_NOERR) { + return status; + } + + *pe = (int) ncp->lock[LOCKNUMREC_BASEPE]; +#else + /* + * !_CRAYMPP, only pe 0 is valid + */ + *pe = 0; +#endif /* _CRAYMPP && LOCKNUMREC */ + return NC_NOERR; +} + +int +NC3_inq_format(int ncid, int *formatp) +{ + int status; + NC *ncp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + /* only need to check for netCDF-3 variants, since this is never called for netCDF-4 + files */ + *formatp = fIsSet(ncp->flags, NC_64BIT_OFFSET) ? NC_FORMAT_64BIT + : NC_FORMAT_CLASSIC; + return NC_NOERR; +} + +/* The sizes of types may vary from platform to platform, but within + * netCDF files, type sizes are fixed. */ +#define NC_BYTE_LEN 1 +#define NC_CHAR_LEN 1 +#define NC_SHORT_LEN 2 +#define NC_INT_LEN 4 +#define NC_FLOAT_LEN 4 +#define NC_DOUBLE_LEN 8 +#define NUM_ATOMIC_TYPES 6 + +/* This netCDF-4 function proved so popular that a netCDF-classic + * version is provided. You're welcome. */ +int +NC3_inq_type(int ncid, nc_type typeid, char *name, size_t *size) +{ + int atomic_size[NUM_ATOMIC_TYPES] = {NC_BYTE_LEN, NC_CHAR_LEN, NC_SHORT_LEN, + NC_INT_LEN, NC_FLOAT_LEN, NC_DOUBLE_LEN}; + char atomic_name[NUM_ATOMIC_TYPES][NC_MAX_NAME + 1] = {"byte", "char", "short", + "int", "float", "double"}; + + /* Only netCDF classic model needs to be handled. */ + if (typeid < NC_BYTE || typeid > NC_DOUBLE) + return NC_EBADTYPE; + + /* Give the user the values they want. Subtract one because types + * are numbered starting at 1, not 0. */ + if (name) + strcpy(name, atomic_name[typeid - 1]); + if (size) + *size = atomic_size[typeid - 1]; + + return NC_NOERR; +} + +int +nc_delete_mp(const char * path, int basepe) +{ + NC *ncp; + int status; + size_t chunk = 512; + + status = NC3_new_nc(&ncp); + if(status) return status; + ncp->chunk = chunk; + +#if defined(LOCKNUMREC) /* && _CRAYMPP */ + if (status = NC_init_pe(ncp, basepe)) { + return status; + } +#else + /* + * !_CRAYMPP, only pe 0 is valid + */ + if(basepe != 0) + return NC_EINVAL; +#endif + + status = ncio_open(path, NC_NOWRITE, + 0, 0, &ncp->chunk, + &ncp->nciop, 0); + if(status) + goto unwind_alloc; + + assert(ncp->flags == 0); + + status = nc_get_NC(ncp); + if(status != NC_NOERR) + { + /* Not a netcdf file, don't delete */ + /* ??? is this the right semantic? what if it was just too big? */ + (void) ncio_close(ncp->nciop, 0); + } + else + { + /* ncio_close does the unlink */ + status = ncio_close(ncp->nciop, 1); /* ncio_close does the unlink */ + } + ncp->nciop = NULL; + + ncp->nciop = NULL; +unwind_alloc: + free_NC(ncp); + return status; +} + +int +nc_delete(const char * path) +{ + return nc_delete_mp(path, 0); +} + diff --git a/extern/src_netcdf4/nc.h b/extern/src_netcdf4/nc.h new file mode 100644 index 0000000..2e92022 --- /dev/null +++ b/extern/src_netcdf4/nc.h @@ -0,0 +1,429 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +#ifndef _NC_H_ +#define _NC_H_ + +/* + * netcdf library 'private' data structures, objects and interfaces + */ +#include +#include /* size_t */ +#ifndef HAVE_STDINT_H +# include "pstdint.h" /* attempts to define uint32_t etc portably */ +#else +# include +#endif /* HAVE_STDINT_H */ +#include /* off_t */ +#ifdef USE_PARALLEL +#include +#else +#include +#endif /* USE_PARALLEL */ +#if 0 +#include "ncio.h" +#include "fbits.h" +#endif + +/*#ifndef HAVE_SSIZE_T +#define ssize_t int +#endif*/ + +#ifndef NC_ARRAY_GROWBY +#define NC_ARRAY_GROWBY 4 +#endif + +/* + * The extern size of an empty + * netcdf version 1 file. + * The initial value of ncp->xsz. + */ +#define MIN_NC_XSZ 32 + +/* Forward */ +typedef struct NC NC; /* forward reference */ +struct ncio; + +/* + * The internal data types + */ +typedef enum { + NC_UNSPECIFIED = 0, +/* future NC_BITFIELD = 7, */ +/* NC_STRING = 8, */ + NC_DIMENSION = 10, + NC_VARIABLE = 11, + NC_ATTRIBUTE = 12 +} NCtype; + + +/* + * Counted string for names and such + */ +typedef struct { + /* all xdr'd */ + size_t nchars; + char *cp; +} NC_string; + +/* Begin defined in string.c */ +extern void +free_NC_string(NC_string *ncstrp); + +extern int +NC_check_name(const char *name); + +extern NC_string * +new_NC_string(size_t slen, const char *str); + +extern int +set_NC_string(NC_string *ncstrp, const char *str); + +/* End defined in string.c */ + +/* + * NC dimension stucture + */ +typedef struct { + /* all xdr'd */ + NC_string *name; + uint32_t hash; + size_t size; +} NC_dim; + +typedef struct NC_dimarray { + size_t nalloc; /* number allocated >= nelems */ + /* below gets xdr'd */ + /* NCtype type = NC_DIMENSION */ + size_t nelems; /* length of the array */ + NC_dim **value; +} NC_dimarray; + +/* Begin defined in dim.c */ + +extern void +free_NC_dim(NC_dim *dimp); + +extern NC_dim * +new_x_NC_dim(NC_string *name); + +extern int +find_NC_Udim(const NC_dimarray *ncap, NC_dim **dimpp); + +/* dimarray */ + +extern void +free_NC_dimarrayV0(NC_dimarray *ncap); + +extern void +free_NC_dimarrayV(NC_dimarray *ncap); + +extern int +dup_NC_dimarrayV(NC_dimarray *ncap, const NC_dimarray *ref); + +extern NC_dim * +elem_NC_dimarray(const NC_dimarray *ncap, size_t elem); + +/* End defined in dim.c */ + +/* + * NC attribute + */ +typedef struct { + size_t xsz; /* amount of space at xvalue */ + /* below gets xdr'd */ + NC_string *name; + nc_type type; /* the discriminant */ + size_t nelems; /* length of the array */ + void *xvalue; /* the actual data, in external representation */ +} NC_attr; + +typedef struct NC_attrarray { + size_t nalloc; /* number allocated >= nelems */ + /* below gets xdr'd */ + /* NCtype type = NC_ATTRIBUTE */ + size_t nelems; /* length of the array */ + NC_attr **value; +} NC_attrarray; + +/* Begin defined in attr.c */ + +extern void +free_NC_attr(NC_attr *attrp); + +extern NC_attr * +new_x_NC_attr( + NC_string *strp, + nc_type type, + size_t nelems); + +extern NC_attr ** +NC_findattr(const NC_attrarray *ncap, const char *name); + +/* attrarray */ + +extern void +free_NC_attrarrayV0(NC_attrarray *ncap); + +extern void +free_NC_attrarrayV(NC_attrarray *ncap); + +extern int +dup_NC_attrarrayV(NC_attrarray *ncap, const NC_attrarray *ref); + +extern NC_attr * +elem_NC_attrarray(const NC_attrarray *ncap, size_t elem); + +/* End defined in attr.c */ + + +/* + * NC variable: description and data + */ +typedef struct NC_var { + size_t xsz; /* xszof 1 element */ + size_t *shape; /* compiled info: dim->size of each dim */ + off_t *dsizes; /* compiled info: the right to left product of shape */ + /* below gets xdr'd */ + NC_string *name; + uint32_t hash; + /* next two: formerly NC_iarray *assoc */ /* user definition */ + size_t ndims; /* assoc->count */ + int *dimids; /* assoc->value */ + NC_attrarray attrs; + nc_type type; /* the discriminant */ + size_t len; /* the total length originally allocated */ + off_t begin; +} NC_var; + +typedef struct NC_vararray { + size_t nalloc; /* number allocated >= nelems */ + /* below gets xdr'd */ + /* NCtype type = NC_VARIABLE */ + size_t nelems; /* length of the array */ + NC_var **value; +} NC_vararray; + +/* Begin defined in lookup3.c */ + +extern uint32_t +hash_fast(const void *key, size_t length); + +/* End defined in lookup3.c */ + +/* Begin defined in var.c */ + +extern void +free_NC_var(NC_var *varp); + +extern NC_var * +new_x_NC_var( + NC_string *strp, + size_t ndims); + +/* vararray */ + +extern void +free_NC_vararrayV0(NC_vararray *ncap); + +extern void +free_NC_vararrayV(NC_vararray *ncap); + +extern int +dup_NC_vararrayV(NC_vararray *ncap, const NC_vararray *ref); + +extern int +NC_var_shape(NC_var *varp, const NC_dimarray *dims); + +extern int +NC_findvar(const NC_vararray *ncap, const char *name, NC_var **varpp); + +extern int +NC_check_vlen(NC_var *varp, size_t vlen_max); + +extern NC_var * +NC_lookupvar(NC *ncp, int varid); + +/* End defined in var.c */ + +#define IS_RECVAR(vp) \ + ((vp)->shape != NULL ? (*(vp)->shape == NC_UNLIMITED) : 0 ) + +#ifdef LOCKNUMREC +/* + * typedef SHMEM type + * for whenever the SHMEM functions can handle other than shorts + */ +typedef unsigned short int ushmem_t; +typedef short int shmem_t; +#endif + +/* Warning: fields from BEGIN COMMON to END COMMON must be same for: + 1. NCcommon (include/ncdispatch.h) + 2. NC (libsrc/nc.h) + 3. NC_FILE_INFO (libsrc4/nc4internal.h) + 4. whatever libdiskless uses +*/ +struct NC { +/*BEGIN COMMON (see include/ncdispatch.h: struct NCcommon) */ + int ext_ncid; + int int_ncid; + struct NC_Dispatch* dispatch; + void* dispatchdata; + char* path; + int substrate; + void* instance; /* per-instance data specific to netcdf3,4,dap,etc. + Currently only used by librpc, will retrofit other + dispatch kinds over time. */ +/*END COMMON*/ + /* contains the previous NC during redef. */ + struct NC *old; + /* flags */ +#define NC_CREAT 2 /* in create phase, cleared by ncendef */ +#define NC_INDEF 8 /* in define mode, cleared by ncendef */ +#define NC_NSYNC 0x10 /* synchronise numrecs on change */ +#define NC_HSYNC 0x20 /* synchronise whole header on change */ +#define NC_NDIRTY 0x40 /* numrecs has changed */ +#define NC_HDIRTY 0x80 /* header info has changed */ +/* NC_NOFILL in netcdf.h, historical interface */ + int flags; + struct ncio* nciop; + size_t chunk; /* largest extent this layer will request from ncio->get() */ + size_t xsz; /* external size of this header, == var[0].begin */ + off_t begin_var; /* position of the first (non-record) var */ + off_t begin_rec; /* position of the first 'record' */ + /* Don't constrain maximum size of record unnecessarily */ +#if SIZEOF_OFF_T > SIZEOF_SIZE_T + off_t recsize; /* length of 'record' */ +#else + size_t recsize; /* length of 'record' */ +#endif + /* below gets xdr'd */ + size_t numrecs; /* number of 'records' allocated */ + NC_dimarray dims; + NC_attrarray attrs; + NC_vararray vars; +#ifdef LOCKNUMREC +/* size and named indexes for the lock array protecting NC.numrecs */ +# define LOCKNUMREC_DIM 4 +# define LOCKNUMREC_VALUE 0 +# define LOCKNUMREC_LOCK 1 +# define LOCKNUMREC_SERVING 2 +# define LOCKNUMREC_BASEPE 3 + /* Used on Cray T3E MPP to maintain the + * integrity of numrecs for an unlimited dimension + */ + ushmem_t lock[LOCKNUMREC_DIM]; +#endif +}; + +#define NC_readonly(ncp) \ + (!fIsSet(ncp->nciop->ioflags, NC_WRITE)) + +#define NC_IsNew(ncp) \ + fIsSet((ncp)->flags, NC_CREAT) + +#define NC_indef(ncp) \ + (NC_IsNew(ncp) || fIsSet((ncp)->flags, NC_INDEF)) + +#define set_NC_ndirty(ncp) \ + fSet((ncp)->flags, NC_NDIRTY) + +#define NC_ndirty(ncp) \ + fIsSet((ncp)->flags, NC_NDIRTY) + +#define set_NC_hdirty(ncp) \ + fSet((ncp)->flags, NC_HDIRTY) + +#define NC_hdirty(ncp) \ + fIsSet((ncp)->flags, NC_HDIRTY) + +#define NC_dofill(ncp) \ + (!fIsSet((ncp)->flags, NC_NOFILL)) + +#define NC_doHsync(ncp) \ + fIsSet((ncp)->flags, NC_HSYNC) + +#define NC_doNsync(ncp) \ + fIsSet((ncp)->flags, NC_NSYNC) + +#ifndef LOCKNUMREC +# define NC_get_numrecs(ncp) \ + ((ncp)->numrecs) + +# define NC_set_numrecs(ncp, nrecs) \ + {((ncp)->numrecs = (nrecs));} + +# define NC_increase_numrecs(ncp, nrecs) \ + {if((nrecs) > (ncp)->numrecs) ((ncp)->numrecs = (nrecs));} +#else + size_t NC_get_numrecs(const NC *ncp); + void NC_set_numrecs(NC *ncp, size_t nrecs); + void NC_increase_numrecs(NC *ncp, size_t nrecs); +#endif + +/* Begin defined in nc.c */ + +extern int +NC_check_id(int ncid, NC **ncpp); + +extern int +nc_cktype(nc_type datatype); + +extern size_t +ncx_howmany(nc_type type, size_t xbufsize); + +extern int +read_numrecs(NC *ncp); + +extern int +write_numrecs(NC *ncp); + +extern int +NC_sync(NC *ncp); + +extern int +NC_calcsize(const NC *ncp, off_t *filesizep); + +/* End defined in nc.c */ +/* Begin defined in v1hpg.c */ + +extern size_t +ncx_len_NC(const NC *ncp, size_t sizeof_off_t); + +extern int +ncx_put_NC(const NC *ncp, void **xpp, off_t offset, size_t extent); + +extern int +nc_get_NC( NC *ncp); + +/* End defined in v1hpg.c */ +/* Begin defined in putget.c */ + +extern int +fill_NC_var(NC *ncp, const NC_var *varp, size_t varsize, size_t recno); + +extern int +nc_inq_rec(int ncid, size_t *nrecvars, int *recvarids, size_t *recsizes); + +extern int +nc_get_rec(int ncid, size_t recnum, void **datap); + +extern int +nc_put_rec(int ncid, size_t recnum, void *const *datap); + +/* End defined in putget.c */ + +extern int add_to_NCList(NC*); +extern void del_from_NCList(NC*);/* does not free object */ +extern NC* find_in_NCList(int ext_ncid); +extern void free_NCList(void);/* reclaim whole list */ +extern int count_NCList(void); /* return # of entries in NClist */ + +/* Create a pseudo file descriptor that does not + overlap real file descriptors +*/ +extern int nc__pseudofd(void); + +#endif /* _NC_H_ */ diff --git a/extern/src_netcdf4/nc3dispatch.c b/extern/src_netcdf4/nc3dispatch.c new file mode 100644 index 0000000..e304893 --- /dev/null +++ b/extern/src_netcdf4/nc3dispatch.c @@ -0,0 +1,500 @@ +/********************************************************************* + Copyright 2010, UCAR/Unidata See netcdf/COPYRIGHT file for + copying and redistribution conditions. + + $Id: nc3dispatch.c,v 2.8 2010/05/26 11:11:26 ed Exp $ + *********************************************************************/ + +#include "config.h" +#include +#include + +#include "netcdf.h" +#include "nc.h" +#include "nc3dispatch.h" + +#ifndef NC_CONTIGUOUS +#define NC_CONTIGUOUS 1 +#endif + +#ifndef NC_ENOTNC4 +#define NC_ENOTNC4 (-111) +#endif + +#ifndef NC_ENOGRP +#define NC_ENOGRP (-125) +#endif + +#ifndef NC_STRING +#define NC_STRING (12) +#endif + + +static int NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp, + int *shufflep, int *deflatep, int *deflate_levelp, + int *fletcher32p, int *contiguousp, size_t *chunksizesp, + int *no_fill, void *fill_valuep, int *endiannessp, + int *options_maskp, int *pixels_per_blockp); + +#ifdef USE_NETCDF4 +static int NC3_show_metadata(int); +static int NC3_inq_unlimdims(int,int*,int*); +static int NC3_var_par_access(int,int,int); +static int NC3_inq_ncid(int,const char*,int*); +static int NC3_inq_grps(int,int*,int*); +static int NC3_inq_grpname(int,char*); +static int NC3_inq_grpname_full(int,size_t*,char*); +static int NC3_inq_grp_parent(int,int*); +static int NC3_inq_grp_full_ncid(int,const char*,int*); +static int NC3_inq_varids(int,int* nvars,int*); +static int NC3_inq_dimids(int,int* ndims,int*,int); +static int NC3_inq_typeids(int,int* ntypes,int*); +static int NC3_inq_type_equal(int,nc_type,int,nc_type,int*); +static int NC3_def_grp(int,const char*,int*); +static int NC3_inq_user_type(int,nc_type,char*,size_t*,nc_type*,size_t*,int*); +static int NC3_inq_typeid(int,const char*,nc_type*); +static int NC3_def_compound(int,size_t,const char*,nc_type*); +static int NC3_insert_compound(int,nc_type,const char*,size_t,nc_type); +static int NC3_insert_array_compound(int,nc_type,const char*,size_t,nc_type,int,const int*); +static int NC3_inq_compound_field(int,nc_type,int,char*,size_t*,nc_type*,int*,int*); +static int NC3_inq_compound_fieldindex(int,nc_type,const char*,int*); +static int NC3_def_vlen(int,const char*,nc_type base_typeid,nc_type*); +static int NC3_put_vlen_element(int,int,void*,size_t,const void*); +static int NC3_get_vlen_element(int,int,const void*,size_t*,void*); +static int NC3_def_enum(int,nc_type,const char*,nc_type*); +static int NC3_insert_enum(int,nc_type,const char*,const void*); +static int NC3_inq_enum_member(int,nc_type,int,char*,void*); +static int NC3_inq_enum_ident(int,nc_type,long long,char*); +static int NC3_def_opaque(int,size_t,const char*,nc_type*); +static int NC3_def_var_deflate(int,int,int,int,int); +static int NC3_def_var_fletcher32(int,int,int); +static int NC3_def_var_chunking(int,int,int,const size_t*); +static int NC3_def_var_fill(int,int,int,const void*); +static int NC3_def_var_endian(int,int,int); +static int NC3_set_var_chunk_cache(int,int,size_t,size_t,float); +static int NC3_get_var_chunk_cache(int,int,size_t*,size_t*,float*); +#endif /*USE_NETCDF4*/ + +NC_Dispatch NC3_dispatcher = { + +NC_DISPATCH_NC3, + +NC3_new_nc, + +NC3_create, +NC3_open, + +NC3_redef, +NC3__enddef, +NC3_sync, +NC3_abort, +NC3_close, +NC3_set_fill, +NC3_inq_base_pe, +NC3_set_base_pe, +NC3_inq_format, + +NC3_inq, +NC3_inq_type, + +NC3_def_dim, +NC3_inq_dimid, +NC3_inq_dim, +NC3_inq_unlimdim, +NC3_rename_dim, + +NC3_inq_att, +NC3_inq_attid, +NC3_inq_attname, +NC3_rename_att, +NC3_del_att, +NC3_get_att, +NC3_put_att, + +NC3_def_var, +NC3_inq_varid, +NC3_rename_var, +NC3_get_vara, +NC3_put_vara, +NCDEFAULT_get_vars, +NCDEFAULT_put_vars, +NCDEFAULT_get_varm, +NCDEFAULT_put_varm, + +NC3_inq_var_all, + +#ifdef USE_NETCDF4 +NC3_show_metadata, +NC3_inq_unlimdims, +NC3_var_par_access, +NC3_inq_ncid, +NC3_inq_grps, +NC3_inq_grpname, +NC3_inq_grpname_full, +NC3_inq_grp_parent, +NC3_inq_grp_full_ncid, +NC3_inq_varids, +NC3_inq_dimids, +NC3_inq_typeids, +NC3_inq_type_equal, +NC3_def_grp, +NC3_inq_user_type, +NC3_inq_typeid, + +NC3_def_compound, +NC3_insert_compound, +NC3_insert_array_compound, +NC3_inq_compound_field, +NC3_inq_compound_fieldindex, +NC3_def_vlen, +NC3_put_vlen_element, +NC3_get_vlen_element, +NC3_def_enum, +NC3_insert_enum, +NC3_inq_enum_member, +NC3_inq_enum_ident, +NC3_def_opaque, +NC3_def_var_deflate, +NC3_def_var_fletcher32, +NC3_def_var_chunking, +NC3_def_var_fill, +NC3_def_var_endian, +NC3_set_var_chunk_cache, +NC3_get_var_chunk_cache, + +#endif /*_NC4DISPATCH_H*/ + +}; + +NC_Dispatch* NC3_dispatch_table = NULL; /* moved here from ddispatch.c */ + +int +NC3_initialize(void) +{ + NC3_dispatch_table = &NC3_dispatcher; + return NC_NOERR; +} + +static int +NC3_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp, + int *shufflep, int *deflatep, int *deflate_levelp, + int *fletcher32p, int *contiguousp, size_t *chunksizesp, + int *no_fill, void *fill_valuep, int *endiannessp, + int *options_maskp, int *pixels_per_blockp) +{ + int stat = NC3_inq_var(ncid,varid,name,xtypep,ndimsp,dimidsp,nattsp); + if(stat) return stat; + if(shufflep) *shufflep = 0; + if(deflatep) *deflatep = 0; + if(fletcher32p) *fletcher32p = 0; + if(contiguousp) *contiguousp = NC_CONTIGUOUS; + if(no_fill) *no_fill = 1; + if(endiannessp) return NC_ENOTNC4; + if(options_maskp) return NC_ENOTNC4; + return NC_NOERR; +} + +#ifdef USE_NETCDF4 + +static int +NC3_inq_unlimdims(int ncid, int *ndimsp, int *unlimdimidsp) +{ + int retval; + int unlimid; + + if ((retval = nc_inq_unlimdim(ncid, &unlimid))) + return retval; + if (unlimid != -1) { + if(ndimsp) *ndimsp = 1; + if (unlimdimidsp) + unlimdimidsp[0] = unlimid; + } else + if(ndimsp) *ndimsp = 0; + return NC_NOERR; +} + +static int +NC3_def_grp(int parent_ncid, const char *name, int *new_ncid) +{ + return NC_ENOTNC4; +} + +static int +NC3_inq_ncid(int ncid, const char *name, int *grp_ncid) +{ + if(grp_ncid) *grp_ncid = ncid; + return NC_NOERR; +} + +static int +NC3_inq_grps(int ncid, int *numgrps, int *ncids) +{ + if (numgrps) + *numgrps = 0; + return NC_NOERR; +} + +static int +NC3_inq_grpname(int ncid, char *name) +{ + if (name) + strcpy(name, "/"); + return NC_NOERR; +} + +static int +NC3_inq_grpname_full(int ncid, size_t *lenp, char *full_name) +{ + if (full_name) + strcpy(full_name, "/"); + if(lenp) *lenp = 1; + return NC_NOERR; +} + +static int +NC3_inq_grp_parent(int ncid, int *parent_ncid) +{ + return NC_ENOGRP; +} + +static int +NC3_inq_grp_full_ncid(int ncid, const char *full_name, int *grp_ncid) +{ + return NC_ENOGRP; +} + +static int +NC3_inq_varids(int ncid, int *nvarsp, int *varids) +{ + int retval,v,nvars; + /* If this is a netcdf-3 file, there is only one group, the root + group, and its vars have ids 0 thru nvars - 1. */ + if ((retval = nc_inq(ncid, NULL, &nvars, NULL, NULL))) + return retval; + if(nvarsp) *nvarsp = nvars; + if (varids) + for (v = 0; v < nvars; v++) + varids[v] = v; + return NC_NOERR; +} + +static int +NC3_inq_dimids(int ncid, int *ndimsp, int *dimids, int include_parents) +{ + int retval,d,ndims; + /* If this is a netcdf-3 file, then the dimids are going to be 0 + thru ndims-1, so just provide them. */ + if ((retval = nc_inq(ncid, &ndims, NULL, NULL, NULL))) + return retval; + if(ndimsp) *ndimsp = ndims; + if (dimids) + for (d = 0; d < ndims; d++) + dimids[d] = d; + return NC_NOERR; +} + +static int +NC3_show_metadata(int ncid) +{ + return NC_NOERR; +} + +static int +NC3_inq_type_equal(int ncid1, nc_type typeid1, int ncid2, nc_type typeid2, int* equalp) +{ + /* Check input. */ + if(equalp == NULL) return NC_NOERR; + + if (typeid1 <= NC_NAT || typeid2 <= NC_NAT) + return NC_EINVAL; + + *equalp = 0; /* assume */ + + /* If one is atomic, and the other user-defined, the types are not equal */ + if ((typeid1 <= NC_STRING && typeid2 > NC_STRING) || + (typeid2 <= NC_STRING && typeid1 > NC_STRING)) { + if (equalp) *equalp = 0; + return NC_NOERR; + } + + /* If both are atomic types, the answer is easy. */ + if (typeid1 <= ATOMICTYPEMAX) { + if (equalp) { + if (typeid1 == typeid2) + *equalp = 1; + else + *equalp = 0; + } + return NC_NOERR; + } + return NC_NOERR; +} + +static int +NC3_inq_typeid(int ncid, const char *name, nc_type *typeidp) +{ + int i; + for (i = 0; i <= ATOMICTYPEMAX; i++) + if (!strcmp(name, NC_atomictypename(i))) { + if (typeidp) *typeidp = i; + return NC_NOERR; + } + return NC_ENOTNC4; +} + +static int +NC3_inq_typeids(int ncid, int *ntypes, int *typeids) +{ + if(ntypes) *ntypes = 0; + return NC_NOERR; +} + +static int +NC3_inq_user_type(int ncid, nc_type typeid, char *name, size_t *size, + nc_type *base_nc_typep, size_t *nfieldsp, int *classp) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_compound(int ncid, size_t size, const char *name, nc_type *typeidp) +{ + return NC_ENOTNC4; +} + +static int +NC3_insert_compound(int ncid, nc_type typeid, const char *name, size_t offset, + nc_type field_typeid) +{ + return NC_ENOTNC4; +} + +static int +NC3_insert_array_compound(int ncid, nc_type typeid, const char *name, + size_t offset, nc_type field_typeid, + int ndims, const int *dim_sizes) +{ + return NC_ENOTNC4; +} + + +static int +NC3_inq_compound_field(int ncid, nc_type typeid, int fieldid, char *name, + size_t *offsetp, nc_type *field_typeidp, int *ndimsp, + int *dim_sizesp) +{ + return NC_ENOTNC4; +} + +static int +NC3_inq_compound_fieldindex(int ncid, nc_type typeid, const char *name, int *fieldidp) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_opaque(int ncid, size_t datum_size, const char *name, nc_type* xtypep) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_vlen(int ncid, const char *name, nc_type base_typeid, nc_type* xtypep) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_enum(int ncid, nc_type base_typeid, const char *name, + nc_type *typeidp) +{ + return NC_ENOTNC4; +} + +static int +NC3_inq_enum_ident(int ncid, nc_type xtype, long long value, char *identifier) +{ + return NC_ENOTNC4; +} + +static int +NC3_inq_enum_member(int ncid, nc_type typeid, int idx, char *identifier, + void *value) +{ + return NC_ENOTNC4; +} + +static int +NC3_insert_enum(int ncid, nc_type typeid, const char *identifier, + const void *value) +{ + return NC_ENOTNC4; +} + +static int +NC3_put_vlen_element(int ncid, int typeid, void *vlen_element, + size_t len, const void *data) +{ + return NC_ENOTNC4; +} + +static int +NC3_get_vlen_element(int ncid, int typeid, const void *vlen_element, + size_t *len, void *data) +{ + return NC_ENOTNC4; +} + +static int +NC3_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, float preemption) +{ + return NC_ENOTNC4; +} + +static int +NC3_get_var_chunk_cache(int ncid, int varid, size_t *sizep, size_t *nelemsp, float *preemptionp) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_var_deflate(int ncid, int varid, int shuffle, int deflate, + int deflate_level) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_var_fletcher32(int ncid, int varid, int fletcher32) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_var_chunking(int ncid, int varid, int contiguous, const size_t *chunksizesp) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_var_fill(int ncid, int varid, int no_fill, const void *fill_value) +{ + return NC_ENOTNC4; +} + +static int +NC3_def_var_endian(int ncid, int varid, int endianness) +{ + return NC_ENOTNC4; +} + +static int +NC3_var_par_access(int ncid, int varid, int par_access) +{ + return NC_ENOTNC4; +} + +#endif /*USE_NETCDF4*/ + diff --git a/extern/src_netcdf4/nc3dispatch.h b/extern/src_netcdf4/nc3dispatch.h new file mode 100644 index 0000000..7f0323f --- /dev/null +++ b/extern/src_netcdf4/nc3dispatch.h @@ -0,0 +1,186 @@ +/* + * Copyright 1993-1996 University Corporation for Atmospheric Research/Unidata + * + * Portions of this software were developed by the Unidata Program at the + * University Corporation for Atmospheric Research. + * + * Access and use of this software shall impose the following obligations + * and understandings on the user. The user is granted the right, without + * any fee or cost, to use, copy, modify, alter, enhance and distribute + * this software, and any derivative works thereof, and its supporting + * documentation for any purpose whatsoever, provided that this entire + * notice appears in all copies of the software, derivative works and + * supporting documentation. Further, UCAR requests that the user credit + * UCAR/Unidata in any publications that result from the use of this + * software or in any product that includes this software. The names UCAR + * and/or Unidata, however, may not be used in any advertising or publicity + * to endorse or promote any products or commercial entity unless specific + * written permission is obtained from UCAR/Unidata. The user also + * understands that UCAR/Unidata is not obligated to provide the user with + * any support, consulting, training or assistance of any kind with regard + * to the use, operation and performance of this software nor to provide + * the user with any updates, revisions, new versions or "bug fixes." + * + * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* "$Id: nc3dispatch.h,v 2.8 2010/05/26 18:11:08 dmh Exp $" */ + +#ifndef _NC3DISPATCH_H +#define _NC3DISPATCH_H + +#include /* size_t, ptrdiff_t */ +#include "netcdf.h" +#include "ncdispatch.h" + + + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + * The Interface + */ + +/* WARNING: this signature differs from external nc_create API*/ +EXTERNL int +NC3_create(const char *path, int cmode, + size_t initialsz, int basepe, size_t *chunksizehintp, + int useparallel, void* mpidata, + struct NC_Dispatch*, NC** ncp); + +/* WARNING: this signature differs from external nc_open API*/ +EXTERNL int +NC3_open(const char *path, int mode, + int basepe, size_t *chunksizehintp, + int use_parallel, void* mpidata, + NC_Dispatch*, NC** ncp); + +EXTERNL int +NC3_new_nc(NC**); + +EXTERNL int +NC3_redef(int ncid); + +EXTERNL int +NC3__enddef(int ncid, size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align); + +EXTERNL int +NC3_sync(int ncid); + +EXTERNL int +NC3_abort(int ncid); + +EXTERNL int +NC3_close(int ncid); + +EXTERNL int +NC3_set_fill(int ncid, int fillmode, int *old_modep); + +EXTERNL int +NC3_set_base_pe(int ncid, int pe); + +EXTERNL int +NC3_inq_base_pe(int ncid, int *pe); + +EXTERNL int +NC3_inq_format(int ncid, int *formatp); + +EXTERNL int +NC3_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp); + +EXTERNL int +NC3_inq_type(int, nc_type, char *, size_t *); + +/* Begin _dim */ + +EXTERNL int +NC3_def_dim(int ncid, const char *name, size_t len, int *idp); + +EXTERNL int +NC3_inq_dimid(int ncid, const char *name, int *idp); + +EXTERNL int +NC3_inq_dim(int ncid, int dimid, char *name, size_t *lenp); + +EXTERNL int +NC3_inq_unlimdim(int ncid, int *unlimdimidp); + +EXTERNL int +NC3_rename_dim(int ncid, int dimid, const char *name); + +/* End _dim */ +/* Begin _att */ + +EXTERNL int +NC3_inq_att(int ncid, int varid, const char *name, + nc_type *xtypep, size_t *lenp); + +EXTERNL int +NC3_inq_attid(int ncid, int varid, const char *name, int *idp); + +EXTERNL int +NC3_inq_attname(int ncid, int varid, int attnum, char *name); + +EXTERNL int +NC3_rename_att(int ncid, int varid, const char *name, const char *newname); + +EXTERNL int +NC3_del_att(int ncid, int varid, const char*); + +/* End _att */ +/* Begin {put,get}_att */ + +EXTERNL int +NC3_get_att(int ncid, int varid, const char *name, void *value, nc_type); + +EXTERNL int +NC3_put_att(int ncid, int varid, const char *name, nc_type datatype, + size_t len, const void *value, nc_type); + +/* End {put,get}_att */ +/* Begin _var */ + +EXTERNL int +NC3_def_var(int ncid, const char *name, + nc_type xtype, int ndims, const int *dimidsp, int *varidp); + +EXTERNL int +NC3_inq_var(int ncid, int varid, char *name, + nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp); + +EXTERNL int +NC3_inq_varid(int ncid, const char *name, int *varidp); + +EXTERNL int +NC3_rename_var(int ncid, int varid, const char *name); + + +EXTERNL int +NC3_put_vara(int ncid, int varid, + const size_t *start, const size_t *count, + const void *value, nc_type); + +EXTERNL int +NC3_get_vara(int ncid, int varid, + const size_t *start, const size_t *count, + void *value, nc_type); + +/* End _var */ + +extern int NC3_initialize(); + + +#if defined(__cplusplus) +} +#endif + +#endif /*_NC3DISPATCH_H*/ diff --git a/extern/src_netcdf4/nc4attr.c b/extern/src_netcdf4/nc4attr.c new file mode 100644 index 0000000..92bba26 --- /dev/null +++ b/extern/src_netcdf4/nc4attr.c @@ -0,0 +1,897 @@ +/* +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file handles the nc4 attribute functions. + +Remember that with atts, type conversion can take place when writing +them, and when reading them. + +Copyright 2003-2011, University Corporation for Atmospheric +Research. See COPYRIGHT file for copying and redistribution +conditions. +*/ + +#include "nc4internal.h" +#include "nc.h" +#include "nc4dispatch.h" +#include "ncdispatch.h" + +#ifdef USE_PNETCDF +#include +#endif + +int nc4typelen(nc_type type); + +/* Get or put attribute metadata from our linked list of file + info. Always locate the attribute by name, never by attnum. + The mem_type is ignored if data=NULL. */ +int +nc4_get_att(int ncid, NC_FILE_INFO_T *nc, int varid, const char *name, + nc_type *xtype, nc_type mem_type, size_t *lenp, + int *attnum, int is_long, void *data) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_ATT_INFO_T *att; + int my_attnum = -1; + int need_to_convert = 0; + int range_error = NC_NOERR; + void *bufr = NULL; + size_t type_size; + char norm_name[NC_MAX_NAME + 1]; + int i; + int retval = NC_NOERR; + + if (attnum) + my_attnum = *attnum; + assert(nc && nc->nc4_info); + + LOG((3, "nc4_get_att: ncid 0x%x varid %d name %s attnum %d mem_type %d", + ncid, varid, name, my_attnum, mem_type)); + + /* Find info for this file and group, and set pointer to each. */ + h5 = nc->nc4_info; + if (!(grp = nc4_rec_find_grp(h5->root_grp, (ncid & GRP_ID_MASK)))) + return NC_EBADGRPID; + + /* Normalize name. */ + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + + /* Find the attribute, if it exists. If we don't find it, we are + major failures. */ + if ((retval = nc4_find_grp_att(grp, varid, norm_name, my_attnum, &att))) + return retval; + + /* If mem_type is NC_NAT, it means we want to use the attribute's + * file type as the mem type as well. */ + if (mem_type == NC_NAT) + mem_type = att->xtype; + + /* If the attribute is NC_CHAR, and the mem_type isn't, or vice + * versa, that's a freakish attempt to convert text to + * numbers. Some pervert out there is trying to pull a fast one! + * Send him an NC_ECHAR error...*/ + if (data && att->len && + ((att->xtype == NC_CHAR && mem_type != NC_CHAR) || + (att->xtype != NC_CHAR && mem_type == NC_CHAR))) + return NC_ECHAR; /* take that, you freak! */ + + /* Copy the info. */ + if (lenp) + *lenp = att->len; + if (xtype) + *xtype = att->xtype; + if (attnum) + *attnum = att->attnum; + + /* Zero len attributes are easy to read! */ + if (!att->len) + return NC_NOERR; + + /* Later on, we will need to know the size of this type. */ + if ((retval = nc4_get_typelen_mem(h5, mem_type, is_long, &type_size))) + return retval; + + /* We may have to convert data. Treat NC_CHAR the same as + * NC_UBYTE. If the mem_type is NAT, don't try any conversion - use + * the attribute's type. */ + if (data && att->len && mem_type != att->xtype && + mem_type != NC_NAT && + !(mem_type == NC_CHAR && + (att->xtype == NC_UBYTE || att->xtype == NC_BYTE))) + { + need_to_convert++; + if (!(bufr = malloc((size_t)(att->len * type_size)))) + return NC_ENOMEM; + if ((retval = nc4_convert_type(att->data, bufr, att->xtype, + mem_type, (size_t)att->len, &range_error, + NULL, (h5->cmode & NC_CLASSIC_MODEL), 0, is_long))) + BAIL(retval); + + /* For strict netcdf-3 rules, ignore erange errors between UBYTE + * and BYTE types. */ + if ((h5->cmode & NC_CLASSIC_MODEL) && + (att->xtype == NC_UBYTE || att->xtype == NC_BYTE) && + (mem_type == NC_UBYTE || mem_type == NC_BYTE) && + range_error) + range_error = 0; + } + else + { + bufr = att->data; + } + + /* If the caller wants data, copy it for him. If he hasn't + allocated enough memory for it, he will burn in segmantation + fault hell, writhing with the agony of undiscovered memory + bugs! */ + if (data) + { + if (att->vldata) + { + size_t base_typelen = type_size; + hvl_t *vldest = data; + NC_TYPE_INFO_T *type; + if ((retval = nc4_find_type(h5, att->xtype, &type))) + return retval; + for (i = 0; i < att->len; i++) + { + vldest[i].len = att->vldata[i].len; + if (!(vldest[i].p = malloc(vldest[i].len * base_typelen))) + BAIL(NC_ENOMEM); + memcpy(vldest[i].p, att->vldata[i].p, vldest[i].len * base_typelen); + } + } + else if (att->stdata) + { + for (i = 0; i < att->len; i++) + { + if (!(((char **)data)[i] = malloc(strlen(att->stdata[i]) + 1))) + BAIL(NC_ENOMEM); + strcpy(((char **)data)[i], att->stdata[i]); + } + } + else + { + /* For long types, we need to handle this special... */ + if (is_long && att->xtype == NC_INT) + { + long *lp = data; + int *ip = bufr; + for (i = 0; i < att->len; i++) + *lp++ = *ip++; + } + else + memcpy(data, bufr, (size_t)(att->len * type_size)); + } + } + + exit: + if (need_to_convert) free(bufr); + if (retval) + return retval; + if (range_error) + return NC_ERANGE; + return NC_NOERR; +} + +/* Put attribute metadata into our global metadata. */ +int +nc4_put_att(int ncid, NC_FILE_INFO_T *nc, int varid, const char *name, + nc_type file_type, nc_type mem_type, size_t len, int is_long, + const void *data) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var = NULL; + NC_ATT_INFO_T *att, **attlist = NULL, *varatt; + NC_TYPE_INFO_T *type = NULL; + char norm_name[NC_MAX_NAME + 1]; + int new_att = 0; + int retval = NC_NOERR, range_error = 0; + size_t type_size; + int i; + int res; + + if (!name) + return NC_EBADNAME; + assert(nc && nc->nc4_info); + + LOG((1, "nc4_put_att: ncid 0x%x varid %d name %s " + "file_type %d mem_type %d len %d", ncid, varid, + name, file_type, mem_type, len)); + + /* If len is not zero, then there must be some data. */ + if (len && !data) + return NC_EINVAL; + + /* Find info for this file and group, and set pointer to each. */ + h5 = nc->nc4_info; + if (!(grp = nc4_rec_find_grp(h5->root_grp, (ncid & GRP_ID_MASK)))) + return NC_EBADGRPID; + + /* If the file is read-only, return an error. */ + if (h5->no_write) + return NC_EPERM; + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + /* Find att, if it exists. */ + if (varid == NC_GLOBAL) + attlist = &grp->att; + else + { + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + { + attlist = &var->att; + break; + } + if (!var) + return NC_ENOTVAR; + } + for (att = *attlist; att; att = att->next) + if (!strcmp(att->name, norm_name)) + break; + + if (!att) + { + /* If this is a new att, require define mode. */ + if (!(h5->flags & NC_INDEF)) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_EINDEFINE; + if ((retval = NC4_redef(ncid))) + BAIL(retval); + } + new_att++; + } + else + { + /* For an existing att, if we're not in define mode, the len + must not be greater than the existing len for classic model. */ + if (!(h5->flags & NC_INDEF) && + len * nc4typelen(file_type) > (size_t)att->len * nc4typelen(att->xtype)) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_EINDEFINE; + if ((retval = NC4_redef(ncid))) + BAIL(retval); + } + } + + /* We must have two valid types to continue. */ + if (file_type == NC_NAT || mem_type == NC_NAT) + return NC_EBADTYPE; + + /* Get information about this type. */ + if ((retval = nc4_find_type(h5, file_type, &type))) + return retval; + if ((retval = nc4_get_typelen_mem(h5, file_type, is_long, &type_size))) + return retval; + + /* No character conversions are allowed. */ + if (file_type != mem_type && + (file_type == NC_CHAR || mem_type == NC_CHAR || + file_type == NC_STRING || mem_type == NC_STRING)) + return NC_ECHAR; + + /* For classic mode file, only allow atts with classic types to be + * created. */ + if (h5->cmode & NC_CLASSIC_MODEL && file_type > NC_DOUBLE) + return NC_ESTRICTNC3; + + /* Add to the end of the attribute list, if this att doesn't + already exist. */ + if (new_att) + { + LOG((3, "adding attribute %s to the list...", norm_name)); + if ((res = nc4_att_list_add(attlist))) + BAIL (res); + /* Find this att's entry in the list (the last one). */ + for (att=*attlist; att->next; att=att->next) + ; + } + + /* Now fill in the metadata. */ + att->dirty++; + if (att->name) + free(att->name); + if (!(att->name = malloc((strlen(norm_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(att->name, norm_name); + att->xtype = file_type; + att->len = len; + if (att->prev) + att->attnum = att->prev->attnum + 1; + else + att->attnum = 0; + if (type) + att->class = type->class; + + /* If this is the _FillValue attribute, then we will also have to + * copy the value to the fll_vlue pointer of the NC_VAR_INFO_T + * struct for this var. (But ignore a global _FillValue + * attribute). */ + if (!strcmp(att->name, _FillValue) && varid != NC_GLOBAL) + { + NC_TYPE_INFO_T *type_info; + int size; + + /* Fill value must be same type. */ + if (att->xtype != var->xtype) + return NC_EINVAL; + + /* If we already wrote to the dataset, then return an error. */ + if (var->written_to) + return NC_ELATEFILL; + + /* If fill value hasn't been set, allocate space. Of course, + * vlens have to be differnt... */ + if ((retval = nc4_get_typelen_mem(grp->file->nc4_info, var->xtype, 0, + &type_size))) + return retval; + if ((retval = nc4_find_type(grp->file->nc4_info, var->xtype, &type_info))) + BAIL(retval); + + /* Already set a fill value? Now I'll have to free the old + * one. Make up your damn mind, would you? */ + if (var->fill_value) + { + if (type_info && type_info->class == NC_VLEN) + if ((retval = nc_free_vlen(var->fill_value))) + return retval; + free(var->fill_value); + } + + /* Allocate space for the fill value. */ + if (type_info && type_info->class == NC_VLEN) + size = sizeof(hvl_t); + else if (var->xtype == NC_STRING) + size = sizeof(char *); + else + size = type_size; + + /* size = strlen(*(char **)data) + 1; */ + if (!(var->fill_value = malloc(size))) + return NC_ENOMEM; + + /* Copy the fill_value. */ + LOG((4, "Copying fill value into metadata for variable %s", var->name)); + if (type_info && type_info->class == NC_VLEN) + { + nc_vlen_t *in_vlen = (nc_vlen_t *)data, *fv_vlen = (nc_vlen_t *)(var->fill_value); + fv_vlen->len = in_vlen->len; + if (!(fv_vlen->p = malloc(size * in_vlen->len))) + return NC_ENOMEM; + memcpy(fv_vlen->p, in_vlen->p, in_vlen->len * size); + } + else if (var->xtype == NC_STRING) + { + if (!(*(char **)var->fill_value = malloc(strlen(*(char **)data) + 1))) + return NC_ENOMEM; + strcpy(*(char **)(var->fill_value), *(char **)data); + } + else + memcpy(var->fill_value, data, type_size); + + /* Mark the var and all its atts as dirty, so they get + * rewritten. */ + var->dirty++; + for (varatt = var->att; varatt; varatt = varatt->next) + varatt->dirty++; + } + + /* Copy the attribute data, if there is any. VLENs and string + * arrays have to be handled specially. */ + if (type && type->class == NC_VLEN && data && att->len) + { + const hvl_t *vldata1; + + vldata1 = data; + if (!(att->vldata = malloc(att->len * sizeof(hvl_t)))) + BAIL(NC_ENOMEM); + for (i = 0; i < att->len; i++) + { + att->vldata[i].len = vldata1[i].len; + if (!(att->vldata[i].p = malloc(type_size * att->vldata[i].len))) + BAIL(NC_ENOMEM); + memcpy(att->vldata[i].p, vldata1[i].p, type_size * att->vldata[i].len); + } + } + else if (file_type == NC_STRING && data && att->len) + { + LOG((4, "copying array of NC_STRING")); + if (!(att->stdata = malloc(sizeof(char *) * att->len))) + BAIL(NC_ENOMEM); + for (i = 0; i < att->len; i++) + { + LOG((5, "copying string %d of size %d", i, strlen(((char **)data)[i]) + 1)); + if (!(att->stdata[i] = malloc(strlen(((char **)data)[i]) + 1))) + BAIL(NC_ENOMEM); + strcpy(att->stdata[i], ((char **)data)[i]); + } + } + else + { + /* Data types are like religions, in that one can convert. */ + if (att->len) + { + if (!new_att) + free (att->data); + if (!(att->data = malloc(att->len * type_size))) + BAIL(NC_ENOMEM); + if (type) + { + /* Just copy the data... */ + if (type->class == NC_OPAQUE || type->class == NC_COMPOUND || type->class == NC_ENUM) + memcpy(att->data, data, len * type_size); + else + LOG((0, "nc4_put_att: unknown type.")); + } + else + { + if ((retval = nc4_convert_type(data, att->data, mem_type, file_type, + len, &range_error, NULL, + (h5->cmode & NC_CLASSIC_MODEL), is_long, 0))) + BAIL(retval); + } + } + } + att->dirty = 1; + att->created = 0; + + exit: + /* If there was an error return it, otherwise return any potential + range error value. If none, return NC_NOERR as usual.*/ + if (retval) + return retval; + if (range_error) + return NC_ERANGE; + return NC_NOERR; +} + +/* Learn about an att. All the nc4 nc_inq_ functions just call + * add_meta_get to get the metadata on an attribute. */ +int +NC4_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc_inq_att: ncid 0x%x varid %d name %s", ncid, varid, name)); + + /* Find metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + MPI_Offset mpi_len; + int ret; + + if ((ret = ncmpi_inq_att(nc->int_ncid, varid, name, xtypep, &mpi_len))) + return ret; + if (lenp) + *lenp = mpi_len; + } +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(nc->nc4_info); + + /* Handle netcdf-4 files. */ + return nc4_get_att(ncid, nc, varid, name, xtypep, NC_UBYTE, lenp, NULL, 0, NULL); +} + +/* Learn an attnum, given a name. */ +int +NC4_inq_attid(int ncid, int varid, const char *name, int *attnump) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc_inq_attid: ncid 0x%x varid %d name %s", ncid, varid, name)); + + /* Find metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_inq_attid(nc->int_ncid, varid, name, attnump); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(nc->nc4_info); + + /* Handle netcdf-4 files. */ + return nc4_get_att(ncid, nc, varid, name, NULL, NC_UBYTE, + NULL, attnump, 0, NULL); +} + + +/* Given an attnum, find the att's name. */ +int +NC4_inq_attname(int ncid, int varid, int attnum, char *name) +{ + NC_FILE_INFO_T *nc; + NC_ATT_INFO_T *att; + int retval = NC_NOERR; + + LOG((2, "nc_inq_attname: ncid 0x%x varid %d attnum %d", + ncid, varid, attnum)); + + /* Find metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_inq_attname(nc->int_ncid, varid, attnum, name); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(nc->nc4_info); + + /* Handle netcdf-4 files. */ + if ((retval = nc4_find_nc_att(ncid, varid, NULL, attnum, &att))) + return retval; + + /* Get the name. */ + if (name) + strcpy(name, att->name); + + return NC_NOERR; +} + +/* I think all atts should be named the exact same thing, to avoid + confusion! */ +int +NC4_rename_att(int ncid, int varid, const char *name, + const char *newname) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_ATT_INFO_T *att, *list; + char norm_newname[NC_MAX_NAME + 1], norm_name[NC_MAX_NAME + 1]; + hid_t datasetid = 0; + int retval = NC_NOERR; + + if (!name || !newname) + return NC_EINVAL; + + LOG((2, "nc_rename_att: ncid 0x%x varid %d name %s newname %s", + ncid, varid, name, newname)); + + /* If the new name is too long, that's an error. */ + if (strlen(newname) > NC_MAX_NAME) + return NC_EMAXNAME; + + /* Find metadata for this file. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_rename_att(nc->int_ncid, varid, name, newname); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(h5); + + /* If the file is read-only, return an error. */ + if (h5->no_write) + return NC_EPERM; + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(newname, norm_newname))) + return retval; + + /* Is norm_newname in use? */ + if (varid == NC_GLOBAL) + { + list = grp->att; + } + else + { + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + { + list = var->att; + break; + } + if (!var) + return NC_ENOTVAR; + } + for (att = list; att; att = att->next) + if (!strncmp(att->name, norm_newname, NC_MAX_NAME)) + return NC_ENAMEINUSE; + + /* Normalize name and find the attribute. */ + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + for (att = list; att; att = att->next) + if (!strncmp(att->name, norm_name, NC_MAX_NAME)) + break; + if (!att) + return NC_ENOTATT; + + /* If we're not in define mode, new name must be of equal or + less size, if complying with strict NC3 rules. */ + if (!(h5->flags & NC_INDEF) && strlen(norm_newname) > strlen(att->name) && + (h5->cmode & NC_CLASSIC_MODEL)) + return NC_ENOTINDEFINE; + + /* Delete the original attribute, if it exists in the HDF5 file. */ + if (att->created) + { + if (varid == NC_GLOBAL) + { + if (H5Adelete(grp->hdf_grpid, att->name) < 0) + return NC_EHDFERR; + } + else + { + if ((retval = nc4_open_var_grp2(grp, varid, &datasetid))) + return retval; + if (H5Adelete(datasetid, att->name) < 0) + return NC_EHDFERR; + } + att->created = 0; + } + + /* Copy the new name into our metadata. */ + free(att->name); + if (!(att->name = malloc((strlen(norm_newname) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(att->name, norm_newname); + att->dirty = 1; + + return retval; +} + +/* Delete an att. Rub it out. Push the button on it. Liquidate + it. Bump it off. Take it for a one-way ride. Terminate it. Drop the + bomb on it. You get the idea. + Ed Hartnett, 10/1/3 +*/ +int +NC4_del_att(int ncid, int varid, const char *name) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_ATT_INFO_T *att, *natt; + NC_VAR_INFO_T *var; + NC_ATT_INFO_T **attlist = NULL; + hid_t locid = 0, datasetid = 0; + int retval = NC_NOERR; + + if (!name) + return NC_EINVAL; + + LOG((2, "nc_del_att: ncid 0x%x varid %d name %s", + ncid, varid, name)); + + /* Find metadata for this file. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_del_att(nc->int_ncid, varid, name); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(h5); + + assert(h5 && grp); + + /* If the file is read-only, return an error. */ + if (h5->no_write) + return NC_EPERM; + + /* If it's not in define mode, forget it. */ + if (!(h5->flags & NC_INDEF)) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_ENOTINDEFINE; + if ((retval = NC4_redef(ncid))) + BAIL(retval); + } + + /* Get either the global or a variable attribute list. Also figure + out the HDF5 location it's attached to. */ + if (varid == NC_GLOBAL) + { + attlist = &grp->att; + locid = grp->hdf_grpid; + } + else + { + for(var = grp->var; var; var = var->next) + { + if (var->varid == varid) + { + attlist = &var->att; + break; + } + } + if (!var) + return NC_ENOTVAR; + if (var->created) + { + locid = var->hdf_datasetid; + } + } + + /* Now find the attribute by name or number. */ + for (att = *attlist; att; att = att->next) + if (!strcmp(att->name, name)) + break; + + /* If att is NULL, we couldn't find the attribute. */ + if (!att) + BAIL_QUIET(NC_ENOTATT); + + /* Delete it from the HDF5 file, if it's been created. */ + if (att->created) + if(H5Adelete(locid, att->name) < 0) + BAIL(NC_EATTMETA); + + /* Renumber all following attributes. */ + for (natt = att->next; natt; natt = natt->next) + natt->attnum--; + + /* Delete this attribute from this list. */ + if ((retval = nc4_att_list_del(attlist, att))) + BAIL(retval); + + exit: + if (datasetid > 0) H5Dclose(datasetid); + return retval; +} + +/* Write an attribute with type conversion. */ +int +nc4_put_att_tc(int ncid, int varid, const char *name, nc_type file_type, + nc_type mem_type, int mem_type_is_long, size_t len, + const void *op) +{ + NC_FILE_INFO_T *nc; + + if (!name || strlen(name) > NC_MAX_NAME) + return NC_EBADNAME; + + LOG((3, "nc4_put_att_tc: ncid 0x%x varid %d name %s file_type %d " + "mem_type %d len %d", ncid, varid, name, file_type, mem_type, len)); + + /* The length needs to be positive (cast needed for braindead + systems with signed size_t). */ + if((unsigned long) len > X_INT_MAX) + return NC_EINVAL; + + /* Find metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + if (mem_type == NC_UBYTE) + mem_type = NC_BYTE; + switch(mem_type) + { + case NC_BYTE: + return ncmpi_put_att_schar(nc->int_ncid, varid, name, + file_type, len, op); + case NC_CHAR: + return ncmpi_put_att_text(nc->int_ncid, varid, name, + len, op); + case NC_SHORT: + return ncmpi_put_att_short(nc->int_ncid, varid, name, + file_type, len, op); + case NC_INT: + if (mem_type_is_long) + return ncmpi_put_att_long(nc->int_ncid, varid, name, + file_type, len, op); + else + return ncmpi_put_att_int(nc->int_ncid, varid, name, + file_type, len, op); + case NC_FLOAT: + return ncmpi_put_att_float(nc->int_ncid, varid, name, + file_type, len, op); + case NC_DOUBLE: + return ncmpi_put_att_double(nc->int_ncid, varid, name, + file_type, len, op); + case NC_NAT: + default: + return NC_EBADTYPE; + } + } +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(nc->nc4_info); + + /* Otherwise, handle things the netcdf-4 way. */ + return nc4_put_att(ncid, nc, varid, name, file_type, mem_type, len, + mem_type_is_long, op); +} + +/* Read an attribute of any type, with type conversion. This may be + * called by any of the nc_get_att_* functions. */ +int +nc4_get_att_tc(int ncid, int varid, const char *name, nc_type mem_type, + int mem_type_is_long, void *ip) +{ + NC_FILE_INFO_T *nc; + + LOG((3, "nc4_get_att_tc: ncid 0x%x varid %d name %s mem_type %d", + ncid, varid, name, mem_type)); + + /* Find metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + if (mem_type == NC_UBYTE) + mem_type = NC_BYTE; + switch(mem_type) + { + case NC_BYTE: + return ncmpi_get_att_schar(nc->int_ncid, varid, name, ip); + case NC_CHAR: + return ncmpi_get_att_text(nc->int_ncid, varid, name, ip); + case NC_SHORT: + return ncmpi_get_att_short(nc->int_ncid, varid, name, ip); + case NC_INT: + if (mem_type_is_long) + return ncmpi_get_att_long(nc->int_ncid, varid, name, ip); + else + return ncmpi_get_att_int(nc->int_ncid, varid, name, ip); + case NC_FLOAT: + return ncmpi_get_att_float(nc->int_ncid, varid, name, ip); + case NC_DOUBLE: + return ncmpi_get_att_double(nc->int_ncid, varid, name, ip); + case NC_NAT: + default: + return NC_EBADTYPE; + } + } +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(nc->nc4_info); + + return nc4_get_att(ncid, nc, varid, name, NULL, mem_type, + NULL, NULL, mem_type_is_long, ip); +} + +int +NC4_put_att(int ncid, int varid, const char *name, nc_type xtype, + size_t nelems, const void *value, nc_type memtype) +{ + return nc4_put_att_tc(ncid, varid, name, xtype, memtype, 0, nelems, value); +} + +int +NC4_get_att(int ncid, int varid, const char *name, void *value, nc_type memtype) +{ + return nc4_get_att_tc(ncid, varid, name, memtype, 0, value); +} diff --git a/extern/src_netcdf4/nc4dim.c b/extern/src_netcdf4/nc4dim.c new file mode 100644 index 0000000..3651eb7 --- /dev/null +++ b/extern/src_netcdf4/nc4dim.c @@ -0,0 +1,401 @@ +/* + +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file handles the nc4 dimension functions. + +Copyright 2003-5, University Corporation for Atmospheric Research. See +the COPYRIGHT file for copying and redistribution conditions. + +$Id: nc4dim.c,v 1.41 2010/05/25 17:54:23 dmh Exp $ +*/ + +#include "nc4internal.h" + +#ifdef USE_PNETCDF +#include +#endif + +/* Netcdf-4 files might have more than one unlimited dimension, but + return the first one anyway. */ +/* Note that this code is inconsistent with nc_inq */ +int +NC4_inq_unlimdim(int ncid, int *unlimdimidp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + NC_DIM_INFO_T *dim; + int found = 0; + int retval; + + LOG((2, "called nc_inq_unlimdim")); + + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_inq_unlimdim(nc->int_ncid, unlimdimidp); +#endif /* USE_PNETCDF */ + + /* Take care of netcdf-3 files. */ + assert(h5); + + /* According to netcdf-3 manual, return -1 if there is no unlimited + dimension. */ + *unlimdimidp = -1; + for (g = grp; g && !found; g = g->parent) + { + for (dim = g->dim; dim; dim = dim->next) + { + if (dim->unlimited) + { + *unlimdimidp = dim->dimid; + found++; + break; + } + } + } + + return NC_NOERR; +} + +/* Dimensions are defined in attributes attached to the appropriate + group in the data file. */ +int +NC4_def_dim(int ncid, const char *name, size_t len, int *idp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_DIM_INFO_T *dim; + char norm_name[NC_MAX_NAME + 1]; + int retval = NC_NOERR; + + LOG((2, "nc_def_dim: ncid 0x%x name %s len %d", ncid, name, + (int)len)); + + /* Find our global metadata structure. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_def_dim(nc->int_ncid, name, len, idp); +#endif /* USE_PNETCDF */ + + /* Take care of netcdf-3 files. */ + assert(h5); + + assert(h5 && nc && grp); + + /* If the file is read-only, return an error. */ + if (h5->no_write) + return NC_EPERM; + + /* Check some stuff if strict nc3 rules are in effect. */ + if (h5->cmode & NC_CLASSIC_MODEL) + { + /* Only one limited dimenson for strict nc3. */ + if (len == NC_UNLIMITED) + for (dim = grp->dim; dim; dim = dim->next) + if (dim->unlimited) + return NC_EUNLIMIT; + + /* Must be in define mode for stict nc3. */ + if (!(h5->flags & NC_INDEF)) + return NC_ENOTINDEFINE; + } + + /* If it's not in define mode, enter define mode. */ + if (!(h5->flags & NC_INDEF)) + if ((retval = nc_redef(ncid))) + return retval; + + /* Make sure this is a valid netcdf name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + /* For classic model: dim length has to fit in a 32-bit unsigned + * int, as permitted for 64-bit offset format. */ + if (h5->cmode & NC_CLASSIC_MODEL) + if(len > X_UINT_MAX) /* Backward compat */ + return NC_EDIMSIZE; + + /* Make sure the name is not already in use. */ + for (dim = grp->dim; dim; dim = dim->next) + if (!strncmp(dim->name, norm_name, NC_MAX_NAME)) + return NC_ENAMEINUSE; + + /* Add a dimension to the list. The ID must come from the file + * information, since dimids are visible in more than one group. */ + nc4_dim_list_add(&grp->dim); + grp->dim->dimid = grp->file->nc4_info->next_dimid++; + + /* Initialize the metadata for this dimension. */ + if (!(grp->dim->name = malloc((strlen(norm_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(grp->dim->name, norm_name); + grp->dim->len = len; + grp->dim->dirty++; + if (len == NC_UNLIMITED) + grp->dim->unlimited++; + + /* Pass back the dimid. */ + if (idp) + *idp = grp->dim->dimid; + + return retval; +} + +/* Given dim name, find its id. */ +int +NC4_inq_dimid(int ncid, const char *name, int *idp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + NC_DIM_INFO_T *dim; + char norm_name[NC_MAX_NAME + 1]; + int finished = 0; + int retval; + + LOG((2, "nc_inq_dimid: ncid 0x%x name %s", ncid, name)); + + /* Find metadata for this file. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_inq_dimid(nc->int_ncid, name, idp); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(h5); + + assert(nc && grp); + + /* Normalize name. */ + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + + /* Go through each dim and check for a name match. */ + for (g = grp; g && !finished; g = g->parent) + for (dim = g->dim; dim; dim = dim->next) + if (!strncmp(dim->name, norm_name, NC_MAX_NAME)) + { + if (idp) + *idp = dim->dimid; + return NC_NOERR; + } + + return NC_EBADDIM; +} + +/* Find out name and len of a dim. For an unlimited dimension, the + length is the largest lenght so far written. If the name of lenp + pointers are NULL, they will be ignored. */ +int +NC4_inq_dim(int ncid, int dimid, char *name, size_t *lenp) +{ + NC_FILE_INFO_T *nc; + NC_HDF5_FILE_INFO_T *h5; + NC_GRP_INFO_T *grp, *dim_grp; + NC_DIM_INFO_T *dim; + int ret = NC_NOERR; + + LOG((2, "nc_inq_dim: ncid 0x%x dimid %d", ncid, dimid)); + + /* Find our global metadata structure. */ + if ((ret = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return ret; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + MPI_Offset mpi_len; + if ((ret = ncmpi_inq_dim(nc->int_ncid, dimid, name, &mpi_len))) + return ret; + if (lenp) + *lenp = mpi_len; + } +#endif /* USE_PNETCDF */ + + /* Take care of netcdf-3 files. */ + assert(h5); + + assert(nc && grp); + + /* Find the dimension and its home group. */ + if ((ret = nc4_find_dim(grp, dimid, &dim, &dim_grp))) + return ret; + assert(dim); + + /* Return the dimension name, if the caller wants it. */ + if (name && dim->name) + strcpy(name, dim->name); + + /* Return the dimension length, if the caller wants it. */ + if (lenp) + { + if (dim->unlimited) + { + /* Since this is an unlimited dimension, go to the file + and see how many records there are. Take the max number + of records from all the vars that share this + dimension. */ + *lenp = 0; + if ((ret = nc4_find_dim_len(dim_grp, dimid, &lenp))) + return ret; + } + else + { + if (dim->too_long) + { + ret = NC_EDIMSIZE; + *lenp = NC_MAX_UINT; + } + else + *lenp = dim->len; + } + } + + return ret; +} + +/* Rename a dimension, for those who like to prevaricate. */ +int +NC4_rename_dim(int ncid, int dimid, const char *name) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_DIM_INFO_T *dim; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + if (!name) + return NC_EINVAL; + + LOG((2, "nc_rename_dim: ncid 0x%x dimid %d name %s", ncid, + dimid, name)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + assert(nc); + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_rename_dim(nc->int_ncid, dimid, name); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 cases. */ + assert(h5); + assert(h5 && grp); + + /* Trying to write to a read-only file? No way, Jose! */ + if (h5->no_write) + return NC_EPERM; + + /* Make sure this is a valid netcdf name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + /* Make sure the new name is not already in use in this group. */ + for (dim = grp->dim; dim; dim = dim->next) + if (!strncmp(dim->name, norm_name, NC_MAX_NAME)) + return NC_ENAMEINUSE; + + /* Find the dim. */ + for (dim = grp->dim; dim; dim = dim->next) + if (dim->dimid == dimid) + break; + if (!dim) + return NC_EBADDIM; + + /* If not in define mode, switch to it, unless the new name is + * shorter. (This is in accordance with the v3 interface.) */ +/* if (!(h5->flags & NC_INDEF) && strlen(name) > strlen(dim->name)) */ +/* { */ +/* if (h5->cmode & NC_CLASSIC_MODEL) */ +/* return NC_ENOTINDEFINE; */ +/* if ((retval = nc_redef(ncid))) */ +/* return retval; */ +/* } */ + + /* Save the old name, we'll need it to rename this object when we + * sync to HDF5 file. But if there already is an old_name saved, + * just stick with what we've got, since the user might be renaming + * the crap out of this thing, without ever syncing with the + * file. When the sync does take place, we only need the original + * name of the dim, not any of the intermediate ones. If the user + * could just make up his mind, we could all get on to writing some + * data... */ + if (!dim->old_name) + { + if (!(dim->old_name = malloc((strlen(dim->name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(dim->old_name, dim->name); + } + + /* Give the dimension its new name in metadata. UTF8 normalization + * has been done. */ + free(dim->name); + if (!(dim->name = malloc((strlen(norm_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(dim->name, norm_name); + + return NC_NOERR; +} + +/* Returns an array of unlimited dimension ids.The user can get the + number of unlimited dimensions by first calling this with NULL for + the second pointer. +*/ +int +NC4_inq_unlimdims(int ncid, int *nunlimdimsp, int *unlimdimidsp) +{ + NC_DIM_INFO_T *dim; + NC_GRP_INFO_T *grp; + NC_FILE_INFO_T *nc; + NC_HDF5_FILE_INFO_T *h5; + int num_unlim = 0; + int retval; + + LOG((2, "nc_inq_unlimdims: ncid 0x%x", ncid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + + /* Get our dim info. */ + assert(h5); + { + for (dim=grp->dim; dim; dim=dim->next) + { + if (dim->unlimited) + { + if (unlimdimidsp) + unlimdimidsp[num_unlim] = dim->dimid; + num_unlim++; + } + } + } + + /* Give the number if the user wants it. */ + if (nunlimdimsp) + *nunlimdimsp = num_unlim; + + return NC_NOERR; +} + + diff --git a/extern/src_netcdf4/nc4dispatch.c b/extern/src_netcdf4/nc4dispatch.c new file mode 100644 index 0000000..ca316cb --- /dev/null +++ b/extern/src_netcdf4/nc4dispatch.c @@ -0,0 +1,110 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libsrc4/nc4dispatch.c,v 1.5 2010/05/27 02:19:37 dmh Exp $ + *********************************************************************/ + +#include "config.h" +#include +#include "nc.h" +#include "ncdispatch.h" +#include "nc4dispatch.h" + +NC_Dispatch NC4_dispatcher = { + +NC_DISPATCH_NC4, + +NC4_new_nc, + +NC4_create, +NC4_open, + +NC4_redef, +NC4__enddef, +NC4_sync, +NC4_abort, +NC4_close, +NC4_set_fill, +NC4_inq_base_pe, +NC4_set_base_pe, +NC4_inq_format, + +NC4_inq, +NC4_inq_type, + +NC4_def_dim, +NC4_inq_dimid, +NC4_inq_dim, +NC4_inq_unlimdim, +NC4_rename_dim, + +NC4_inq_att, +NC4_inq_attid, +NC4_inq_attname, +NC4_rename_att, +NC4_del_att, +NC4_get_att, +NC4_put_att, + +NC4_def_var, +NC4_inq_varid, +NC4_rename_var, +NC4_get_vara, +NC4_put_vara, +NCDEFAULT_get_vars, +NCDEFAULT_put_vars, +NCDEFAULT_get_varm, +NCDEFAULT_put_varm, + +NC4_inq_var_all, + +NC4_show_metadata, +NC4_inq_unlimdims, + +NC4_var_par_access, + +NC4_inq_ncid, +NC4_inq_grps, +NC4_inq_grpname, +NC4_inq_grpname_full, +NC4_inq_grp_parent, +NC4_inq_grp_full_ncid, +NC4_inq_varids, +NC4_inq_dimids, +NC4_inq_typeids, +NC4_inq_type_equal, +NC4_def_grp, +NC4_inq_user_type, +NC4_inq_typeid, + +NC4_def_compound, +NC4_insert_compound, +NC4_insert_array_compound, +NC4_inq_compound_field, +NC4_inq_compound_fieldindex, +NC4_def_vlen, +NC4_put_vlen_element, +NC4_get_vlen_element, +NC4_def_enum, +NC4_insert_enum, +NC4_inq_enum_member, +NC4_inq_enum_ident, +NC4_def_opaque, +NC4_def_var_deflate, +NC4_def_var_fletcher32, +NC4_def_var_chunking, +NC4_def_var_fill, +NC4_def_var_endian, +NC4_set_var_chunk_cache, +NC4_get_var_chunk_cache, + +}; + +NC_Dispatch* NC4_dispatch_table = NULL; /* moved here from ddispatch.c */ + +int +NC4_initialize(void) +{ + NC4_dispatch_table = &NC4_dispatcher; + return NC_NOERR; +} diff --git a/extern/src_netcdf4/nc4dispatch.h b/extern/src_netcdf4/nc4dispatch.h new file mode 100644 index 0000000..feea0aa --- /dev/null +++ b/extern/src_netcdf4/nc4dispatch.h @@ -0,0 +1,271 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata. See netcdf/COPYRIGHT file for copying + * and redistribution conditions. + * + * This header file contains the prototypes for the netCDF-4 versions + * of all the netCDF functions. + *********************************************************************/ + +#ifndef _NC4DISPATCH_H +#define _NC4DISPATCH_H + +#include "config.h" +#include /* size_t, ptrdiff_t */ +#include /* netcdf functions sometimes return system errors */ +#include "ncdispatch.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +extern int +NC4_create(const char *path, int cmode, + size_t initialsz, int basepe, size_t *chunksizehintp, + int useparallel, void* parameters, + NC_Dispatch*, NC**); + +extern int +NC4_open(const char *path, int mode, + int basepe, size_t *chunksizehintp, + int use_parallel, void* parameters, + NC_Dispatch*, NC**); + +extern int +NC4_new_nc(NC**); + +extern int +NC4_free_nc(NC*); + +extern int +NC4_redef(int ncid); + +extern int +NC4__enddef(int ncid, size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align); + +extern int +NC4_sync(int ncid); + +extern int +NC4_abort(int ncid); + +extern int +NC4_close(int ncid); + +extern int +NC4_set_fill(int ncid, int fillmode, int *old_modep); + +extern int +NC4_set_base_pe(int ncid, int pe); + +extern int +NC4_inq_base_pe(int ncid, int *pe); + +extern int +NC4_inq_format(int ncid, int *formatp); + +extern int +NC4_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp); + +extern int +NC4_inq_type(int, nc_type, char *, size_t *); + +/* Begin _dim */ + +extern int +NC4_def_dim(int ncid, const char *name, size_t len, int *idp); + +extern int +NC4_inq_dimid(int ncid, const char *name, int *idp); + +extern int +NC4_inq_dim(int ncid, int dimid, char *name, size_t *lenp); + +extern int +NC4_inq_unlimdim(int ncid, int *unlimdimidp); + +extern int +NC4_rename_dim(int ncid, int dimid, const char *name); + +/* End _dim */ +/* Begin _att */ + +extern int +NC4_inq_att(int ncid, int varid, const char *name, + nc_type *xtypep, size_t *lenp); + +extern int +NC4_inq_attid(int ncid, int varid, const char *name, int *idp); + +extern int +NC4_inq_attname(int ncid, int varid, int attnum, char *name); + +extern int +NC4_rename_att(int ncid, int varid, const char *name, const char *newname); + +extern int +NC4_del_att(int ncid, int varid, const char*); + +/* End _att */ +/* Begin {put,get}_att */ + +extern int +NC4_get_att(int ncid, int varid, const char *name, void *value, nc_type); + +extern int +NC4_put_att(int ncid, int varid, const char *name, nc_type datatype, + size_t len, const void *value, nc_type); + +/* End {put,get}_att */ +/* Begin _var */ + +extern int +NC4_def_var(int ncid, const char *name, + nc_type xtype, int ndims, const int *dimidsp, int *varidp); + +extern int +NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp, + int *shufflep, int *deflatep, int *deflate_levelp, + int *fletcher32p, int *contiguousp, size_t *chunksizesp, + int *no_fill, void *fill_valuep, int *endiannessp, + int *options_maskp, int *pixels_per_blockp); + +extern int +NC4_inq_varid(int ncid, const char *name, int *varidp); + +extern int +NC4_rename_var(int ncid, int varid, const char *name); + +extern int +NC4_put_vara(int ncid, int varid, + const size_t *start, const size_t *count, + const void *value, nc_type); + +extern int +NC4_get_vara(int ncid, int varid, + const size_t *start, const size_t *count, + void *value, nc_type); + +/* End _var */ + +/* netCDF4 API only */ +extern int +NC4_var_par_access(int, int, int); + +extern int +NC4_inq_ncid(int, const char *, int *); + +extern int +NC4_inq_grps(int, int *, int *); + +extern int +NC4_inq_grpname(int, char *); + +extern int +NC4_inq_grpname_full(int, size_t *, char *); + +extern int +NC4_inq_grp_parent(int, int *); + +extern int +NC4_inq_grp_full_ncid(int, const char *, int *); + +extern int +NC4_inq_varids(int, int * nvars, int *); + +extern int +NC4_inq_dimids(int, int * ndims, int *, int); + +extern int +NC4_inq_typeids(int, int * ntypes, int *); + +extern int +NC4_inq_type_equal(int, nc_type, int, nc_type, int *); + +extern int +NC4_def_grp(int, const char *, int *); + +extern int +NC4_inq_user_type(int, nc_type, char *, size_t *, nc_type *, + size_t *, int *); + +extern int +NC4_def_compound(int, size_t, const char *, nc_type *); + +extern int +NC4_insert_compound(int, nc_type, const char *, size_t, nc_type); + +extern int +NC4_insert_array_compound(int, nc_type, const char *, size_t, + nc_type, int, const int *); + +extern int +NC4_inq_typeid(int, const char *, nc_type *); + +extern int +NC4_inq_compound_field(int, nc_type, int, char *, size_t *, + nc_type *, int *, int *); + +extern int +NC4_inq_compound_fieldindex(int, nc_type, const char *, int *); + +extern int +NC4_def_vlen(int, const char *, nc_type base_typeid, nc_type *); + +extern int +NC4_put_vlen_element(int, int, void *, size_t, const void *); + +extern int +NC4_get_vlen_element(int, int, const void *, size_t *, void *); + +extern int +NC4_def_enum(int, nc_type, const char *, nc_type *); + +extern int +NC4_insert_enum(int, nc_type, const char *, const void *); + +extern int +NC4_inq_enum_member(int, nc_type, int, char *, void *); + +extern int +NC4_inq_enum_ident(int, nc_type, long long, char *); + +extern int +NC4_def_opaque(int, size_t, const char *, nc_type *); + +extern int +NC4_def_var_deflate(int, int, int, int, int); + +extern int +NC4_def_var_fletcher32(int, int, int); + +extern int +NC4_def_var_chunking(int, int, int, const size_t *); + +extern int +NC4_def_var_fill(int, int, int, const void *); + +extern int +NC4_def_var_endian(int, int, int); + +extern int +NC4_set_var_chunk_cache(int, int, size_t, size_t, float); + +extern int +NC4_get_var_chunk_cache(int, int, size_t *, size_t *, float *); + +extern int +NC4_inq_unlimdims(int, int *, int *); + +extern int +NC4_show_metadata(int); + +extern int +NC4_initialize(void); + +#if defined(__cplusplus) +} +#endif + +#endif /*_NC4DISPATCH_H */ diff --git a/extern/src_netcdf4/nc4file.c b/extern/src_netcdf4/nc4file.c new file mode 100644 index 0000000..bea85d8 --- /dev/null +++ b/extern/src_netcdf4/nc4file.c @@ -0,0 +1,3203 @@ +/** \file +The netCDF-4 file functions. + +This file is part of netcdf-4, a netCDF-like interface for HDF5, or +a HDF5 backend for netCDF, depending on your point of view. + +Copyright 2003, University Corporation for Atmospheric Research. See +COPYRIGHT file for copying and redistribution conditions. +*/ + +#include "nc4internal.h" +#include "nc.h" +#include +#include "nc4dispatch.h" +#include "ncdispatch.h" + +#ifdef USE_HDF4 +#include +#endif + +#ifdef USE_PNETCDF +#include +#endif + +/* This is to track opened HDF5 objects to make sure they are + * closed. */ +#ifdef EXTRA_TESTS +extern int num_plists; +extern int num_spaces; +#endif /* EXTRA_TESTS */ + +#define MIN_DEFLATE_LEVEL 0 +#define MAX_DEFLATE_LEVEL 9 + +/* These are the special attributes added by the HDF5 dimension scale + * API. They will be ignored by netCDF-4. */ +#define REFERENCE_LIST "REFERENCE_LIST" +#define CLASS "CLASS" +#define DIMENSION_LIST "DIMENSION_LIST" +#define NAME "NAME" + +/* Forward */ +static int NC4_enddef(int ncid); +static int nc4_rec_read_types(NC_GRP_INFO_T *grp); +static int nc4_rec_read_vars(NC_GRP_INFO_T *grp); + +#ifdef IGNORE +/* This extern points to the pointer that holds the list of open + * netCDF files. */ +extern NC_FILE_INFO_T *nc_file; +#endif + +/* These are the default chunk cache sizes for HDF5 files created or + * opened with netCDF-4. */ +size_t nc4_chunk_cache_size = CHUNK_CACHE_SIZE; +size_t nc4_chunk_cache_nelems = CHUNK_CACHE_NELEMS; +float nc4_chunk_cache_preemption = CHUNK_CACHE_PREEMPTION; + +/* This is set by nc_set_default_format in libsrc/nc.c. */ +extern int default_create_format; + +/* To turn off HDF5 error messages, I have to catch an early + invocation of a netcdf function. */ +static int virgin = 1; + +/* For performance, fill this array only the first time, and keep it + * in global memory for each further use. */ +#define NUM_TYPES 12 +static hid_t native_type_constant[NUM_TYPES]; + +static char nc_type_name[NUM_TYPES][NC_MAX_NAME + 1] = {"char", "byte", "short", "int", "float", + "double", "ubyte", "ushort", "uint", + "int64", "uint64", "string"}; +int nc4_free_global_hdf_string_typeid(); + +/* Set chunk cache size. Only affects files opened/created *after* it + * is called. */ +int +nc_set_chunk_cache(size_t size, size_t nelems, float preemption) +{ + if (preemption < 0 || preemption > 1) + return NC_EINVAL; + nc4_chunk_cache_size = size; + nc4_chunk_cache_nelems = nelems; + nc4_chunk_cache_preemption = preemption; + return NC_NOERR; +} + +/* Get chunk cache size. Only affects files opened/created *after* it + * is called. */ +int +nc_get_chunk_cache(size_t *sizep, size_t *nelemsp, float *preemptionp) +{ + if (sizep) + *sizep = nc4_chunk_cache_size; + + if (nelemsp) + *nelemsp = nc4_chunk_cache_nelems; + + if (preemptionp) + *preemptionp = nc4_chunk_cache_preemption; + return NC_NOERR; +} + +/* Required for fortran to avoid size_t issues. */ +int +nc_set_chunk_cache_ints(int size, int nelems, int preemption) +{ + if (size <= 0 || nelems <= 0 || preemption < 0 || preemption > 100) + return NC_EINVAL; + nc4_chunk_cache_size = size; + nc4_chunk_cache_nelems = nelems; + nc4_chunk_cache_preemption = (float)preemption / 100; + return NC_NOERR; +} + +int +nc_get_chunk_cache_ints(int *sizep, int *nelemsp, int *preemptionp) +{ + if (sizep) + *sizep = (int)nc4_chunk_cache_size; + if (nelemsp) + *nelemsp = (int)nc4_chunk_cache_nelems; + if (preemptionp) + *preemptionp = (int)(nc4_chunk_cache_preemption * 100); + + return NC_NOERR; +} + +/* This will return the length of a netcdf data type in bytes. */ +int +nc4typelen(nc_type type) +{ + switch(type){ + case NC_BYTE: + case NC_CHAR: + case NC_UBYTE: + return 1; + case NC_USHORT: + case NC_SHORT: + return 2; + case NC_FLOAT: + case NC_INT: + case NC_UINT: + return 4; + case NC_DOUBLE: + case NC_INT64: + case NC_UINT64: + return 8; + } + return -1; +} + +/* Given a filename, check to see if it is a HDF5 file. */ +#define MAGIC_NUMBER_LEN 4 +#define NC_HDF5_FILE 1 +#define NC_HDF4_FILE 2 +static int +nc_check_for_hdf(const char *path, int use_parallel, MPI_Comm comm, MPI_Info info, + int *hdf_file) +{ + char blob[MAGIC_NUMBER_LEN]; + + assert(hdf_file && path); + LOG((3, "nc_check_for_hdf: path %s", path)); + +/* Get the 4-byte blob from the beginning of the file. Don't use posix + * for parallel, use the MPI functions instead. */ +#ifdef USE_PARALLEL + if (use_parallel) + { + MPI_File fh; + MPI_Status status; + int retval; + if ((retval = MPI_File_open(comm, (char *)path, MPI_MODE_RDONLY, + info, &fh)) != MPI_SUCCESS) + return NC_EPARINIT; + if ((retval = MPI_File_read(fh, blob, MAGIC_NUMBER_LEN, MPI_CHAR, + &status)) != MPI_SUCCESS) + return NC_EPARINIT; + if ((retval = MPI_File_close(&fh)) != MPI_SUCCESS) + return NC_EPARINIT; + } + else +#endif /* USE_PARALLEL */ + { + FILE *fp; + if (!(fp = fopen(path, "r")) || + fread(blob, MAGIC_NUMBER_LEN, 1, fp) != 1) + return errno; + fclose(fp); + } + + /* Ignore the first byte for HDF5. */ + if (blob[1] == 'H' && blob[2] == 'D' && blob[3] == 'F') + *hdf_file = NC_HDF5_FILE; + else if (!strncmp(blob, "\016\003\023\001", MAGIC_NUMBER_LEN)) + *hdf_file = NC_HDF4_FILE; + else + *hdf_file = 0; + + return NC_NOERR; +} + +/* Create a HDF5/netcdf-4 file. In this case, ncid has already been + * selected in ncfunc.c. */ +static int +nc4_create_file(const char *path, int cmode, MPI_Comm comm, MPI_Info info, + NC_FILE_INFO_T *nc) +{ + hid_t fcpl_id, fapl_id; + unsigned flags; + FILE *fp; + int retval = NC_NOERR; + int persist = 0; /* Should diskless try to persist its data into file?*/ + + if(cmode & NC_DISKLESS) + flags = H5F_ACC_TRUNC; + else if(cmode & NC_NOCLOBBER) + flags = H5F_ACC_EXCL; + else + flags = H5F_ACC_TRUNC; + + LOG((3, "nc4_create_file: path %s mode 0x%x", path, cmode)); + assert(nc && path); + + + /* If this file already exists, and NC_NOCLOBBER is specified, + return an error. */ + if (cmode & NC_DISKLESS) { + if(cmode & NC_WRITE) + persist = 1; + } else if ((cmode & NC_NOCLOBBER) && (fp = fopen(path, "r"))) { + fclose(fp); + return NC_EEXIST; + } + + /* Add necessary structs to hold netcdf-4 file data. */ + if ((retval = nc4_nc4f_list_add(nc, path, (NC_WRITE | cmode)))) + BAIL(retval); + assert(nc->nc4_info && nc->nc4_info->root_grp); + + /* Need this access plist to control how HDF5 handles open onjects + * on file close. (Setting H5F_CLOSE_SEMI will cause H5Fclose to + * fail if there are any open objects in the file. */ + if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif +#ifdef EXTRA_TESTS + if (H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI)) + BAIL(NC_EHDFERR); +#else + if (H5Pset_fclose_degree(fapl_id, H5F_CLOSE_STRONG)) + BAIL(NC_EHDFERR); +#endif /* EXTRA_TESTS */ + +#ifdef USE_PARALLEL + /* If this is a parallel file create, set up the file creation + property list. */ + if ((cmode & NC_MPIIO) || (cmode & NC_MPIPOSIX)) + { + nc->nc4_info->parallel++; + if (cmode & NC_MPIIO) /* MPI/IO */ + { + LOG((4, "creating parallel file with MPI/IO")); + if (H5Pset_fapl_mpio(fapl_id, comm, info) < 0) + BAIL(NC_EPARINIT); + } + else /* MPI/POSIX */ + { + LOG((4, "creating parallel file with MPI/posix")); + if (H5Pset_fapl_mpiposix(fapl_id, comm, 0) < 0) + BAIL(NC_EPARINIT); + } + } +#else /* only set cache for non-parallel... */ + if(cmode & NC_DISKLESS) { + if (H5Pset_fapl_core(fapl_id, 4096, persist)) + BAIL(NC_EDISKLESS); + } + if (H5Pset_cache(fapl_id, 0, nc4_chunk_cache_nelems, nc4_chunk_cache_size, + nc4_chunk_cache_preemption) < 0) + BAIL(NC_EHDFERR); + LOG((4, "nc4_create_file: set HDF raw chunk cache to size %d nelems %d preemption %f", + nc4_chunk_cache_size, nc4_chunk_cache_nelems, nc4_chunk_cache_preemption)); +#endif /* USE_PARALLEL */ + + if (H5Pset_libver_bounds(fapl_id, H5F_LIBVER_18, H5F_LIBVER_18) < 0) + BAIL(NC_EHDFERR); + + /* Create the property list. */ + if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif + + /* Set latest_format in access propertly list and + * H5P_CRT_ORDER_TRACKED in the creation property list. This turns + * on HDF5 creation ordering. */ + if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED | + H5P_CRT_ORDER_INDEXED)) < 0) + BAIL(NC_EHDFERR); + if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED | + H5P_CRT_ORDER_INDEXED)) < 0) + BAIL(NC_EHDFERR); + + /* Create the file. */ + if ((nc->nc4_info->hdfid = H5Fcreate(path, flags, fcpl_id, fapl_id)) < 0) + BAIL(NC_EFILEMETA); + + /* Open the root group. */ + if ((nc->nc4_info->root_grp->hdf_grpid = H5Gopen2(nc->nc4_info->hdfid, "/", + H5P_DEFAULT)) < 0) + BAIL(NC_EFILEMETA); + + /* Release the property lists. */ + if (H5Pclose(fapl_id) < 0 || + H5Pclose(fcpl_id) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; + num_plists--; +#endif + + /* Define mode gets turned on automatically on create. */ + nc->nc4_info->flags |= NC_INDEF; + + return NC_NOERR; + + exit: + if (nc->nc4_info->hdfid > 0) H5Fclose(nc->nc4_info->hdfid); + return retval; +} + +/** \ingroup netcdf4 +Create a netCDF-4/HDF5 file. + +\param path The file name of the new file. +\param cmode The creation mode flag. +\param initialsz Ignored by this function. +\param basepe Ignored by this function. +\param chunksizehintp Ignored by this function. +\param use_parallel 0 for sequential, non-zero for parallel I/O. +\param mpidata pointer to struct holdind data for parallel I/O +layer. Ignored if NULL. +\param dispatch Pointer to the dispatch table for this file. +\param ncpp Pointer to start of linked list of open files. +\return NC_INVAL Invalid input (check cmode). +*/ +int +NC4_create(const char* path, int cmode, size_t initialsz, int basepe, + size_t *chunksizehintp, int use_parallel, void *mpidata, + NC_Dispatch *dispatch, NC **ncpp) +{ + NC_FILE_INFO_T *nc_file = NULL; +#ifdef USE_PARALLEL + MPI_Comm comm = 0; + MPI_Info info = 0; +#else + int comm = 0, info = 0; +#endif /* USE_PARALLEL */ + int res; + + assert(ncpp && path); + + LOG((1, "nc4_create_file: path %s cmode 0x%x comm %d info %d", + path, cmode, comm, info)); + +#ifdef USE_PARALLEL + if (mpidata) + { + comm = ((NC_MPI_INFO *)mpidata)->comm; + info = ((NC_MPI_INFO *)mpidata)->info; + } +#endif /* USE_PARALLEL */ + + /* If this is our first file, turn off HDF5 error messages. */ + if (virgin) + { + if (H5Eset_auto(NULL, NULL) < 0) + LOG((0, "Couldn't turn off HDF5 error messages!")); + LOG((1, "HDF5 error messages have been turned off.")); + virgin = 0; + } + + /* Check the cmode for validity. */ + if (cmode & ~(NC_NOCLOBBER | NC_64BIT_OFFSET + | NC_NETCDF4 | NC_CLASSIC_MODEL + | NC_SHARE | NC_MPIIO | NC_MPIPOSIX | NC_LOCK | NC_PNETCDF + | NC_DISKLESS + | NC_WRITE /* to support diskless persistence */ + ) + || (cmode & NC_MPIIO && cmode & NC_MPIPOSIX) + || (cmode & NC_64BIT_OFFSET && cmode & NC_NETCDF4) + || (cmode & (NC_MPIIO | NC_MPIPOSIX) && cmode & NC_DISKLESS) + ) + return NC_EINVAL; + + /* Allocate the storage for this file info struct, and fill it with + zeros. This add the file metadata to the front of the global + nc_file list. */ + if ((res = nc4_file_list_add(&nc_file, dispatch))) + return res; + + /* Apply default create format. */ + if (default_create_format == NC_FORMAT_64BIT) + cmode |= NC_64BIT_OFFSET; + else if (default_create_format == NC_FORMAT_NETCDF4) + cmode |= NC_NETCDF4; + else if (default_create_format == NC_FORMAT_NETCDF4_CLASSIC) + { + cmode |= NC_NETCDF4; + cmode |= NC_CLASSIC_MODEL; + } + LOG((2, "cmode after applying default format: 0x%x", cmode)); + + /* Check to see if we want a netcdf3 or netcdf4 file. Open it, and + call the appropriate nc*_create. */ + if (cmode & NC_NETCDF4) + { + nc_file->int_ncid = nc_file->ext_ncid; + res = nc4_create_file(path, cmode, comm, info, nc_file); + } +#ifdef USE_PNETCDF + else if (cmode & NC_PNETCDF) + { + nc_file->pnetcdf_file++; + res = ncmpi_create(comm, path, cmode, info, &(nc_file->int_ncid)); + } +#endif /* USE_PNETCDF */ + else + { + return NC_EINVAL; + } + + /* Delete this file list entry if there was a failure. */ + if (res) + { + if (nc_file) + nc4_file_list_del(nc_file); + } + else + *ncpp = (NC *)nc_file; + + return res; +} + +/* This function is called by read_dataset when a dimension scale + * dataset is encountered. It reads in the dimension data (creating a + * new NC_DIM_INFO_T object), and also checks to see if this is a + * dimension without a variable - that is, a coordinate dimension + * which does not have any coordinate data. */ +static int +read_scale(NC_GRP_INFO_T *grp, hid_t datasetid, char *obj_name, + hsize_t scale_size, hsize_t max_scale_size, + int *dim_without_var) +{ + /*char *start_of_len;*/ + char dimscale_name_att[NC_MAX_NAME + 1] = ""; + hid_t attid = 0; + int max_len; + int retval; + + /* Add a dimension for this scale. */ + if ((retval = nc4_dim_list_add(&grp->dim))) + return retval; + + /* Assign dimid and increment number of dimensions. */ + grp->dim->dimid = grp->file->nc4_info->next_dimid++; + grp->ndims++; + + /* Does this dataset have a hidden attribute that tells us its + * dimid? If so, read it. */ + H5E_BEGIN_TRY { + if ((attid = H5Aopen_by_name(datasetid, ".", NC_DIMID_ATT_NAME, + H5P_DEFAULT, H5P_DEFAULT)) > 0) + { + if (H5Aread(attid, H5T_NATIVE_INT, &grp->dim->dimid) < 0) + return NC_EHDFERR; + if (H5Aclose(attid) < 0) + return NC_EHDFERR; + } + } H5E_END_TRY; + + max_len = strlen(obj_name) > NC_MAX_NAME ? NC_MAX_NAME : strlen(obj_name); + if (!(grp->dim->name = malloc((max_len + 1) * sizeof(char)))) + return NC_ENOMEM; + strncpy(grp->dim->name, obj_name, max_len + 1); + if (SIZEOF_SIZE_T < 8 && scale_size > NC_MAX_UINT) + { + grp->dim->len = NC_MAX_UINT; + grp->dim->too_long = 1; + } + else + grp->dim->len = scale_size; + grp->dim->hdf_dimscaleid = datasetid; + + /* If the dimscale has an unlimited dimension, then this dimension + * is unlimited. */ + if (max_scale_size == H5S_UNLIMITED) + grp->dim->unlimited++; + + /* If the scale name is set to DIM_WITHOUT_VARIABLE, then this is a + * dimension, but not a variable. (If get_scale_name returns an + * error, just move on, there's no NAME.) */ + if (H5DSget_scale_name(datasetid, dimscale_name_att, NC_MAX_NAME) >= 0) + { + if (!strncmp(dimscale_name_att, DIM_WITHOUT_VARIABLE, + strlen(DIM_WITHOUT_VARIABLE))) + { + if (grp->dim->unlimited) + { + size_t len = 0, *lenp = &len; + if ((retval = nc4_find_dim_len(grp, grp->dim->dimid, &lenp))) + return retval; + grp->dim->len = *lenp; + } + (*dim_without_var)++; + } + } + + return NC_NOERR; +} + +/* This function reads the hacked in coordinates attribute I use for + * multi-dimensional coordinates. */ +static int +read_coord_dimids(NC_VAR_INFO_T *var) +{ + hid_t coord_att_typeid = -1, coord_attid = -1, spaceid = -1; + hssize_t coord_array_size; + int ret = 0; + + /* There is a hidden attribute telling us the ids of the + * dimensions that apply to this multi-dimensional coordinate + * variable. Read it. */ + if ((coord_attid = H5Aopen_name(var->hdf_datasetid, COORDINATES)) < 0) ret++; + if (!ret && (coord_att_typeid = H5Aget_type(coord_attid)) < 0) ret++; + if (!ret && H5Aread(coord_attid, coord_att_typeid, var->dimids) < 0) ret++; + LOG((4, "dimscale %s is multidimensional and has coords", var->name)); + + /* How many dimensions are there? */ + if ((spaceid = H5Aget_space(coord_attid)) < 0) ret++; +#ifdef EXTRA_TESTS + num_spaces++; +#endif + if ((coord_array_size = H5Sget_simple_extent_npoints(spaceid)) < 0) ret++; + + /* Malloc space to the array of pointers to dims. */ + + + /* Set my HDF5 IDs free! */ + if (spaceid >= 0 && H5Sclose(spaceid) < 0) ret++; +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (coord_att_typeid >= 0 && H5Tclose(coord_att_typeid) < 0) ret++; + if (coord_attid >= 0 && H5Aclose(coord_attid) < 0) ret++; + return ret ? NC_EATTMETA : NC_NOERR; +} + +/* This function is called when reading a file's metadata for each + * dimension scale attached to a variable.*/ +static herr_t +dimscale_visitor(hid_t did, unsigned dim, hid_t dsid, + void *dimscale_hdf5_objids) +{ + H5G_stat_t statbuf; + + /* Get more info on the dimscale object.*/ + if (H5Gget_objinfo(dsid, ".", 1, &statbuf) < 0) + return -1; + + /* Pass this information back to caller. */ +/* (*(HDF5_OBJID_T *)dimscale_hdf5_objids).fileno = statbuf.fileno; + (*(HDF5_OBJID_T *)dimscale_hdf5_objids).objno = statbuf.objno;*/ + (*(HDF5_OBJID_T *)dimscale_hdf5_objids).fileno[0] = statbuf.fileno[0]; + (*(HDF5_OBJID_T *)dimscale_hdf5_objids).fileno[1] = statbuf.fileno[1]; + (*(HDF5_OBJID_T *)dimscale_hdf5_objids).objno[0] = statbuf.objno[0]; + (*(HDF5_OBJID_T *)dimscale_hdf5_objids).objno[1] = statbuf.objno[1]; + return 0; +} + +/* Given an HDF5 type, set a pointer to netcdf type. */ +static int +get_netcdf_type(NC_HDF5_FILE_INFO_T *h5, hid_t native_typeid, + nc_type *xtype) +{ + NC_TYPE_INFO_T *type; + hid_t class; + htri_t is_str, equal = 0; + + assert(h5 && xtype); + + if ((class = H5Tget_class(native_typeid)) < 0) + return NC_EHDFERR; + + /* H5Tequal doesn't work with H5T_C_S1 for some reason. But + * H5Tget_class will return H5T_STRING if this is a string. */ + if (class == H5T_STRING) + { + if ((is_str = H5Tis_variable_str(native_typeid)) < 0) + return NC_EHDFERR; + if (is_str) + *xtype = NC_STRING; + else + *xtype = NC_CHAR; + return NC_NOERR; + } + else if (class == H5T_INTEGER || class == H5T_FLOAT) + { + /* For integers and floats, we don't have to worry about + * endianness if we compare native types. */ + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_SCHAR)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_BYTE; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_SHORT)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_SHORT; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_INT)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_INT; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_FLOAT)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_FLOAT; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_DOUBLE)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_DOUBLE; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_UCHAR)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_UBYTE; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_USHORT)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_USHORT; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_UINT)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_UINT; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_LLONG)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_INT64; + return NC_NOERR; + } + if ((equal = H5Tequal(native_typeid, H5T_NATIVE_ULLONG)) < 0) + return NC_EHDFERR; + if (equal) + { + *xtype = NC_UINT64; + return NC_NOERR; + } + } + + /* Maybe we already know about this type. */ + if (!equal) + if((type = nc4_rec_find_hdf_type(h5->root_grp, native_typeid))) + { + *xtype = type->nc_typeid; + return NC_NOERR; + } + + *xtype = NC_NAT; + return NC_EBADTYPID; +} + +/* Given an HDF5 type, set a pointer to netcdf type_info struct, + * either an existing one (for user-defined types) or a newly created + * one. */ +static int +get_type_info2(NC_HDF5_FILE_INFO_T *h5, hid_t datasetid, + nc_type *xtype, NC_TYPE_INFO_T **type_info) +{ + NC_TYPE_INFO_T *type; + htri_t is_str, equal = 0; + hid_t class, native_typeid, hdf_typeid; +#if 0 + nc_type my_nc_type = 0; +#endif + H5T_order_t order; + int endianness; + nc_type nc_type_constant[NUM_TYPES] = {NC_CHAR, NC_BYTE, NC_SHORT, NC_INT, NC_FLOAT, + NC_DOUBLE, NC_UBYTE, NC_USHORT, NC_UINT, + NC_INT64, NC_UINT64, NC_STRING}; + int type_size[NUM_TYPES] = {sizeof(char), sizeof(char), sizeof(short), + sizeof(int), sizeof(float), sizeof(double), + sizeof(unsigned char), sizeof(unsigned short), + sizeof(unsigned int), sizeof(long long), + sizeof(unsigned long long), 0}; + int t; + + assert(h5 && xtype && type_info); + + /* Because these N5T_NATIVE_* constants are actually function calls + * (!) in H5Tpublic.h, I can't initialize this array in the usual + * way, because at least some C compilers (like Irix) complain + * about calling functions when defining constants. So I have to do + * it like this. Note that there's no native types for char or + * string. Those are handled later. */ + if (!native_type_constant[1]) + { + native_type_constant[1] = H5T_NATIVE_SCHAR; + native_type_constant[2] = H5T_NATIVE_SHORT; + native_type_constant[3] = H5T_NATIVE_INT; + native_type_constant[4] = H5T_NATIVE_FLOAT; + native_type_constant[5] = H5T_NATIVE_DOUBLE; + native_type_constant[6] = H5T_NATIVE_UCHAR; + native_type_constant[7] = H5T_NATIVE_USHORT; + native_type_constant[8] = H5T_NATIVE_UINT; + native_type_constant[9] = H5T_NATIVE_LLONG; + native_type_constant[10] = H5T_NATIVE_ULLONG; + } + + /* Get the HDF5 typeid - we'll need it later. */ + if ((hdf_typeid = H5Dget_type(datasetid)) < 0) + return NC_EHDFERR; + + /* Get the native typeid. Will be equivalent to hdf_typeid when + * creating but not necessarily when reading, a variable. */ + if ((native_typeid = H5Tget_native_type(hdf_typeid, H5T_DIR_DEFAULT)) < 0) + return NC_EHDFERR; + + /* Is this type an integer, string, compound, or what? */ + if ((class = H5Tget_class(native_typeid)) < 0) + return NC_EHDFERR; + + /* Is this an atomic type? */ + if (class == H5T_STRING || class == H5T_INTEGER || class == H5T_FLOAT) + { + /* Allocate a phony NC_TYPE_INFO_T struct to hold type info. */ + if (!(*type_info = calloc(1, sizeof(NC_TYPE_INFO_T)))) + return NC_ENOMEM; + (*type_info)->class = class; + + /* H5Tequal doesn't work with H5T_C_S1 for some reason. But + * H5Tget_class will return H5T_STRING if this is a string. */ + if (class == H5T_STRING) + { + if ((is_str = H5Tis_variable_str(native_typeid)) < 0) + return NC_EHDFERR; + /* Make sure fixed-len strings will work like variable-len strings */ + if (is_str || H5Tget_size(hdf_typeid) > 1) + t = NUM_TYPES - 1; + else + t = 0; + } + else if (class == H5T_INTEGER || class == H5T_FLOAT) + { + for (t = 1; t < NUM_TYPES - 1; t++) + { + if ((equal = H5Tequal(native_typeid, native_type_constant[t])) < 0) + return NC_EHDFERR; + if (equal) + { +#if 0 + my_nc_type = nc_type_constant[t]; +#endif + break; + } + } + + /* Find out about endianness. */ + if (class == H5T_INTEGER) + { + if ((order = H5Tget_order(hdf_typeid)) < 0) + return NC_EHDFERR; + if (order == H5T_ORDER_LE) + endianness = NC_ENDIAN_LITTLE; + else if (order == H5T_ORDER_BE) + endianness = NC_ENDIAN_BIG; + else /* don't support H5T_ORDER_VAX, H5T_ORDER_MIXED, H5T_ORDER_NONE */ + return NC_EBADTYPE; + /* Copy this into the type_info struct. */ + (*type_info)->endianness = endianness; + } + } + *xtype = nc_type_constant[t]; + (*type_info)->nc_typeid = nc_type_constant[t]; + (*type_info)->size = type_size[t]; + if (!((*type_info)->name = malloc((strlen(nc_type_name[t]) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy((*type_info)->name, nc_type_name[t]); + (*type_info)->class = class; + (*type_info)->hdf_typeid = hdf_typeid; + (*type_info)->native_typeid = native_typeid; + (*type_info)->close_hdf_typeid = 1; + return NC_NOERR; + } + else + { + /* This is a user-defined type. */ + if((type = nc4_rec_find_hdf_type(h5->root_grp, native_typeid))) + { + *xtype = type->nc_typeid; + *type_info = type; + } + + /* The type entry in the array of user-defined types already has + * an open data typeid (and native typeid), so close the ones we + * opened above. */ + if (H5Tclose(native_typeid) < 0) + return NC_EHDFERR; + if (H5Tclose(hdf_typeid) < 0) + return NC_EHDFERR; + + if (type) + return NC_NOERR; + } + + *xtype = NC_NAT; + return NC_EBADTYPID; +} + +/* Read an attribute. */ +static int +read_hdf5_att(NC_GRP_INFO_T *grp, hid_t attid, NC_ATT_INFO_T *att) +{ + hid_t spaceid = 0, file_typeid = 0; + hsize_t dims[1]; /* netcdf attributes always 1-D. */ + int retval = NC_NOERR; + size_t type_size; + int att_ndims; + hssize_t att_npoints; + H5T_class_t att_class; + int fixed_len_string = 0; + size_t fixed_size = 0; + + assert(att->name); + LOG((5, "read_hdf5_att: att->attnum %d att->name %s " + "att->xtype %d att->len %d", att->attnum, att->name, + att->xtype, att->len)); + + /* Get type of attribute in file. */ + if ((file_typeid = H5Aget_type(attid)) < 0) + return NC_EATTMETA; + if ((att->native_typeid = H5Tget_native_type(file_typeid, H5T_DIR_DEFAULT)) < 0) + BAIL(NC_EHDFERR); + if ((att_class = H5Tget_class(att->native_typeid)) < 0) + BAIL(NC_EATTMETA); + if (att_class == H5T_STRING && !H5Tis_variable_str(att->native_typeid)) + { + fixed_len_string++; + if (!(fixed_size = H5Tget_size(att->native_typeid))) + BAIL(NC_EATTMETA); + } + if ((retval = get_netcdf_type(grp->file->nc4_info, att->native_typeid, &(att->xtype)))) + BAIL(retval); + + + /* Get len. */ + if ((spaceid = H5Aget_space(attid)) < 0) + BAIL(NC_EATTMETA); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + if ((att_ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) + BAIL(NC_EATTMETA); + if ((att_npoints = H5Sget_simple_extent_npoints(spaceid)) < 0) + BAIL(NC_EATTMETA); + + /* If both att_ndims and att_npoints are zero, then this is a + * zero length att. */ + if (att_ndims == 0 && att_npoints == 0) + { + dims[0] = 0; + } + else if (att->xtype == NC_STRING) { + dims[0] = att_npoints; + } + else if (att->xtype == NC_CHAR) + { + /* NC_CHAR attributes are written as a scalar in HDF5, of type + * H5T_C_S1, of variable length. */ + if (att_ndims == 0) + { + if (!(dims[0] = H5Tget_size(file_typeid))) + BAIL(NC_EATTMETA); + } + else + { + /* This is really a string type! */ + att->xtype = NC_STRING; + dims[0] = att_npoints; + } + } + else + { + /* All netcdf attributes are scalar or 1-D only. */ + if (att_ndims > 1) + BAIL(NC_EATTMETA); + + /* Read the size of this attribute. */ + if (H5Sget_simple_extent_dims(spaceid, dims, NULL) < 0) + BAIL(NC_EATTMETA); + } + + /* Tell the user what the length if this attribute is. */ + att->len = dims[0]; + + /* Allocate some memory if the len is not zero, and read the + attribute. */ + if (dims[0]) + { + if ((retval = nc4_get_typelen_mem(grp->file->nc4_info, att->xtype, 0, + &type_size))) + return retval; + if (att_class == H5T_VLEN) + { + if (!(att->vldata = malloc((unsigned int)(att->len * sizeof(hvl_t))))) + BAIL(NC_ENOMEM); + if (H5Aread(attid, att->native_typeid, att->vldata) < 0) + BAIL(NC_EATTMETA); + } + else if (att->xtype == NC_STRING) + { + if (!(att->stdata = calloc(att->len, sizeof(char *)))) + BAIL(NC_ENOMEM); + /* For a fixed length HDF5 string, the read requires + * contiguous memory. Meanwhile, the netCDF API requires that + * nc_free_string be called on string arrays, which would not + * work if one contiguous memory block were used. So here I + * convert the contiguous block of strings into an array of + * malloced strings (each string with its own malloc). Then I + * copy the data and free the contiguous memory. This + * involves copying the data, which is bad, but this only + * occurs for fixed length string attributes, and presumably + * these are small. (And netCDF-4 does not create them - it + * always uses variable length strings. */ + if (fixed_len_string) + { + int i; + char *contig_buf, *cur; + + /* Alloc space for the contiguous memory read. */ + if (!(contig_buf = malloc(att->len * fixed_size * sizeof(char)))) + BAIL(NC_ENOMEM); + + /* Read the fixed-len strings as one big block. */ + if (H5Aread(attid, att->native_typeid, contig_buf) < 0) + BAIL(NC_EATTMETA); + + /* Copy strings, one at a time, into their new home. Alloc + space for each string. The user will later free this + space with nc_free_string. */ + cur = contig_buf; + for (i = 0; i < att->len; i++) + { + if (!(att->stdata[i] = malloc(fixed_size))) + BAIL(NC_ENOMEM); + strncpy(att->stdata[i], cur, fixed_size); + cur += fixed_size; + } + + /* Free contiguous memory buffer. */ + free(contig_buf); + } + else + { + /* Read variable-length string atts. */ + if (H5Aread(attid, att->native_typeid, att->stdata) < 0) + BAIL(NC_EATTMETA); + } + } + else + { + if (!(att->data = malloc((unsigned int)(att->len * type_size)))) + BAIL(NC_ENOMEM); + if (H5Aread(attid, att->native_typeid, att->data) < 0) + BAIL(NC_EATTMETA); + } + } + + if (H5Tclose(file_typeid) < 0) + BAIL(NC_EHDFERR); + if (H5Sclose(spaceid) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_spaces--; +#endif + + return NC_NOERR; + + exit: + if (H5Tclose(file_typeid) < 0) + BAIL2(NC_EHDFERR); + if (spaceid > 0 && H5Sclose(spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + return retval; +} + +/* Read information about a user defined type from the HDF5 file, and + * stash it in the group's list of types. Return the netcdf typeid + * through a pointer, if caller desires it. */ +static int +read_type(NC_GRP_INFO_T *grp, char *type_name) +{ + NC_TYPE_INFO_T *type; + H5T_class_t class; + hid_t hdf_typeid, native_typeid = 0; + int nmembers; + hid_t member_hdf_typeid, base_hdf_typeid = 0; + char *member_name = NULL; + size_t type_size = 0, member_offset; + unsigned int m; + nc_type ud_type_type = NC_NAT, base_nc_type = NC_NAT, member_xtype; + htri_t ret; + int retval = NC_NOERR; + void *value; + int i; + + assert(grp && type_name); + + if (strlen(type_name) > NC_MAX_NAME) + return NC_EBADNAME; + + LOG((4, "read_type: type_name %s grp->name %s", type_name, grp->name)); + + if ((hdf_typeid = H5Topen2(grp->hdf_grpid, type_name, H5P_DEFAULT)) < 0) + return NC_EHDFERR; + + /* What is the native type for this platform? */ + if ((native_typeid = H5Tget_native_type(hdf_typeid, H5T_DIR_DEFAULT)) < 0) + return NC_EHDFERR; + + /* What is the size of this type on this platform. */ + if (!(type_size = H5Tget_size(native_typeid))) + return NC_EHDFERR; + LOG((5, "type_size %d", type_size)); + + /* What is the class of this type, compound, vlen, etc. */ + if ((class = H5Tget_class(hdf_typeid)) < 0) + return NC_EHDFERR; + switch (class) + { + case H5T_STRING: + ud_type_type = NC_STRING; + break; + case H5T_COMPOUND: + ud_type_type = NC_COMPOUND; + break; + case H5T_VLEN: + /* For conveninence we allow user to pass vlens of strings + * with null terminated strings. This means strings are + * treated slightly differently by the API, although they are + * really just VLENs of characters. */ + if ((ret = H5Tis_variable_str(hdf_typeid)) < 0) + return NC_EHDFERR; + if (ret) + ud_type_type = NC_STRING; + else + { + ud_type_type = NC_VLEN; + + /* Find the base type of this vlen (i.e. what is this a + * vlen of?) */ + if (!(base_hdf_typeid = H5Tget_super(native_typeid))) + return NC_EHDFERR; + + /* What size is this type? */ + if (!(type_size = H5Tget_size(base_hdf_typeid))) + return NC_EHDFERR; + + /* What is the netcdf corresponding type. */ + if ((retval = get_netcdf_type(grp->file->nc4_info, base_hdf_typeid, + &base_nc_type))) + return retval; + LOG((5, "base_hdf_typeid 0x%x type_size %d base_nc_type %d", + base_hdf_typeid, type_size, base_nc_type)); + } + break; + case H5T_OPAQUE: + ud_type_type = NC_OPAQUE; + /* What size is this type? */ + if (!(type_size = H5Tget_size(hdf_typeid))) + return NC_EHDFERR; + LOG((5, "type_size %d", type_size)); + break; + case H5T_ENUM: + ud_type_type = NC_ENUM; + + /* Find the base type of this enum (i.e. what is this a + * enum of?) */ + if (!(base_hdf_typeid = H5Tget_super(hdf_typeid))) + return NC_EHDFERR; + /* What size is this type? */ + if (!(type_size = H5Tget_size(base_hdf_typeid))) + return NC_EHDFERR; + /* What is the netcdf corresponding type. */ + if ((retval = get_netcdf_type(grp->file->nc4_info, base_hdf_typeid, + &base_nc_type))) + return retval; + LOG((5, "base_hdf_typeid 0x%x type_size %d base_nc_type %d", + base_hdf_typeid, type_size, base_nc_type)); + break; + default: + LOG((0, "unknown class")); + return NC_EBADCLASS; + } + + /* Add to the list for this new type, and get a local pointer to it. */ + if ((retval = nc4_type_list_add(&grp->type, &type))) + return retval; + assert(type); + + /* Remember info about this type. */ + type->nc_typeid = grp->file->nc4_info->next_typeid++; + type->size = type_size; + if (!(type->name = malloc((strlen(type_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(type->name, type_name); + type->class = ud_type_type; + type->base_nc_type = base_nc_type; + type->committed++; + type->hdf_typeid = hdf_typeid; + type->native_typeid = native_typeid; + + /* Read info about each member of this compound type. */ + if (ud_type_type == NC_COMPOUND) + { + if ((nmembers = H5Tget_nmembers(hdf_typeid)) < 0) + return NC_EHDFERR; + LOG((5, "compound type has %d members", nmembers)); + for (m = 0; m < nmembers; m++) + { + H5T_class_t mem_class; + hid_t member_native_typeid; + int ndims = 0, dim_size[NC_MAX_VAR_DIMS]; + hsize_t dims[NC_MAX_VAR_DIMS]; + int d; + + /* Get the typeid and native typeid of this member of the + * compound type. */ + if ((member_hdf_typeid = H5Tget_member_type(type->native_typeid, m)) < 0) + return NC_EHDFERR; + if ((member_native_typeid = H5Tget_native_type(member_hdf_typeid, H5T_DIR_DEFAULT)) < 0) + return NC_EHDFERR; + + /* Get the name of the member.*/ + member_name = H5Tget_member_name(type->native_typeid, m); + if (!member_name || strlen(member_name) > NC_MAX_NAME) + return NC_EBADNAME; + + /* Offset in bytes on *this* platform. */ + member_offset = H5Tget_member_offset(type->native_typeid, m); + + /* Get dimensional data if this member is an array of something. */ + if ((mem_class = H5Tget_class(member_hdf_typeid)) < 0) + return NC_EHDFERR; + if (mem_class == H5T_ARRAY) + { + if ((ndims = H5Tget_array_ndims(member_hdf_typeid)) < 0) + return NC_EHDFERR; + if (H5Tget_array_dims(member_hdf_typeid, dims, NULL) != ndims) + return NC_EHDFERR; + for (d = 0; d < ndims; d++) + dim_size[d] = dims[d]; + /* What is the netCDF typeid of this member? */ + if ((retval = get_netcdf_type(grp->file->nc4_info, H5Tget_super(member_hdf_typeid), + &member_xtype))) + return retval; + } + else + { + /* What is the netCDF typeid of this member? */ + if ((retval = get_netcdf_type(grp->file->nc4_info, member_native_typeid, + &member_xtype))) + return retval; + } + + /* Add this member to our list of fields in this compound type. */ + if (ndims) + { + if ((retval = nc4_field_list_add(&type->field, type->num_fields++, member_name, + member_offset, H5Tget_super(member_hdf_typeid), + H5Tget_super(member_native_typeid), + member_xtype, ndims, dim_size))) + return retval; + } + else + { + if ((retval = nc4_field_list_add(&type->field, type->num_fields++, member_name, + member_offset, member_hdf_typeid, member_native_typeid, + member_xtype, 0, NULL))) + return retval; + } + + /* HDF5 allocated this for us. */ + free(member_name); + } + } + else if (ud_type_type == NC_VLEN) + { + type->base_hdf_typeid = base_hdf_typeid; + } + else if (ud_type_type == NC_ENUM) + { + /* Remember the base HDF5 type for this enum. */ + type->base_hdf_typeid = base_hdf_typeid; + + /* Find out how many member are in the enum. */ + if ((type->num_enum_members = H5Tget_nmembers(hdf_typeid)) < 0) + return NC_EHDFERR; + + /* Allocate space for one value. */ + if (!(value = calloc(1, type_size))) + return NC_ENOMEM; + + /* Read each name and value defined in the enum. */ + for (i = 0; i < type->num_enum_members; i++) + { + /* Get the name and value from HDF5. */ + if (!(member_name = H5Tget_member_name(hdf_typeid, i))) + return NC_EHDFERR; + if (!member_name || strlen(member_name) > NC_MAX_NAME) + return NC_EBADNAME; + if (H5Tget_member_value(hdf_typeid, i, value) < 0) + return NC_EHDFERR; + + /* Insert new field into this type's list of fields. */ + if ((retval = nc4_enum_member_add(&type->enum_member, type->size, + member_name, value))) + return retval; + free(member_name); + } + + /* Free the tempory memory for one value, and the member name + * (which HDF5 allocated for us). */ + free(value); + } + + return retval; +} + +/* This function is called by read_dataset, (which is called by + * nc4_rec_read_metadata) when a netCDF variable is found in the + * file. This function reads in all the metadata about the var, + * including the attributes. */ +static int +read_var(NC_GRP_INFO_T *grp, hid_t datasetid, char *obj_name, + size_t ndims, int is_scale, int num_scales, hid_t access_pid) +{ + NC_VAR_INFO_T *var; + int natts, a, d; + + NC_ATT_INFO_T *att; + hid_t attid = 0; + char att_name[NC_MAX_HDF5_NAME + 1]; + +#define CD_NELEMS_ZLIB 1 +#define CD_NELEMS_SZIP 4 + H5Z_filter_t filter; + int num_filters; + unsigned int cd_values[CD_NELEMS_SZIP]; + size_t cd_nelems = CD_NELEMS_SZIP; + hid_t propid = 0; + H5D_fill_value_t fill_status; + H5D_layout_t layout; + hsize_t chunksize[NC_MAX_VAR_DIMS]; + int retval = NC_NOERR; + double rdcc_w0; + int f; + + assert(obj_name && grp); + LOG((4, "read_var: obj_name %s", obj_name)); + + /* Add a variable to the end of the group's var list. */ + if ((retval = nc4_var_list_add(&grp->var, &var))) + return retval; + + /* Fill in what we already know. */ + var->hdf_datasetid = datasetid; + var->varid = grp->nvars++; + var->created++; + var->ndims = ndims; + + /* We need some room to store information about dimensions for this + * var. */ + if (var->ndims) + { + if (!(var->dim = calloc(var->ndims, sizeof(NC_DIM_INFO_T *)))) + return NC_ENOMEM; + if (!(var->dimids = calloc(var->ndims, sizeof(int)))) + return NC_ENOMEM; + } + + /* Learn about current chunk cache settings. */ + if ((H5Pget_chunk_cache(access_pid, &(var->chunk_cache_nelems), + &(var->chunk_cache_size), &rdcc_w0)) < 0) + return NC_EHDFERR; + var->chunk_cache_preemption = rdcc_w0; + + /* Allocate space for the name. */ + if (!(var->name = malloc((strlen(obj_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + + /* Check for a weird case: a non-coordinate (and non-scalar) + * variable that has the same name as a dimension. It's legal in + * netcdf, and requires that the HDF5 dataset name be changed. */ + if (var->ndims && + !strncmp(obj_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND))) + { + if (strlen(obj_name) > NC_MAX_NAME) + return NC_EMAXNAME; + strcpy(var->name, &obj_name[strlen(NON_COORD_PREPEND)]); + } + else + strcpy(var->name, obj_name); + + /* Find out what filters are applied to this HDF5 dataset, + * fletcher32, deflate, and/or shuffle. All other filters are + * ignored. */ + if ((propid = H5Dget_create_plist(datasetid)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif /* EXTRA_TESTS */ + + /* Get the chunking info for non-scalar vars. */ + if ((layout = H5Pget_layout(propid)) < -1) + BAIL(NC_EHDFERR); + if (layout == H5D_CHUNKED) + { + if (H5Pget_chunk(propid, NC_MAX_VAR_DIMS, chunksize) < 0) + BAIL(NC_EHDFERR); + if (!(var->chunksizes = malloc(var->ndims * sizeof(size_t)))) + BAIL(NC_ENOMEM); + for (d = 0; d < var->ndims; d++) + var->chunksizes[d] = chunksize[d]; + } + else if (layout == H5D_CONTIGUOUS) + var->contiguous++; + + /* The possible values of filter (which is just an int) can be + * found in H5Zpublic.h. */ + if ((num_filters = H5Pget_nfilters(propid)) < 0) + BAIL(NC_EHDFERR); + for (f = 0; f < num_filters; f++) + { + if ((filter = H5Pget_filter2(propid, f, NULL, &cd_nelems, + cd_values, 0, NULL, NULL)) < 0) + BAIL(NC_EHDFERR); + switch (filter) + { + case H5Z_FILTER_SHUFFLE: + var->shuffle = 1; + break; + case H5Z_FILTER_FLETCHER32: + var->fletcher32 = 1; + break; + case H5Z_FILTER_DEFLATE: + var->deflate++; + if (cd_nelems != CD_NELEMS_ZLIB || + cd_values[0] > MAX_DEFLATE_LEVEL) + BAIL(NC_EHDFERR); + var->deflate_level = cd_values[0]; + break; + case H5Z_FILTER_SZIP: + var->deflate++; + if (cd_nelems != CD_NELEMS_SZIP) + BAIL(NC_EHDFERR); + var->options_mask = cd_values[0]; + var->pixels_per_block = cd_values[1]; + break; + default: + LOG((1, "Yikes! Unknown filter type found on dataset!")); + break; + } + } + + /* Learn all about the type of this variable. */ + if ((retval = get_type_info2(grp->file->nc4_info, datasetid, + &var->xtype, &var->type_info))) + BAIL(retval); + + /* Is there a fill value associated with this dataset? */ + if (H5Pfill_value_defined(propid, &fill_status) < 0) + BAIL(NC_EHDFERR); + + /* Get the fill value, if there is one defined. */ + if (fill_status == H5D_FILL_VALUE_USER_DEFINED) + { + /* Allocate space to hold the fill value. */ + if (!var->fill_value) + { + if (var->type_info->class == NC_VLEN) + { + if (!(var->fill_value = malloc(sizeof(nc_vlen_t)))) + BAIL(NC_ENOMEM); + } + else if (var->type_info->size) + { + if (!(var->fill_value = malloc(var->type_info->size))) + BAIL(NC_ENOMEM); + } + else + { + if (!(var->fill_value = malloc(sizeof(char *)))) + BAIL(NC_ENOMEM); + } + } + + /* Get the fill value from the HDF5 property lust. */ + if (H5Pget_fill_value(propid, var->type_info->native_typeid, + var->fill_value) < 0) + BAIL(NC_EHDFERR); + } + else + var->no_fill = 1; + + /* If it's a scale, mark it as such. If not, allocate space to + * remember whether the dimscale has been attached for each + * dimension. */ + if (is_scale) + { + assert(ndims); + var->dimscale++; + if (var->ndims > 1) + { + if ((retval = read_coord_dimids(var))) + BAIL(retval); + } + else + { + var->dimids[0] = grp->dim->dimid; + var->dim[0] = grp->dim; + } + } + else + if (num_scales && ndims && + !(var->dimscale_attached = calloc(ndims, sizeof(int)))) + BAIL(NC_ENOMEM); + + /* If this is not a scale, and has scales, iterate + * through them. (i.e. this is a variable that is not a + * coordinate variable) */ + if (!is_scale && num_scales) + { + /* Store id information allowing us to match hdf5 + * dimscales to netcdf dimensions. */ + if (!(var->dimscale_hdf5_objids = malloc(ndims * sizeof(struct hdf5_objid)))) + BAIL(NC_ENOMEM); + for (d = 0; d < var->ndims; d++) + { + LOG((5, "read_var: about to iterate over scales for dim %d", d)); + if (H5DSiterate_scales(var->hdf_datasetid, d, NULL, dimscale_visitor, + &(var->dimscale_hdf5_objids[d])) < 0) + BAIL(NC_EHDFERR); +/* LOG((5, "read_var: collected scale info for dim %d " + "var %s fileno[0] %d objno[0] %d fileno[1] %d objno[1] %d", + d, var->name, var->dimscale_hdf5_objids[d].fileno[0], + var->dimscale_hdf5_objids[d].objno[0], + var->dimscale_hdf5_objids[d].fileno[1], + var->dimscale_hdf5_objids[d].objno[1]));*/ + var->dimscale_attached[d]++; + } + } + + /* Now read all the attributes of this variable, ignoring the + ones that hold HDF5 dimension scale information. */ + if ((natts = H5Aget_num_attrs(var->hdf_datasetid)) < 0) + BAIL(NC_EATTMETA); + for (a = 0; a < natts; a++) + { + /* Close the attribute and try to move on with our + * lives. Like bits through the network port, so + * flows the Days of Our Lives! */ + if (attid && H5Aclose(attid) < 0) + BAIL(NC_EHDFERR); + + /* Open the att and get its name. */ + if ((attid = H5Aopen_idx(var->hdf_datasetid, (unsigned int)a)) < 0) + BAIL(NC_EATTMETA); + if (H5Aget_name(attid, NC_MAX_HDF5_NAME, att_name) < 0) + BAIL(NC_EATTMETA); + LOG((4, "read_var: a %d att_name %s", a, att_name)); + + /* Should we ignore this attribute? */ + if (strcmp(att_name, REFERENCE_LIST) && + strcmp(att_name, CLASS) && + strcmp(att_name, DIMENSION_LIST) && + strcmp(att_name, NAME) && + strcmp(att_name, COORDINATES)) + { + /* Is this the hidden attribute that holds the netCDF + * dimension id for a coordinate variable? */ + if (!strcmp(att_name, NC_DIMID_ATT_NAME)) + { + + } + else + { + /* Add to the end of the list of atts for this var. */ + if ((retval = nc4_att_list_add(&var->att))) + BAIL(retval); + for (att = var->att; att->next; att = att->next) + ; + + /* Fill in the information we know. */ + att->attnum = var->natts++; + if (!(att->name = malloc((strlen(att_name) + 1) * sizeof(char)))) + BAIL(NC_ENOMEM); + strcpy(att->name, att_name); + + /* Read the rest of the info about the att, + * including its values. */ + if ((retval = read_hdf5_att(grp, attid, att))) + BAIL(retval); + + att->created++; + } /* endif not HDF5 att */ + } + } /* next attribute */ + + /* Is this a deflated variable with a chunksize greater than the + * current cache size? */ + if ((retval = nc4_adjust_var_cache(grp, var))) + BAIL(retval); + + exit: + if (propid > 0 && H5Pclose(propid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (attid > 0 && H5Aclose(attid) < 0) + BAIL2(NC_EHDFERR); + return retval; +} + +/* This function is called by nc4_rec_read_metadata to read all the + * group level attributes (the NC_GLOBAL atts for this group). */ +static int +read_grp_atts(NC_GRP_INFO_T *grp) +{ + hid_t attid = 0; + hsize_t num_obj, i; + NC_ATT_INFO_T *att; + NC_TYPE_INFO_T *type; + char obj_name[NC_MAX_HDF5_NAME + 1]; + int max_len; + int retval = NC_NOERR; + + num_obj = H5Aget_num_attrs(grp->hdf_grpid); + for (i = 0; i < num_obj; i++) + { + if (attid > 0) + H5Aclose(attid); + if ((attid = H5Aopen_idx(grp->hdf_grpid, (unsigned int)i)) < 0) + BAIL(NC_EATTMETA); + if (H5Aget_name(attid, NC_MAX_NAME + 1, obj_name) < 0) + BAIL(NC_EATTMETA); + LOG((3, "reading attribute of _netCDF group, named %s", obj_name)); + + /* This may be an attribute telling us that strict netcdf-3 + * rules are in effect. If so, we will make note of the fact, + * but not add this attribute to the metadata. It's not a user + * attribute, but an internal netcdf-4 one. */ + if (!strcmp(obj_name, NC3_STRICT_ATT_NAME)) + grp->file->nc4_info->cmode |= NC_CLASSIC_MODEL; + else + { + /* Add an att struct at the end of the list, and then go to it. */ + if ((retval = nc4_att_list_add(&grp->att))) + BAIL(retval); + for (att = grp->att; att->next; att = att->next) + ; + + /* Add the info about this attribute. */ + max_len = strlen(obj_name) > NC_MAX_NAME ? NC_MAX_NAME : strlen(obj_name); + if (!(att->name = malloc((max_len + 1) * sizeof(char)))) + BAIL(NC_ENOMEM); + strncpy(att->name, obj_name, max_len); + att->name[max_len] = 0; + att->attnum = grp->natts++; + if ((retval = read_hdf5_att(grp, attid, att))) + BAIL(retval); + att->created++; + if ((retval = nc4_find_type(grp->file->nc4_info, att->xtype, &type))) + BAIL(retval); + if (type) + att->class = type->class; + } + } + + exit: + if (attid > 0 && H5Aclose(attid) < 0) + BAIL2(NC_EHDFERR); + return retval; +} + +/* This function is called when nc4_rec_read_vars encounters an HDF5 + * dataset when reading a file. */ +static int +read_dataset(NC_GRP_INFO_T *grp, char *obj_name) +{ + hid_t datasetid = 0; + hid_t spaceid = 0, access_pid = 0; + int ndims; + hsize_t dims[NC_MAX_DIMS], max_dims[NC_MAX_DIMS]; + int is_scale = 0; + int dim_without_var = 0; + int num_scales = 0; + int retval = NC_NOERR; + + /* Open this dataset. */ + if ((datasetid = H5Dopen2(grp->hdf_grpid, obj_name, H5P_DEFAULT)) < 0) + BAIL(NC_EVARMETA); + + /* Get the current chunk cache settings. */ + if ((access_pid = H5Dget_access_plist(datasetid)) < 0) + BAIL(NC_EVARMETA); +#ifdef EXTRA_TESTS + num_plists++; +#endif + + /* Get the dimension information for this dataset. */ + if ((spaceid = H5Dget_space(datasetid)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + if ((ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) + BAIL(NC_EHDFERR); + if (ndims > NC_MAX_DIMS) + BAIL(NC_EMAXDIMS); + if (H5Sget_simple_extent_dims(spaceid, dims, max_dims) < 0) + BAIL(NC_EHDFERR); + + /* Is this a dimscale? */ + if ((is_scale = H5DSis_scale(datasetid)) < 0) + BAIL(NC_EHDFERR); + if (is_scale) + { + /* Read the scale information. */ + if ((retval = read_scale(grp, datasetid, obj_name, dims[0], + max_dims[0], &dim_without_var))) + BAIL(retval); + } + else + { + /* Find out how many scales are attached to this + * dataset. H5DSget_num_scales returns an error if there are no + * scales, so convert a negative return value to zero. */ + num_scales = H5DSget_num_scales(datasetid, 0); + if (num_scales < 0) + num_scales = 0; + } + + /* Add a var to the linked list, and get its metadata, + * unless this is one of those funny dimscales that are a + * dimension in netCDF but not a variable. (Spooky!) */ + if (!dim_without_var) + if ((retval = read_var(grp, datasetid, obj_name, ndims, + is_scale, num_scales, access_pid))) + BAIL(retval); + + if (access_pid && H5Pclose(access_pid) < 0) + BAIL2(retval); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (spaceid && H5Sclose(spaceid) < 0) + BAIL2(retval); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + return NC_NOERR; + + exit: + if (access_pid && H5Pclose(access_pid) < 0) + BAIL2(retval); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (datasetid && H5Dclose(datasetid) < 0) + BAIL2(retval); + if (spaceid && H5Sclose(spaceid) <0) + BAIL2(retval); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + return retval; +} + +/* Given index, get the HDF5 name of an object and the class of the + * object (group, type, dataset, etc.). This function will try to use + * creation ordering, but if that fails it will use default + * (i.e. alphabetical) ordering. (This is necessary to read existing + * HDF5 archives without creation ordering). */ +/* static int */ +/* get_name_by_idx(NC_HDF5_FILE_INFO_T *h5, hid_t hdf_grpid, int i, */ +/* int *obj_class, char *obj_name) */ +/* { */ +/* H5O_info_t obj_info; */ +/* H5_index_t idx_field = H5_INDEX_CRT_ORDER; */ +/* ssize_t size; */ +/* herr_t res; */ + +/* /\* These HDF5 macros prevent an HDF5 error message when a */ +/* * non-creation-ordered HDF5 file is opened. *\/ */ +/* H5E_BEGIN_TRY { */ +/* res = H5Oget_info_by_idx(hdf_grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, */ +/* i, &obj_info, H5P_DEFAULT); */ +/* } H5E_END_TRY; */ + +/* /\* Creation ordering not available, so make sure this file is */ +/* * opened for read-only access. This is a plain old HDF5 file being */ +/* * read by netCDF-4. *\/ */ +/* if (res < 0) */ +/* { */ +/* if (H5Oget_info_by_idx(hdf_grpid, ".", H5_INDEX_NAME, H5_ITER_INC, */ +/* i, &obj_info, H5P_DEFAULT) < 0) */ +/* return NC_EHDFERR; */ +/* if (!h5->no_write) */ +/* return NC_ECANTWRITE; */ +/* h5->ignore_creationorder = 1; */ +/* idx_field = H5_INDEX_NAME; */ +/* } */ + +/* *obj_class = obj_info.type; */ +/* if ((size = H5Lget_name_by_idx(hdf_grpid, ".", idx_field, H5_ITER_INC, i, */ +/* NULL, 0, H5P_DEFAULT)) < 0) */ +/* return NC_EHDFERR; */ +/* if (size > NC_MAX_NAME) */ +/* return NC_EMAXNAME; */ +/* if (H5Lget_name_by_idx(hdf_grpid, ".", idx_field, H5_ITER_INC, i, */ +/* obj_name, size+1, H5P_DEFAULT) < 0) */ +/* return NC_EHDFERR; */ + +/* LOG((4, "get_name_by_idx: encountered HDF5 object obj_name %s", obj_name)); */ + +/* return NC_NOERR; */ +/* } */ + +#define USE_ITERATE_CODE +#ifdef USE_ITERATE_CODE + +static int +nc4_rec_read_types_cb(hid_t grpid, const char *name, const H5L_info_t *info, + void *_op_data) +{ + hid_t oid=-1; + H5I_type_t otype=-1; + char oname[NC_MAX_NAME + 1]; + NC_GRP_INFO_T *child_grp; + NC_GRP_INFO_T *grp = (NC_GRP_INFO_T *) (_op_data); + NC_HDF5_FILE_INFO_T *h5 = grp->file->nc4_info; + + /* Open this critter. */ + if ((oid = H5Oopen(grpid, name, H5P_DEFAULT)) < 0) + return H5_ITER_ERROR; + + if ((otype = H5Iget_type( oid ))<0) { + H5Oclose(oid); + return H5_ITER_ERROR; + } + H5Oclose(oid); + + strncpy(oname, name, NC_MAX_NAME); + + /* Deal with groups and types; ignore the rest. */ + if (otype == H5I_GROUP) + { + LOG((3, "found group %s", oname)); + if (nc4_grp_list_add(&(grp->children), h5->next_nc_grpid++, + grp, grp->file, oname, &child_grp)) + return H5_ITER_ERROR; + + if (nc4_rec_read_types(child_grp)) + return H5_ITER_ERROR; + } + else if (otype == H5I_DATATYPE) + { + LOG((3, "found datatype %s", oname)); + if (read_type(grp, oname)) + return H5_ITER_ERROR; + } + + return (H5_ITER_CONT); +} + +static int +nc4_rec_read_types(NC_GRP_INFO_T *grp) +{ + hsize_t idx=0; + int res = 0; + hid_t pid = 0; + unsigned crt_order_flags = 0; + NC_HDF5_FILE_INFO_T *h5 = grp->file->nc4_info; + + assert(grp && grp->name); + LOG((3, "nc4_rec_read_types: grp->name %s", grp->name)); + + /* Open this HDF5 group and retain its grpid. It will remain open + * with HDF5 until this file is nc_closed. */ + if (!grp->hdf_grpid) + { + if (grp->parent) + { + if ((grp->hdf_grpid = H5Gopen2(grp->parent->hdf_grpid, + grp->name, H5P_DEFAULT)) < 0) + return NC_EHDFERR; + } + else + { + if ((grp->hdf_grpid = H5Gopen2(grp->file->nc4_info->hdfid, + "/", H5P_DEFAULT)) < 0) + return NC_EHDFERR; + } + } + assert(grp->hdf_grpid > 0); + + pid = H5Gget_create_plist(grp->hdf_grpid); + H5Pget_link_creation_order(pid, &crt_order_flags); + H5Pclose(pid); + + crt_order_flags = crt_order_flags & H5_INDEX_CRT_ORDER; + + if (crt_order_flags == H5_INDEX_CRT_ORDER) + { + res = H5Literate(grp->hdf_grpid, H5_INDEX_CRT_ORDER, H5_ITER_INC, + &idx, nc4_rec_read_types_cb, (void *)grp); + } else + { + /* Without creation ordering, file must be read-only. */ + if (!idx && !h5->no_write) + return NC_ECANTWRITE; + + res = H5Literate(grp->hdf_grpid, H5_INDEX_NAME, H5_ITER_INC, + &idx, nc4_rec_read_types_cb, (void *)grp); + } + if (res<0) + return NC_EHDFERR; + return NC_NOERR; /* everything worked! */ +} + +static int +nc4_rec_read_vars_cb(hid_t grpid, const char *name, const H5L_info_t *info, + void *_op_data) +{ + hid_t oid=-1; + H5I_type_t otype=-1; + char oname[NC_MAX_NAME + 1]; + NC_GRP_INFO_T *child_grp; + NC_GRP_INFO_T *grp = (NC_GRP_INFO_T *) (_op_data); +#if 0 + NC_HDF5_FILE_INFO_T *h5 = grp->file->nc4_info; +#endif + + memset(oname, 0, NC_MAX_NAME); + /* Open this critter. */ + if ((oid = H5Oopen(grpid, name, H5P_DEFAULT)) < 0) + return H5_ITER_ERROR; + + if ((otype = H5Iget_type( oid ))<0) { + H5Oclose(oid); + return H5_ITER_ERROR; + } + H5Oclose(oid); + + strncpy(oname, name, NC_MAX_NAME); + + /* Deal with datasets. */ + switch(otype) + { + case H5I_GROUP: + LOG((3, "re-encountering group %s", oname)); + + /* The NC_GROUP_INFO_T for this group already exists. Find it. */ + for (child_grp = grp->children; child_grp; child_grp = child_grp->next) + if (!strcmp(child_grp->name, oname)) + break; + if (!child_grp) + return H5_ITER_ERROR; + + /* Recursively read the child group's vars. */ + if (nc4_rec_read_vars(child_grp)) + return H5_ITER_ERROR; + break; + case H5I_DATASET: + LOG((3, "found dataset %s", oname)); + + /* Learn all about this dataset, which may be a dimscale + * (i.e. dimension metadata), or real data. */ + if (read_dataset(grp, oname)) + return H5_ITER_ERROR; + break; + case H5I_DATATYPE: + LOG((3, "already handled type %s", oname)); + break; + default: + LOG((0, "Unknown object class %d in nc4_rec_read_vars!", otype)); + } + return (H5_ITER_CONT); +} + +static int +nc4_rec_read_vars(NC_GRP_INFO_T *grp) +{ + hsize_t idx = 0; + int retval = NC_NOERR; + int res = 0; + hid_t pid = 0; + unsigned crt_order_flags = 0; + NC_HDF5_FILE_INFO_T *h5 = grp->file->nc4_info; + + assert(grp && grp->name && grp->hdf_grpid > 0); + LOG((3, "nc4_rec_read_vars: grp->name %s", grp->name)); + + pid = H5Gget_create_plist(grp->hdf_grpid); + H5Pget_link_creation_order(pid, &crt_order_flags); + H5Pclose(pid); + + crt_order_flags = crt_order_flags & H5_INDEX_CRT_ORDER; + + if (crt_order_flags == H5_INDEX_CRT_ORDER) + { + res = H5Literate(grp->hdf_grpid, H5_INDEX_CRT_ORDER, H5_ITER_INC, + &idx, nc4_rec_read_vars_cb, (void *)grp); + } else + { + /* Without creation ordering, file must be read-only. */ + if (!idx && !h5->no_write) + return NC_ECANTWRITE; + + res = H5Literate(grp->hdf_grpid, H5_INDEX_NAME, H5_ITER_INC, + &idx, nc4_rec_read_vars_cb, (void *)grp); + } + if (res<0) + return NC_EHDFERR; + + /* Scan the group for global (i.e. group-level) attributes. */ + if ((retval = read_grp_atts(grp))) + return retval; + + return NC_NOERR; /* everything worked! */ +} + +#else + +/** \internal +This struct is used to pass information back from the callback +function used with H5Literate. +*/ +struct nc_hdf5_link_info +{ + char name[NC_MAX_NAME + 1]; + H5I_type_t obj_type; +}; + +/* This is a callback function for H5Literate(). + +The parameters of this callback function have the following values or +meanings: + +g_id Group that serves as root of the iteration; same value as the +H5Lvisit group_id parameter + +name Name of link, relative to g_id, being examined at current step of +the iteration + +info H5L_info_t struct containing information regarding that link + +op_data User-defined pointer to data required by the application in +processing the link; a pass-through of the op_data pointer provided +with the H5Lvisit function call + +*/ +static herr_t +visit_link(hid_t g_id, const char *name, const H5L_info_t *info, + void *op_data) +{ + /* A positive return value causes the visit iterator to immediately + * return that positive value, indicating short-circuit + * success. The iterator can be restarted at the next group + * member. */ + int ret = 1; + hid_t id; + + /* Get the name, truncating at NC_MAX_NAME. */ + strncpy(((struct nc_hdf5_link_info *)op_data)->name, name, + NC_MAX_NAME); + + /* Open this critter. */ + if ((id = H5Oopen_by_addr(g_id, info->u.address)) < 0) + return NC_EHDFERR; + + /* Is this critter a group, type, data, attribute, or what? */ + if ((((struct nc_hdf5_link_info *)op_data)->obj_type = H5Iget_type(id)) < 0) + ret = NC_EHDFERR; + + /* Close the critter to release resouces. */ + if (H5Oclose(id) < 0) + return NC_EHDFERR; + + return ret; +} + +/* Iterate over one link in the group at a time, returning + * link_info. The creation_ordering and idx pointers keep track of + * whether creation ordering works and the most recently examined + * link. */ +static int +nc4_iterate_link(int *ordering_checked, int *creation_ordering, + hid_t grpid, hsize_t *idx, struct nc_hdf5_link_info *link_info) +{ + int res = 0; + + if (*creation_ordering) + { + /* These HDF5 macros prevent an HDF5 error message when a + * non-creation-ordered HDF5 file is opened. */ + H5E_BEGIN_TRY { + res = H5Literate(grpid, H5_INDEX_CRT_ORDER, H5_ITER_INC, + idx, visit_link, (void *)link_info); + if (res < 0 && *ordering_checked) + return NC_EHDFERR; + } H5E_END_TRY; + } + + if (!*creation_ordering || res < 0) + { + if (H5Literate(grpid, H5_INDEX_NAME, H5_ITER_INC, idx, + visit_link, link_info) != 1) + return NC_EHDFERR; + /* If it didn't work with creation ordering, but did without, + * then we don't have creation ordering. */ + *creation_ordering = 0; + } + + *ordering_checked = 1; + return NC_NOERR; +} + +/* Recursively open groups and read types. */ +int +nc4_rec_read_types(NC_GRP_INFO_T *grp) +{ + hsize_t num_obj, i; + NC_HDF5_FILE_INFO_T *h5 = grp->file->nc4_info; + NC_GRP_INFO_T *child_grp; + hsize_t idx = 0; + struct nc_hdf5_link_info link_info; + int ordering_checked = 0; + int creation_ordering = 1; /* Assume we have it. */ + int retval = NC_NOERR; + + assert(grp && grp->name); + LOG((3, "nc4_rec_read_types: grp->name %s", grp->name)); + + /* Open this HDF5 group and retain its grpid. It will remain open + * with HDF5 until this file is nc_closed. */ + if (!grp->hdf_grpid) + { + if (grp->parent) + { + if ((grp->hdf_grpid = H5Gopen2(grp->parent->hdf_grpid, + grp->name, H5P_DEFAULT)) < 0) + return NC_EHDFERR; + } + else + { + if ((grp->hdf_grpid = H5Gopen2(grp->file->nc4_info->hdfid, + "/", H5P_DEFAULT)) < 0) + return NC_EHDFERR; + } + } + assert(grp->hdf_grpid > 0); + + /* How many objects in this group? */ + if (H5Gget_num_objs(grp->hdf_grpid, &num_obj) < 0) + return NC_EVARMETA; + + /* For each object in the group... */ + for (i = 0; i < num_obj; i++) + { + if ((retval = nc4_iterate_link(&ordering_checked, &creation_ordering, + grp->hdf_grpid, &idx, &link_info))) + return retval; + + /* Without creation ordering, file must be read-only. */ + if (!i && !creation_ordering && !h5->no_write) + return NC_ECANTWRITE; + + /* Deal with groups and types; ignore the rest. */ + if (link_info.obj_type == H5I_GROUP) + { + LOG((3, "found group %s", link_info.name)); + if ((retval = nc4_grp_list_add(&(grp->children), h5->next_nc_grpid++, + grp, grp->file, link_info.name, &child_grp))) + return retval; + if ((retval = nc4_rec_read_types(child_grp))) + return retval; + } + else if (link_info.obj_type == H5I_DATATYPE) + { + LOG((3, "found datatype %s", link_info.name)); + if ((retval = read_type(grp, link_info.name))) + return retval; + } + } + + return NC_NOERR; /* everything worked! */ +} + +/* This function recursively reads all the var and attribute metadata + in a HDF5 group, and creates and fills in the netCDF-4 global + metadata structure. */ +int +nc4_rec_read_vars(NC_GRP_INFO_T *grp) +{ + hsize_t num_obj, i; + NC_GRP_INFO_T *child_grp; + struct nc_hdf5_link_info link_info; + hsize_t idx = 0; + int ordering_checked = 0; + int creation_ordering = 1; /* Assume we have it. */ + int retval = NC_NOERR; + + assert(grp && grp->name && grp->hdf_grpid > 0); + LOG((3, "nc4_rec_read_vars: grp->name %s", grp->name)); + + /* How many objects in this group? */ + if (H5Gget_num_objs(grp->hdf_grpid, &num_obj) < 0) + return NC_EVARMETA; + + /* For each object in the group... */ + for (i = 0; i < num_obj; i++) + { + if ((retval = nc4_iterate_link(&ordering_checked, &creation_ordering, + grp->hdf_grpid, &idx, &link_info))) + return retval; + + /* Deal with datasets. */ + switch(link_info.obj_type) + { + case H5I_GROUP: + LOG((3, "re-encountering group %s", link_info.name)); + + /* The NC_GROUP_INFO_T for this group already exists. Find it. */ + for (child_grp = grp->children; child_grp; child_grp = child_grp->next) + if (!strcmp(child_grp->name, link_info.name)) + break; + if (!child_grp) + return NC_EHDFERR; + + /* Recursively read the child group's vars. */ + if ((retval = nc4_rec_read_vars(child_grp))) + return retval; + break; + case H5I_DATASET: + LOG((3, "found dataset %s", link_info.name)); + + /* Learn all about this dataset, which may be a dimscale + * (i.e. dimension metadata), or real data. */ + if ((retval = read_dataset(grp, link_info.name))) + return retval; + break; + case H5I_DATATYPE: + LOG((3, "already handled type %s", link_info.name)); + break; + default: + LOG((0, "Unknown object class %d in nc4_rec_read_vars!", + link_info.obj_type)); + } + } + + /* Scan the group for global (i.e. group-level) attributes. */ + if ((retval = read_grp_atts(grp))) + return retval; + + return NC_NOERR; /* everything worked! */ +} +#endif + +/* Open a netcdf-4 file. Things have already been kicked off in + * ncfunc.c in nc_open, but here the netCDF-4 part of opening a file + * is handled. */ +static int +nc4_open_file(const char *path, int mode, MPI_Comm comm, + MPI_Info info, NC_FILE_INFO_T *nc) +{ + hid_t fapl_id = H5P_DEFAULT; + unsigned flags = (mode & NC_WRITE) ? + H5F_ACC_RDWR : H5F_ACC_RDONLY; + int retval; + + LOG((3, "nc4_open_file: path %s mode %d", path, mode)); + assert(path && nc); + + /* Stop diskless open in its tracks */ + if(mode & NC_DISKLESS) + return NC_EDISKLESS; + + /* Add necessary structs to hold netcdf-4 file data. */ + if ((retval = nc4_nc4f_list_add(nc, path, mode))) + BAIL(retval); + assert(nc->nc4_info && nc->nc4_info->root_grp); + + /* Need this access plist to control how HDF5 handles open onjects + * on file close. (Setting H5F_CLOSE_SEMI will cause H5Fclose to + * fail if there are any open objects in the file. */ + if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif +#ifdef EXTRA_TESTS + if (H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI)) + BAIL(NC_EHDFERR); +#else + if (H5Pset_fclose_degree(fapl_id, H5F_CLOSE_STRONG)) + BAIL(NC_EHDFERR); +#endif + +#ifdef USE_PARALLEL + /* If this is a parallel file create, set up the file creation + property list. */ + if (mode & NC_MPIIO || mode & NC_MPIPOSIX) + { + nc->nc4_info->parallel++; + if (mode & NC_MPIIO) /* MPI/IO */ + { + LOG((4, "opening parallel file with MPI/IO")); + if (H5Pset_fapl_mpio(fapl_id, comm, info) < 0) + BAIL(NC_EPARINIT); + } + else /* MPI/POSIX */ + { + LOG((4, "opening parallel file with MPI/posix")); + if (H5Pset_fapl_mpiposix(fapl_id, comm, 0) < 0) + BAIL(NC_EPARINIT); + } + } +#else /* only set cache for non-parallel. */ + if (H5Pset_cache(fapl_id, 0, nc4_chunk_cache_nelems, nc4_chunk_cache_size, + nc4_chunk_cache_preemption) < 0) + BAIL(NC_EHDFERR); + LOG((4, "nc4_open_file: set HDF raw chunk cache to size %d nelems %d preemption %f", + nc4_chunk_cache_size, nc4_chunk_cache_nelems, nc4_chunk_cache_preemption)); +#endif /* USE_PARALLEL */ + + /* The NetCDF-3.x prototype contains an mode option NC_SHARE for + multiple processes accessing the dataset concurrently. As there + is no HDF5 equivalent, NC_SHARE is treated as NC_NOWRITE. */ + if ((nc->nc4_info->hdfid = H5Fopen(path, flags, fapl_id)) < 0) + BAIL(NC_EHDFERR); + + /* Does the mode specify that this file is read-only? */ + if ((mode & NC_WRITE) == 0) + nc->nc4_info->no_write++; + + /* Now read in all the metadata. Some types and dimscale + * information may be difficult to resolve here, if, for example, a + * dataset of user-defined type is encountered before the + * definition of that type. */ + if ((retval = nc4_rec_read_types(nc->nc4_info->root_grp))) + BAIL(retval); + if ((retval = nc4_rec_read_vars(nc->nc4_info->root_grp))) + BAIL(retval); + + /* Now figure out which netCDF dims are indicated by the dimscale + * information. */ + if ((retval = nc4_rec_match_dimscales(nc->nc4_info->root_grp))) + BAIL(retval); + +#ifdef LOGGING + /* This will print out the names, types, lens, etc of the vars and + atts in the file, if the logging level is 2 or greater. */ + log_metadata_nc(nc); +#endif + + /* Close the property list. */ + if (H5Pclose(fapl_id) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + + return NC_NOERR; + + exit: + if (fapl_id != H5P_DEFAULT) H5Pclose(fapl_id); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (nc->nc4_info->hdfid > 0) H5Fclose(nc->nc4_info->hdfid); + if (nc->nc4_info) free(nc->nc4_info); + return retval; +} + +/* Given an HDF4 type, set a pointer to netcdf type. */ +#ifdef USE_HDF4 +static int +get_netcdf_type_from_hdf4(NC_HDF5_FILE_INFO_T *h5, int32 hdf4_typeid, + nc_type *xtype, NC_TYPE_INFO_T *type_info) +{ + int t; + assert(h5 && xtype); + + switch(hdf4_typeid) + { + case DFNT_CHAR: + *xtype = NC_CHAR; + t = 0; + break; + case DFNT_UCHAR: + case DFNT_UINT8: + *xtype = NC_UBYTE; + t = 6; + break; + case DFNT_INT8: + *xtype = NC_BYTE; + t = 1; + break; + case DFNT_INT16: + *xtype = NC_SHORT; + t = 2; + break; + case DFNT_UINT16: + *xtype = NC_USHORT; + t = 7; + break; + case DFNT_INT32: + *xtype = NC_INT; + t = 3; + break; + case DFNT_UINT32: + *xtype = NC_UINT; + t = 8; + break; + case DFNT_FLOAT32: + *xtype = NC_FLOAT; + t = 4; + break; + case DFNT_FLOAT64: + *xtype = NC_DOUBLE; + t = 5; + break; + default: + *xtype = NC_NAT; + return NC_EBADTYPID; + } + + if (type_info) + { + if (hdf4_typeid == DFNT_FLOAT32 || hdf4_typeid == DFNT_FLOAT64) + type_info->class = H5T_FLOAT; + else if (hdf4_typeid == DFNT_CHAR) + type_info->class = H5T_STRING; + else + type_info->class = H5T_INTEGER; + type_info->endianness = NC_ENDIAN_BIG; + type_info->nc_typeid = *xtype; + if (type_info->name) + free(type_info->name); + if (!(type_info->name = malloc((strlen(nc_type_name[t]) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(type_info->name, nc_type_name[t]); + } + + return NC_NOERR; +} +#endif /* USE_HDF4 */ + +/* Open a HDF4 file. Things have already been kicked off in nc_open, + * but here the netCDF-4 part of opening a file is handled. */ +static int +nc4_open_hdf4_file(const char *path, int mode, NC_FILE_INFO_T *nc) +{ +#ifdef USE_HDF4 + NC_HDF5_FILE_INFO_T *h5; + NC_GRP_INFO_T *grp; + NC_ATT_INFO_T *att; + NC_VAR_INFO_T *var; + int32 num_datasets, num_gatts; + int32 rank; + int v, d, a; + int retval; + + LOG((3, "nc4_open_hdf4_file: path %s mode %d", path, mode)); + assert(path && nc); + + /* Must be read-only access to hdf4 files. */ + if (mode & NC_WRITE) + return NC_EINVAL; + + /* Add necessary structs to hold netcdf-4 file data. */ + if ((retval = nc4_nc4f_list_add(nc, path, mode))) + return retval; + assert(nc->nc4_info && nc->nc4_info->root_grp); + h5 = nc->nc4_info; + h5->hdf4++; + grp = h5->root_grp; + h5->no_write++; + + /* Open the file and initialize SD interface. */ + if ((h5->sdid = SDstart(path, DFACC_READ)) == FAIL) + return NC_EHDFERR; + + /* Learn how many datasets and global atts we have. */ + if (SDfileinfo(h5->sdid, &num_datasets, &num_gatts)) + return NC_EHDFERR; + + /* Read the atts. */ + for (a = 0; a < num_gatts; a++) + { + int32 att_data_type, att_count; + size_t att_type_size; + + /* Add to the end of the list of atts for this var. */ + if ((retval = nc4_att_list_add(&h5->root_grp->att))) + return retval; + for (att = h5->root_grp->att; att->next; att = att->next) + ; + att->attnum = grp->natts++; + att->created++; + + /* Learn about this attribute. */ + if (!(att->name = malloc(NC_MAX_HDF4_NAME * sizeof(char)))) + return NC_ENOMEM; + if (SDattrinfo(h5->sdid, a, att->name, &att_data_type, &att_count)) + return NC_EATTMETA; + if ((retval = get_netcdf_type_from_hdf4(h5, att_data_type, + &att->xtype, NULL))) + return retval; + att->len = att_count; + + /* Allocate memory to hold the data. */ + if ((retval = nc4_get_typelen_mem(h5, att->xtype, 0, &att_type_size))) + return retval; + if (!(att->data = malloc(att_type_size * att->len))) + return NC_ENOMEM; + + /* Read the data. */ + if (SDreadattr(h5->sdid, a, att->data)) + return NC_EHDFERR; + } + + /* Read each dataset. */ + for (v = 0; v < num_datasets; v++) + { + int32 data_type, num_atts; + int32 dimsize[NC_MAX_DIMS]; + size_t var_type_size; + int a; + + /* Add a variable to the end of the group's var list. */ + if ((retval = nc4_var_list_add(&grp->var, &var))) + return retval; + var->varid = grp->nvars++; + var->created = 1; + var->written_to = 1; + + /* Open this dataset in HDF4 file. */ + if ((var->sdsid = SDselect(h5->sdid, v)) == FAIL) + return NC_EVARMETA; + + /* Get shape, name, type, and attribute info about this dataset. */ + if (!(var->name = malloc(NC_MAX_HDF4_NAME + 1))) + return NC_ENOMEM; + if (SDgetinfo(var->sdsid, var->name, &rank, dimsize, &data_type, &num_atts)) + return NC_EVARMETA; + var->ndims = rank; + var->hdf4_data_type = data_type; + + /* Fill special type_info struct for variable type information. */ + if (!(var->type_info = calloc(1, sizeof(NC_TYPE_INFO_T)))) + return NC_ENOMEM; + if ((retval = get_netcdf_type_from_hdf4(h5, data_type, &var->xtype, var->type_info))) + return retval; + if ((retval = nc4_get_typelen_mem(h5, var->xtype, 0, &var_type_size))) + return retval; + var->type_info->size = var_type_size; + LOG((3, "reading HDF4 dataset %s, rank %d netCDF type %d", var->name, + rank, var->xtype)); + + /* Get the fill value. */ + if (!(var->fill_value = malloc(var_type_size))) + return NC_ENOMEM; + if (SDgetfillvalue(var->sdsid, var->fill_value)) + { + /* Whoops! No fill value! */ + free(var->fill_value); + var->fill_value = NULL; + } + + /* Allocate storage for dimension info in this variable. */ + if (var->ndims) + { + if (!(var->dim = malloc(sizeof(NC_DIM_INFO_T *) * var->ndims))) + return NC_ENOMEM; + if (!(var->dimids = malloc(sizeof(int) * var->ndims))) + return NC_ENOMEM; + } + + /* Find its dimensions. */ + for (d = 0; d < var->ndims; d++) + { + int32 dimid, dim_len, dim_data_type, dim_num_attrs; + char dim_name[NC_MAX_NAME + 1]; + NC_DIM_INFO_T *dim; + + if ((dimid = SDgetdimid(var->sdsid, d)) == FAIL) + return NC_EDIMMETA; + if (SDdiminfo(dimid, dim_name, &dim_len, &dim_data_type, + &dim_num_attrs)) + return NC_EDIMMETA; + + /* Do we already have this dimension? HDF4 explicitly uses + * the name to tell. */ + for (dim = grp->dim; dim; dim = dim->next) + if (!strcmp(dim->name, dim_name)) + break; + + /* If we didn't find this dimension, add one. */ + if (!dim) + { + LOG((4, "adding dimension %s for HDF4 dataset %s", + dim_name, var->name)); + if ((retval = nc4_dim_list_add(&grp->dim))) + return retval; + grp->ndims++; + dim = grp->dim; + dim->dimid = grp->file->nc4_info->next_dimid++; + if (strlen(dim_name) > NC_MAX_HDF4_NAME) + return NC_EMAXNAME; + if (!(dim->name = malloc(NC_MAX_HDF4_NAME + 1))) + return NC_ENOMEM; + strcpy(dim->name, dim_name); + if (dim_len) + dim->len = dim_len; + else + dim->len = *dimsize; + } + + /* Tell the variable the id of this dimension. */ + var->dimids[d] = dim->dimid; + } + + /* Read the atts. */ + for (a = 0; a < num_atts; a++) + { + int32 att_data_type, att_count; + size_t att_type_size; + + /* Add to the end of the list of atts for this var. */ + if ((retval = nc4_att_list_add(&var->att))) + return retval; + for (att = var->att; att->next; att = att->next) + ; + att->attnum = var->natts++; + att->created++; + + /* Learn about this attribute. */ + if (!(att->name = malloc(NC_MAX_HDF4_NAME * sizeof(char)))) + return NC_ENOMEM; + if (SDattrinfo(var->sdsid, a, att->name, &att_data_type, &att_count)) + return NC_EATTMETA; + if ((retval = get_netcdf_type_from_hdf4(h5, att_data_type, + &att->xtype, NULL))) + return retval; + att->len = att_count; + + /* Allocate memory to hold the data. */ + if ((retval = nc4_get_typelen_mem(h5, att->xtype, 0, &att_type_size))) + return retval; + if (!(att->data = malloc(att_type_size * att->len))) + return NC_ENOMEM; + + /* Read the data. */ + if (SDreadattr(var->sdsid, a, att->data)) + return NC_EHDFERR; + } + } /* next var */ + +#ifdef LOGGING + /* This will print out the names, types, lens, etc of the vars and + atts in the file, if the logging level is 2 or greater. */ + log_metadata_nc(h5->root_grp->file); +#endif + return NC_NOERR; +#endif /* USE_HDF4 */ + return NC_ENOTBUILT; +} + +int +NC4_open(const char *path, int mode, int basepe, size_t *chunksizehintp, + int use_parallel, void *mpidata, NC_Dispatch *dispatch, NC **ncpp) +{ + int hdf_file = 0; + NC_FILE_INFO_T *nc_file; +#ifdef USE_PARALLEL + MPI_Comm comm = 0; + MPI_Info info = 0; +#else + int comm = 0, info = 0; +#endif /* USE_PARALLEL */ + int res; + + assert(ncpp && path); + + LOG((1, "nc_open_file: path %s mode %d comm %d info %d", + path, mode, comm, info)); + +#ifdef USE_PARALLEL + if (mpidata) + { + NC_MPI_INFO *nmi = (NC_MPI_INFO *)mpidata; + comm = nmi->comm; info = nmi->info; + } +#endif /* USE_PARALLEL */ + + /* If this is our first file, turn off HDF5 error messages. */ + if (virgin) + { + if (H5Eset_auto(NULL, NULL) < 0) + LOG((0, "Couldn't turn off HDF5 error messages!")); + LOG((1, "HDF5 error messages turned off!")); + virgin = 0; + } + + /* Check the mode for validity. First make sure only certain bits + * are turned on. Also MPI I/O and MPI POSIX cannot both be + * selected at once. */ + if (mode & ~(NC_WRITE | NC_SHARE | NC_MPIIO | NC_MPIPOSIX | + NC_PNETCDF | NC_NOCLOBBER | NC_NETCDF4 | NC_CLASSIC_MODEL) || + (mode & NC_MPIIO && mode & NC_MPIPOSIX)) + return NC_EINVAL; + + /* Figure out if this is a hdf4 or hdf5 file. */ + if ((res = nc_check_for_hdf(path, use_parallel, comm, info, &hdf_file))) + return res; + + /* Allocate the storage for this file info struct, and fill it with + zeros. */ + if ((res = nc4_file_list_add(&nc_file,dispatch))) + return res; + + /* Depending on the type of file, open it. */ + if (hdf_file == NC_HDF5_FILE) + { + nc_file->int_ncid = nc_file->ext_ncid; + res = nc4_open_file(path, mode, comm, info, nc_file); + } + else if (hdf_file == NC_HDF4_FILE) + { + nc_file->int_ncid = nc_file->ext_ncid; + res = nc4_open_hdf4_file(path, mode, nc_file); + } +#ifdef USE_PNETCDF + else if (mode & NC_PNETCDF) + { + int pnetcdf_nvars, i; + + res = ncmpi_open(comm, path, mode, info, &(nc_file->int_ncid)); + nc_file->pnetcdf_file++; + + /* Default to independent access, like netCDF-4/HDF5 files. */ + if (!res) + res = ncmpi_begin_indep_data(nc_file->int_ncid); + + /* I need to keep track of the ndims of each var to translate + * start, count, and stride arrays to MPI_Offset type. */ + if (!res) + { + res = ncmpi_inq_nvars(nc_file->int_ncid, &pnetcdf_nvars); + for (i = 0; i < pnetcdf_nvars; i++) + res = ncmpi_inq_varndims(nc_file->int_ncid, i, + &(nc_file->pnetcdf_ndims[i])); + + } + } +#endif /* USE_PNETCDF */ + else /* netcdf */ + { + assert(0); + } + + /* If it succeeds, pass back the new ncid. Otherwise, remove this + file from the list. */ + if (res) + { + if(nc_file != NULL) nc4_file_list_del(nc_file); + } + else + { + *ncpp = (NC*)nc_file; + } + + return res; +} + +/* Unfortunately HDF only allows specification of fill value only when + a dataset is created. Whereas in netcdf, you first create the + variable and then (optionally) specify the fill value. To + accomplish this in HDF5 I have to delete the dataset, and recreate + it, with the fill value specified. */ +int +NC4_set_fill(int ncid, int fillmode, int *old_modep) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc_set_fill: ncid 0x%x fillmode %d", ncid, fillmode)); + + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + + /* Is this a netcdf-3 file? */ + assert(nc->nc4_info); + + /* Trying to set fill on a read-only file? You sicken me! */ + if (nc->nc4_info->no_write) + return NC_EPERM; + + /* Did you pass me some weird fillmode? */ + if (fillmode != NC_FILL && fillmode != NC_NOFILL) + return NC_EINVAL; + + /* If the user wants to know, tell him what the old mode was. */ + if (old_modep) + *old_modep = nc->nc4_info->fill_mode; + + nc->nc4_info->fill_mode = fillmode; + + return NC_NOERR; +} + +/* Put the file back in redef mode. This is done automatically for + * netcdf-4 files, if the user forgets. */ +int +NC4_redef(int ncid) +{ + NC_FILE_INFO_T *nc; + + LOG((1, "nc_redef: ncid 0x%x", ncid)); + + /* Find this file's metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_redef(nc->int_ncid); +#endif /* USE_PNETCDF */ + + /* Handle netcdf-3 files. */ + assert(nc->nc4_info); + + /* If we're already in define mode, return an error. */ + if (nc->nc4_info->flags & NC_INDEF) + return NC_EINDEFINE; + + /* If the file is read-only, return an error. */ + if (nc->nc4_info->no_write) + return NC_EPERM; + + /* Set define mode. */ + nc->nc4_info->flags |= NC_INDEF; + + /* For nc_abort, we need to remember if we're in define mode as a + redef. */ + nc->nc4_info->redef++; + + return NC_NOERR; +} + +/* For netcdf-4 files, this just calls nc_enddef, ignoring the extra + * parameters. */ +int +NC4__enddef(int ncid, size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align) +{ + if (!nc4_find_nc_file(ncid)) + return NC_EBADID; + + return NC4_enddef(ncid); +} + +/* Take the file out of define mode. This is called automatically for + * netcdf-4 files, if the user forgets. */ +static int NC4_enddef(int ncid) +{ + NC_FILE_INFO_T *nc; + + LOG((1, "nc_enddef: ncid 0x%x", ncid)); + + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + if (nc->pnetcdf_file) + { + int res; + res = ncmpi_enddef(nc->int_ncid); + if (!res) + { + if (nc->pnetcdf_access_mode == NC_INDEPENDENT) + res = ncmpi_begin_indep_data(nc->int_ncid); + } + return res; + } +#endif /* USE_PNETCDF */ + + /* Take care of netcdf-3 files. */ + assert(nc->nc4_info); + + return nc4_enddef_netcdf4_file(nc->nc4_info); +} + +/* This function will write all changed metadata, and (someday) reread + * all metadata from the file. */ +static int +sync_netcdf4_file(NC_HDF5_FILE_INFO_T *h5) +{ + int retval; + + assert(h5); + LOG((3, "sync_netcdf4_file")); + + /* If we're in define mode, that's an error, for strict nc3 rules, + * otherwise, end define mode. */ + if (h5->flags & NC_INDEF) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_EINDEFINE; + + /* Turn define mode off. */ + h5->flags ^= NC_INDEF; + + /* Redef mode needs to be tracked seperately for nc_abort. */ + h5->redef = 0; + } + +#ifdef LOGGING + /* This will print out the names, types, lens, etc of the vars and + atts in the file, if the logging level is 2 or greater. */ + log_metadata_nc(h5->root_grp->file); +#endif + + /* Write any metadata that has changed. */ + if (!(h5->cmode & NC_NOWRITE)) + { + if ((retval = nc4_rec_write_types(h5->root_grp))) + return retval; + if ((retval = nc4_rec_write_metadata(h5->root_grp))) + return retval; + } + + H5Fflush(h5->hdfid, H5F_SCOPE_GLOBAL); + + /* Reread all the metadata. */ + /*if ((retval = nc4_rec_read_metadata(grp))) + return retval;*/ + + return retval; +} + +/* Flushes all buffers associated with the file, after writing all + changed metadata. This may only be called in data mode. */ +int +NC4_sync(int ncid) +{ + NC_FILE_INFO_T *nc; + int retval; + + LOG((2, "nc_sync: ncid 0x%x", ncid)); + + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_sync(nc->int_ncid); +#endif /* USE_PNETCDF */ + + /* Take care of netcdf-3 files. */ + assert(nc->nc4_info); + + /* If we're in define mode, we can't sync. */ + if (nc->nc4_info && nc->nc4_info->flags & NC_INDEF) + { + if (nc->nc4_info->cmode & NC_CLASSIC_MODEL) + return NC_EINDEFINE; + if ((retval = nc_enddef(ncid))) + return retval; + } + + return sync_netcdf4_file(nc->nc4_info); +} + +/* This function will free all allocated metadata memory, and close + the HDF5 file. The group that is passed in must be the root group + of the file. */ +static int +close_netcdf4_file(NC_HDF5_FILE_INFO_T *h5, int abort) +{ + int retval; + + assert(h5 && h5->root_grp); + LOG((3, "close_netcdf4_file: h5->path %s abort %d", + h5->path, abort)); + + /* According to the docs, always end define mode on close. */ + if (h5->flags & NC_INDEF) + h5->flags ^= NC_INDEF; + + /* Sync the file, unless we're aborting, or this is a read-only + * file. */ + if (!h5->no_write && !abort) + if ((retval = sync_netcdf4_file(h5))) + return retval; + + /* Delete all the list contents for vars, dims, and atts, in each + * group. */ + if ((retval = nc4_rec_grp_del(&h5->root_grp, h5->root_grp))) + return retval; + + /* Close hdf file. */ + if (h5->hdf4) + { +#ifdef USE_HDF4 + if (SDend(h5->sdid)) + return NC_EHDFERR; +#endif /* USE_HDF4 */ + } + else + { + if (H5Fclose(h5->hdfid) < 0) + { + int nobjs; + nobjs = H5Fget_obj_count(h5->hdfid, H5F_OBJ_ALL); + /* Apparently we can get an error even when nobjs == 0 */ + if(nobjs < 0) { + return NC_EHDFERR; + } else if(nobjs > 0) { +#ifdef LOGGING + /* If the close doesn't work, probably there are still some HDF5 + * objects open, which means there's a bug in the library. So + * print out some info on to help the poor programmer figure it + * out. */ + LOG((0, "There are %d HDF5 objects open!", nobjs)); +#endif + return NC_EHDFERR; + } + } +/* if (H5garbage_collect() < 0) + return NC_EHDFERR; */ + } + + /* Delete the memory for the path, if it's been allocated. */ + if (h5->path) + free(h5->path); + + /* Free the nc4_info struct. */ + free(h5); + return NC_NOERR; +} + +/* From the netcdf-3 docs: The function nc_abort just closes the + netCDF dataset, if not in define mode. If the dataset is being + created and is still in define mode, the dataset is deleted. If + define mode was entered by a call to nc_redef, the netCDF dataset + is restored to its state before definition mode was entered and the + dataset is closed. */ +int +NC4_abort(int ncid) +{ + NC_FILE_INFO_T *nc; + int delete_file = 0; + char path[NC_MAX_NAME + 1]; + int retval = NC_NOERR; + + LOG((2, "nc_abort: ncid 0x%x", ncid)); + + /* Find metadata for this file. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_abort(nc->int_ncid); +#endif /* USE_PNETCDF */ + + /* If this is a netcdf-3 file, let the netcdf-3 library handle it. */ + assert(nc->nc4_info); + + /* If we're in define mode, but not redefing the file, delete it. */ + if (nc->nc4_info->flags & NC_INDEF && !nc->nc4_info->redef) + { + delete_file++; + strcpy(path, nc->nc4_info->path); + /*strcpy(path, nc->path);*/ + } + + /* Free any resources the netcdf-4 library has for this file's + * metadata. */ + if ((retval = close_netcdf4_file(nc->nc4_info, 1))) + return retval; + + /* Delete the file, if we should. */ + if (delete_file) + remove(path); + + /* Delete this entry from our list of open files. */ + nc4_file_list_del(nc); + + return retval; +} + +/* Close the netcdf file, writing any changes first. */ +int +NC4_close(int ncid) +{ + NC_GRP_INFO_T *grp; + NC_FILE_INFO_T *nc; + NC_HDF5_FILE_INFO_T *h5; + int retval; + + LOG((1, "nc_close: ncid 0x%x", ncid)); + + /* Find our metadata for this file. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_close(nc->int_ncid); +#endif /* USE_PNETCDF */ + + assert(h5 && nc); + + /* This must be the root group. */ + if (grp->parent) + return NC_EBADGRPID; + + /* Call the nc4 close. */ + if ((retval = close_netcdf4_file(grp->file->nc4_info, 0))) + return retval; + + /* Delete this entry from our list of open files. */ + if (nc->path) + free(nc->path); + nc4_file_list_del(nc); + + /* Reset the ncid numbers if there are no more files open. */ + if(count_NCList() == 0) + nc4_file_list_free(); + + return NC_NOERR; +} + +/* It's possible for any of these pointers to be NULL, in which case + don't try to figure out that value. */ +int +NC4_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp) +{ + NC_FILE_INFO_T *nc; + NC_HDF5_FILE_INFO_T *h5; + NC_GRP_INFO_T *grp; + NC_DIM_INFO_T *dim; + NC_ATT_INFO_T *att; + NC_VAR_INFO_T *var; + int retval; + + LOG((2, "nc_inq: ncid 0x%x", ncid)); + + /* Find file metadata. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_inq(nc->int_ncid, ndimsp, nvarsp, nattsp, unlimdimidp); +#endif /* USE_PNETCDF */ + + /* Netcdf-3 files are already taken care of. */ + assert(h5 && grp && nc); + + /* Count the number of dims, vars, and global atts. */ + if (ndimsp) + { + *ndimsp = 0; + for (dim = grp->dim; dim; dim = dim->next) + (*ndimsp)++; + } + if (nvarsp) + { + *nvarsp = 0; + for (var = grp->var; var; var= var->next) + (*nvarsp)++; + } + if (nattsp) + { + *nattsp = 0; + for (att = grp->att; att; att = att->next) + (*nattsp)++; + } + + if (unlimdimidp) + { + /* Default, no unlimited dimension */ + int found = 0; + *unlimdimidp = -1; + + /* If there's more than one unlimited dim, which was not possible + with netcdf-3, then only the last unlimited one will be reported + back in xtendimp. */ + /* Note that this code is inconsistent with nc_inq_unlimid() */ + for (dim = grp->dim; dim; dim = dim->next) + if (dim->unlimited) + { + *unlimdimidp = dim->dimid; + break; + } + } + + return NC_NOERR; +} + + +/* This function will do the enddef stuff for a netcdf-4 file. */ +int +nc4_enddef_netcdf4_file(NC_HDF5_FILE_INFO_T *h5) +{ + assert(h5); + LOG((3, "nc4_enddef_netcdf4_file")); + + /* If we're not in define mode, return an error. */ + if (!(h5->flags & NC_INDEF)) + return NC_ENOTINDEFINE; + + /* Turn define mode off. */ + h5->flags ^= NC_INDEF; + + /* Redef mode needs to be tracked seperately for nc_abort. */ + h5->redef = 0; + + return sync_netcdf4_file(h5); +} + +#ifdef EXTRA_TESTS +int +nc_exit() +{ + if (num_plists || num_spaces) + return NC_EHDFERR; + + return NC_NOERR; +} +#endif /* EXTRA_TESTS */ + +#ifdef USE_PARALLEL +int +nc_use_parallel_enabled() +{ + return 0; +} +#endif /* USE_PARALLEL */ + + diff --git a/extern/src_netcdf4/nc4grp.c b/extern/src_netcdf4/nc4grp.c new file mode 100644 index 0000000..93b269c --- /dev/null +++ b/extern/src_netcdf4/nc4grp.c @@ -0,0 +1,440 @@ +/* +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file handles the nc4 groups. + +Copyright 2005, University Corporation for Atmospheric Research. See +netcdf-4/docs/COPYRIGHT file for copying and redistribution +conditions. + +$Id: nc4grp.c,v 1.44 2010/05/25 17:54:23 dmh Exp $ +*/ + +#include "nc4internal.h" +#include "nc4dispatch.h" + +/* Create a group. It's ncid is returned in the new_ncid pointer. */ +int +NC4_def_grp(int parent_ncid, const char *name, int *new_ncid) +{ + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + LOG((2, "nc_def_grp: parent_ncid 0x%x name %s", parent_ncid, name)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(parent_ncid, &grp, &h5))) + return retval; + if (!h5) + return NC_ENOTNC4; + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + /* Check that this name is not in use as a var, grp, or type. */ + if ((retval = nc4_check_dup_name(grp, norm_name))) + return retval; + + /* No groups in netcdf-3! */ + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_ESTRICTNC3; + + /* If it's not in define mode, switch to define mode. */ + if (!(h5->flags & NC_INDEF)) + if ((retval = NC4_redef(parent_ncid))) + return retval; + + /* Update internal lists to reflect new group. The actual HDF5 + * group creation will be done when metadata is written by a + * sync. */ + if ((retval = nc4_grp_list_add(&(grp->children), h5->next_nc_grpid, + grp, grp->file, norm_name, &g))) + return retval; + if (new_ncid) + *new_ncid = grp->file->ext_ncid | h5->next_nc_grpid; + h5->next_nc_grpid++; + + return NC_NOERR; +} + +/* Given an ncid and group name (NULL gets root group), return + * the ncid of that group. */ +int +NC4_inq_ncid(int ncid, const char *name, int *grp_ncid) +{ + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + LOG((2, "nc_inq_ncid: ncid 0x%x name %s", ncid, name)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + /* Groups only work with netCDF-4/HDF5 files... */ + if (!h5) + return NC_ENOTNC4; + + /* Normalize name. */ + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + + /* Look through groups for one of this name. */ + for (g = grp->children; g; g = g->next) + if (!strcmp(norm_name, g->name)) /* found it! */ + { + if (grp_ncid) + *grp_ncid = grp->file->ext_ncid | g->nc_grpid; + return NC_NOERR; + } + + /* If we got here, we didn't find the named group. */ + return NC_ENOGRP; +} + +/* Given a location id, return the number of groups it contains, and + * an array of their locids. */ +int +NC4_inq_grps(int ncid, int *numgrps, int *ncids) +{ + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + int num = 0; + int retval; + + LOG((2, "nc_inq_grps: ncid 0x%x", ncid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + /* For netCDF-3 files, just report zero groups. */ + if (!h5) + { + if (numgrps) + *numgrps = 0; + return NC_NOERR; + } + + /* Count the number of groups in this group. */ + for (g = grp->children; g; g = g->next) + { + if (ncids) + { + /* Combine the nc_grpid in a bitwise or with the ext_ncid, + * which allows the returned ncid to carry both file and + * group information. */ + *ncids = g->nc_grpid | g->file->ext_ncid; + ncids++; + } + num++; + } + + if (numgrps) + *numgrps = num; + + return NC_NOERR; +} + +/* Given locid, find name of group. (Root group is named "/".) */ +int +NC4_inq_grpname(int ncid, char *name) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + int retval; + + LOG((2, "nc_inq_grpname: ncid 0x%x", ncid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + if (name) + { + if (!h5) + strcpy(name, "/"); + else + strcpy(name, grp->name); + } + + return NC_NOERR; +} + +/* Find the full path name to the group represented by ncid. Either + * pointer argument may be NULL; pass a NULL for the third parameter + * to get the length of the full path name. The length will not + * include room for a null pointer. */ +int +NC4_inq_grpname_full(int ncid, size_t *lenp, char *full_name) +{ + char *name, grp_name[NC_MAX_NAME + 1]; + int g, id = ncid, parent_id, *gid; + int i, ret = NC_NOERR; + + /* How many generations? */ + for (g = 0; !nc_inq_grp_parent(id, &parent_id); g++, id = parent_id) + ; + + /* Allocate storage. */ + if (!(name = malloc((g + 1) * (NC_MAX_NAME + 1) + 1))) + return NC_ENOMEM; + if (!(gid = malloc((g + 1) * sizeof(int)))) + { + free(name); + return NC_ENOMEM; + } + assert(name && gid); + + /* Always start with a "/" for the root group. */ + strcpy(name, "/"); + + /* Get the ncids for all generations. */ + gid[0] = ncid; + for (i = 1; i < g && !ret; i++) + ret = nc_inq_grp_parent(gid[i - 1], &gid[i]); + + /* Assemble the full name. */ + for (i = g - 1; !ret && i >= 0 && !ret; i--) + { + if ((ret = nc_inq_grpname(gid[i], grp_name))) + break; + strcat(name, grp_name); + if (i) + strcat(name, "/"); + } + + /* Give the user the length of the name, if he wants it. */ + if (!ret && lenp) + *lenp = strlen(name); + + /* Give the user the name, if he wants it. */ + if (!ret && full_name) + strcpy(full_name, name); + + free(gid); + free(name); + + return ret; +} + +/* Find the parent ncid of a group. For the root group, return + * NC_ENOGRP error. *Now* I know what kind of tinfoil hat wearing nut + * job would call this function with a NULL pointer for parent_ncid - + * Russ Rew!! */ +int +NC4_inq_grp_parent(int ncid, int *parent_ncid) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + int retval; + + LOG((2, "nc_inq_grp_parent: ncid 0x%x", ncid)); + + /* Find info for this file and group. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + /* Groups only work with netCDF-4/HDF5 files... */ + if (!h5) + return NC_ENOGRP; + + /* Set the parent ncid, if there is one. */ + if (grp->parent) + { + if (parent_ncid) + *parent_ncid = grp->file->ext_ncid | grp->parent->nc_grpid; + } + else + return NC_ENOGRP; + + return NC_NOERR; +} + +/* Given a full name and ncid, find group ncid. */ +int +NC4_inq_grp_full_ncid(int ncid, const char *full_name, int *grp_ncid) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + int id1 = ncid, id2; + char *cp, *full_name_cpy; + int ret; + + if (!full_name) + return NC_EINVAL; + + /* Find info for this file and group, and set pointer to each. */ + if ((ret = nc4_find_grp_h5(ncid, &grp, &h5))) + return ret; + + /* Copy full_name because strtok messes with the value it works + * with, and we don't want to mess up full_name. */ + if (!(full_name_cpy = malloc(strlen(full_name) + 1))) + return NC_ENOMEM; + strcpy(full_name_cpy, full_name); + + /* Get the first part of the name. */ + if (!(cp = strtok(full_name_cpy, "/"))) + { + /* If "/" is passed, and this is the root group, return the root + * group id. */ + if (!grp->parent) + id2 = ncid; + else + { + free(full_name_cpy); + return NC_ENOGRP; + } + } + else + { + /* Keep parsing the string. */ + for (; cp; id1 = id2) + { + if ((ret = nc_inq_grp_ncid(id1, cp, &id2))) + { + free(full_name_cpy); + return ret; + } + cp = strtok(NULL, "/"); + } + } + + /* Give the user the requested value. */ + if (grp_ncid) + *grp_ncid = id2; + + free(full_name_cpy); + + return NC_NOERR; +} + +/* Get a list of ids for all the variables in a group. */ +int +NC4_inq_varids(int ncid, int *nvars, int *varids) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + int v, num_vars = 0; + int retval; + + LOG((2, "nc_inq_varids: ncid 0x%x", ncid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + if (!h5) + { + /* If this is a netcdf-3 file, there is only one group, the root + * group, and its vars have ids 0 thru nvars - 1. */ + if ((retval = nc_inq(ncid, NULL, &num_vars, NULL, NULL))) + return retval; + if (varids) + for (v = 0; v < num_vars; v++) + varids[v] = v; + } + else + { + /* This is a netCDF-4 group. Round up them doggies and count + * 'em. The list is in correct (i.e. creation) order. */ + if (grp->var) + { + for (var = grp->var; var; var = var->next) + { + if (varids) + varids[num_vars] = var->varid; + num_vars++; + } + } + } + + /* If the user wants to know how many vars in the group, tell + * him. */ + if (nvars) + *nvars = num_vars; + + return NC_NOERR; +} + +/* This is the comparison function used for sorting dim ids. Integer + comparison: returns negative if b > a and positive if a > b. */ +int int_cmp(const void *a, const void *b) +{ + const int *ia = (const int *)a; + const int *ib = (const int *)b; + return *ia - *ib; +} + +/* Find all dimids for a location. This finds all dimensions in a + * group, with or without any of its parents, depending on last + * parameter. */ +int +NC4_inq_dimids(int ncid, int *ndims, int *dimids, int include_parents) +{ + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + NC_DIM_INFO_T *dim; + int d, num = 0; + int retval; + + LOG((2, "nc_inq_dimids: ncid 0x%x include_parents: %d", ncid, + include_parents)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + if (!h5) + { + /* If this is a netcdf-3 file, then the dimids are going to be 0 + * thru ndims-1, so just provide them. */ + if ((retval = nc_inq(ncid, &num, NULL, NULL, NULL))) + return retval; + if (dimids) + for (d = 0; d < num; d++) + dimids[d] = d; + } + else + { + /* First count them. */ + for (dim = grp->dim; dim; dim = dim->next) + num++; + if (include_parents) + for (g = grp->parent; g; g = g->parent) + for (dim = g->dim; dim; dim = dim->next) + num++; + + /* If the user wants the dimension ids, get them. */ + if (dimids) + { + int n = 0; + + /* Get dimension ids from this group. */ + for (dim = grp->dim; dim; dim = dim->next) + dimids[n++] = dim->dimid; + + /* Get dimension ids from parent groups. */ + if (include_parents) + for (g = grp->parent; g; g = g->parent) + for (dim = g->dim; dim; dim = dim->next) + dimids[n++] = dim->dimid; + + qsort(dimids, num, sizeof(int), int_cmp); + } + } + + /* If the user wants the number of dims, give it. */ + if (ndims) + *ndims = num; + + return NC_NOERR; +} + diff --git a/extern/src_netcdf4/nc4hdf.c b/extern/src_netcdf4/nc4hdf.c new file mode 100644 index 0000000..5153a68 --- /dev/null +++ b/extern/src_netcdf4/nc4hdf.c @@ -0,0 +1,4041 @@ +/* + This file is part of netcdf-4, a netCDF-like interface for HDF5, or a + HDF5 backend for netCDF, depending on your point of view. + + This file contains functions internal to the netcdf4 library. None of + the functions in this file are exposed in the exetnal API. These + functions handle the HDF interface. + + Copyright 2003, University Corporation for Atmospheric + Research. See the COPYRIGHT file for copying and redistribution + conditions. + + $Id: nc4hdf.c,v 1.273 2010/05/27 21:34:14 dmh Exp $ +*/ + +#include "config.h" +#include "nc4internal.h" +#include +#include + +#ifdef IGNORE +extern NC_FILE_INFO_T *nc_file; +#endif + +#define NC3_STRICT_ATT_NAME "_nc3_strict" + +/* This is to track opened HDF5 objects to make sure they are + * closed. */ +#ifdef EXTRA_TESTS +int num_plists; +int num_spaces; +#endif /* EXTRA_TESTS */ + +/* This function is needed to handle one special case: what if the + * user defines a dim, writes metadata, then goes back into define + * mode and adds a coordinate var for the already existing dim. In + * that case, I need to recreate the dim's dimension scale dataset, + * and then I need to go to every var in the file which uses that + * dimension, and attach the new dimension scale. */ +static int +rec_reattach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid) +{ + NC_VAR_INFO_T *var; + NC_GRP_INFO_T *child_grp; + int d; + int retval; + + assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0); + LOG((3, "rec_reattach_scales: grp->name %s", grp->name)); + + /* If there are any child groups, attach dimscale there, if needed. */ + for (child_grp = grp->children; child_grp; child_grp = child_grp->next) + if ((retval = rec_reattach_scales(child_grp, dimid, dimscaleid))) + return retval; + + /* Find any vars that use this dimension id. */ + for (var = grp->var; var; var = var->next) + for (d = 0; d < var->ndims; d++) + if (var->dimids[d] == dimid && !var->dimscale) + { + LOG((2, "rec_reattach_scaled: attaching scale for dimid %d to var %s", + var->dimids[d], var->name)); + if (var->created) + { + if (H5DSattach_scale(var->hdf_datasetid, dimscaleid, d) < 0) + return NC_EHDFERR; + var->dimscale_attached[d]++; + } + } + + return NC_NOERR; +} + +/* This function is needed to handle one special case: what if the + * user defines a dim, writes metadata, then goes back into define + * mode and adds a coordinate var for the already existing dim. In + * that case, I need to recreate the dim's dimension scale dataset, + * and then I need to go to every var in the file which uses that + * dimension, and attach the new dimension scale. */ +static int +rec_detach_scales(NC_GRP_INFO_T *grp, int dimid, hid_t dimscaleid) +{ + NC_VAR_INFO_T *var; + NC_GRP_INFO_T *child_grp; + int d; + int retval; + + assert(grp && grp->name && dimid >= 0 && dimscaleid >= 0); + LOG((3, "rec_detach_scales: grp->name %s", grp->name)); + + /* If there are any child groups, attach dimscale there, if needed. */ + for (child_grp = grp->children; child_grp; child_grp = child_grp->next) + if ((retval = rec_detach_scales(child_grp, dimid, dimscaleid))) + return retval; + + /* If there are no vars, we are done. */ + if (!grp->var) + return NC_NOERR; + + /* Find any (already created) vars that use this dimension id. Go + * through the list backwards to accomdate a HDF5 bug. */ + for (var = grp->var; var->next; var = var->next) + ; + + for ( ; var; var = var->prev) + for (d = 0; d < var->ndims; d++) + if (var->dimids[d] == dimid && !var->dimscale) + { + LOG((2, "rec_detach_scales: detaching scale for dimid %d to var %s", + var->dimids[d], var->name)); + if (var->created) + { + if (var->dimscale_attached[d]) + { + if (H5DSdetach_scale(var->hdf_datasetid, dimscaleid, d) < 0) + return NC_EHDFERR; + var->dimscale_attached[d] = 0; + } + } + } + + return NC_NOERR; +} + +/* Open the dataset and leave it open. */ +int +nc4_open_var_grp2(NC_GRP_INFO_T *grp, int varid, hid_t *dataset) +{ + NC_VAR_INFO_T *var; + + /* Find the requested varid. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + if (!var) + return NC_ENOTVAR; + + /* Open this dataset if necessary. */ + if (!var->hdf_datasetid) + if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->name, + H5P_DEFAULT)) < 0) + return NC_ENOTVAR; + + *dataset = var->hdf_datasetid; + + return NC_NOERR; +} + +/* Write or read one element of data. + + Oh, better far to live and die + Under the brave black flag I fly, + Than play a sanctimonious part, + With a pirate head and a pirate heart. + + Away to the cheating world go you, + Where pirates all are well-to-do. + But I'll be true to the song I sing, + And live and die a Pirate king. +*/ +int +nc4_pg_var1(NC_PG_T pg, NC_FILE_INFO_T *nc, int ncid, int varid, + const size_t *indexp, nc_type xtype, int is_long, void *ip) +{ + NC_GRP_INFO_T *grp; + NC_VAR_INFO_T *var; + int i; + size_t start[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS]; + int retval; + + /* Find file and var, cause I need the number of dims. */ + assert(nc); + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + assert(grp && var && var->name); + + /* Set up the count and start arrays. */ + for (i=0; indims; i++) + { + start[i] = indexp[i]; + count[i] = 1; + } + + /* Get or put this data. */ + if (pg == GET) + return nc4_get_vara(nc, ncid, varid, start, count, xtype, + is_long, ip); + else + return nc4_put_vara(nc, ncid, varid, start, count, xtype, + is_long, ip); +} + +/* Get the default fill value for an atomic type. Memory for + * fill_value must already be allocated, or you are DOOMED!!!*/ +int +nc4_get_default_fill_value(NC_TYPE_INFO_T *type_info, void *fill_value) +{ + switch (type_info->nc_typeid) + { + case NC_BYTE: + *(signed char *)fill_value = NC_FILL_BYTE; + break; + case NC_CHAR: + *(char *)fill_value = NC_FILL_CHAR; + break; + case NC_SHORT: + *(short *)fill_value = NC_FILL_SHORT; + break; + case NC_INT: + *(int *)fill_value = NC_FILL_INT; + break; + case NC_FLOAT: + *(float *)fill_value = NC_FILL_FLOAT; + break; + case NC_DOUBLE: + *(double *)fill_value = NC_FILL_DOUBLE; + break; + case NC_UBYTE: + *(unsigned char *)fill_value = NC_FILL_UBYTE; + break; + case NC_USHORT: + *(unsigned short *)fill_value = NC_FILL_USHORT; + break; + case NC_UINT: + *(unsigned int *)fill_value = NC_FILL_UINT; + break; + case NC_INT64: + *(long long *)fill_value = NC_FILL_INT64; + break; + case NC_UINT64: + *(unsigned long long *)fill_value = NC_FILL_UINT64; + break; + case NC_STRING: + strcpy((char *)fill_value, ""); + break; + default: + return NC_EINVAL; + } + + return NC_NOERR; +} + +/* What fill value should be used for a variable? */ +static int +get_fill_value(NC_HDF5_FILE_INFO_T *h5, NC_VAR_INFO_T *var, void **fillp) +{ + size_t size; + int retval; + + /* Find out how much space we need for this type's fill value. */ + if ((retval = nc4_get_typelen_mem(h5, var->xtype, 0, &size))) + return retval; + + /* Strings have a size of one for the empty sting (to hold the + * null), otherwise the length of the users fill_value string, plus + * one. */ + if (var->xtype == NC_STRING) + { + size = 1; + } + + /* Allocate the space. VLENS are different, of course. */ + if (var->type_info->class == NC_VLEN) + { + if (!((*fillp) = malloc(sizeof(nc_vlen_t)))) + return NC_ENOMEM; + } + else + { + if (!((*fillp) = malloc(size))) + return NC_ENOMEM; + } + + /* If the user has set a fill_value for this var, use, otherwise + * find the default fill value. */ + if (var->fill_value) + { + LOG((4, "Found a fill value for var %s", var->name)); + if (var->type_info->class == NC_VLEN) + { + nc_vlen_t *in_vlen = (nc_vlen_t *)(var->fill_value), *fv_vlen = (nc_vlen_t *)(*fillp); + fv_vlen->len = in_vlen->len; + if (!(fv_vlen->p = malloc(size * in_vlen->len))) + return NC_ENOMEM; + memcpy(fv_vlen->p, in_vlen->p, in_vlen->len * size); + } + else if (var->xtype == NC_STRING) + { + if (!(*(char **)fillp = malloc((strlen((char *)var->fill_value) + 1) * + sizeof(char)))) + return NC_ENOMEM; + strcpy(*(char **)fillp, (char *)var->fill_value); + } + else + memcpy((*fillp), var->fill_value, size); + } + else + { + if ((nc4_get_default_fill_value(var->type_info, *fillp))) + { + free(*fillp); + *fillp = NULL; + } + } + + return NC_NOERR; +} + +/* Given a netcdf type, return appropriate HDF typeid. */ +int +nc4_get_hdf_typeid(NC_HDF5_FILE_INFO_T *h5, nc_type xtype, + hid_t *hdf_typeid, int endianness) +{ + NC_TYPE_INFO_T *type; + hid_t typeid = 0; + int retval = NC_NOERR; + + assert(hdf_typeid && h5); + + *hdf_typeid = -1; + switch (xtype) + { + case NC_NAT: /* NAT = 'Not A Type' (c.f. NaN) */ + return NC_EBADTYPE; + case NC_BYTE: /* signed 1 byte integer */ + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_I8LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_I8BE; + else + *hdf_typeid = H5T_NATIVE_SCHAR; + break; + case NC_CHAR: /* ISO/ASCII character */ + if ((typeid = H5Tcopy(H5T_C_S1)) < 0) + return NC_EHDFERR; + if (H5Tset_strpad(typeid, H5T_STR_NULLTERM) < 0) + BAIL(NC_EVARMETA); + *hdf_typeid = typeid; + break; + case NC_SHORT: /* signed 2 byte integer */ + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_I16LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_I16BE; + else + *hdf_typeid = H5T_NATIVE_SHORT; + break; + case NC_INT: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_I32LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_I32BE; + else + *hdf_typeid = H5T_NATIVE_INT; + break; + case NC_FLOAT: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_IEEE_F32LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_IEEE_F32BE; + else + *hdf_typeid = H5T_NATIVE_FLOAT; + break; + case NC_DOUBLE: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_IEEE_F64LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_IEEE_F64BE; + else + *hdf_typeid = H5T_NATIVE_DOUBLE; + break; + case NC_UBYTE: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_U8LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_U8BE; + else + *hdf_typeid = H5T_NATIVE_UCHAR; + break; + case NC_USHORT: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_U16LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_U16BE; + else + *hdf_typeid = H5T_NATIVE_USHORT; + break; + case NC_UINT: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_U32LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_U32BE; + else + *hdf_typeid = H5T_NATIVE_UINT; + break; + case NC_INT64: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_I64LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_I64BE; + else + *hdf_typeid = H5T_NATIVE_LLONG; + break; + case NC_UINT64: + if (endianness == NC_ENDIAN_LITTLE) + *hdf_typeid = H5T_STD_U64LE; + else if (endianness == NC_ENDIAN_BIG) + *hdf_typeid = H5T_STD_U64BE; + else + *hdf_typeid = H5T_NATIVE_ULLONG; + break; + case NC_STRING: + if ((typeid = H5Tcopy(H5T_C_S1)) < 0) + return NC_EHDFERR; + if (H5Tset_size(typeid, H5T_VARIABLE) < 0) + return NC_EHDFERR; + *hdf_typeid = typeid; + break; + default: + /* Maybe this is a user defined type? */ + if (!nc4_find_type(h5, xtype, &type)) + { + if (!type) + return NC_EBADTYPE; + *hdf_typeid = type->hdf_typeid; + } + } + + if (*hdf_typeid == -1) + return NC_EBADTYPE; + + return NC_NOERR; + + exit: + if (xtype == NC_CHAR && typeid > 0 && H5Tclose(typeid) < 0) + BAIL2(NC_EHDFERR); + return retval; +} + +/* Do some common check for nc4_put_vara and nc4_get_vara. These + * checks have to be done when both reading and writing data. */ +static int +check_for_vara(nc_type *mem_nc_type, NC_VAR_INFO_T *var, NC_HDF5_FILE_INFO_T *h5) +{ + int retval; + + /* If mem_nc_type is NC_NAT, it means we want to use the file type + * as the mem type as well. */ + assert(mem_nc_type); + if (*mem_nc_type == NC_NAT) + *mem_nc_type = var->xtype; + assert(*mem_nc_type); + + /* No NC_CHAR conversions, you pervert! */ + if (var->xtype != *mem_nc_type && + (var->xtype == NC_CHAR || *mem_nc_type == NC_CHAR)) + return NC_ECHAR; + + /* If we're in define mode, we can't read or write data. */ + if (h5->flags & NC_INDEF) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_EINDEFINE; + if ((retval = nc4_enddef_netcdf4_file(h5))) + return retval; + } + + return NC_NOERR; +} + +#ifdef LOGGING +/* Print some debug info about dimensions to the log. */ +static void +log_dim_info(NC_VAR_INFO_T *var, hsize_t *fdims, hsize_t *fmaxdims, + hsize_t *start, hsize_t *count) +{ + int d2; + + /* Print some debugging info... */ + LOG((4, "nc4_put_vara: var name %s ndims %d", var->name, var->ndims)); + LOG((4, "File space, and requested:")); + for (d2 = 0; d2 < var->ndims; d2++) + { + LOG((4, "fdims[%d]=%Ld fmaxdims[%d]=%Ld", d2, fdims[d2], d2, + fmaxdims[d2])); + LOG((4, "start[%d]=%Ld count[%d]=%Ld", d2, start[d2], d2, count[d2])); + } +} +#endif /* LOGGING */ + +#ifdef USE_PARALLEL +static int +set_par_access(NC_HDF5_FILE_INFO_T *h5, NC_VAR_INFO_T *var, hid_t xfer_plistid) +{ + H5FD_mpio_xfer_t hdf5_xfer_mode; + + /* If netcdf is built with parallel I/O, then parallel access can + * be used, and, if this file was opened or created for parallel + * access, we need to set the transfer mode. */ + if (h5->parallel) + { + /* Decide on collective or independent. */ + hdf5_xfer_mode = (var->parallel_access != NC_INDEPENDENT) ? + H5FD_MPIO_COLLECTIVE : H5FD_MPIO_INDEPENDENT; + + /* Set the mode in the transfer property list. */ + if (H5Pset_dxpl_mpio(xfer_plistid, hdf5_xfer_mode) < 0) + return NC_EPARINIT; + + LOG((4, "hdf5_xfer_mode: %d H5FD_MPIO_COLLECTIVE: %d H5FD_MPIO_INDEPENDENT: %d", + (int)hdf5_xfer_mode, H5FD_MPIO_COLLECTIVE, H5FD_MPIO_INDEPENDENT)); + } + return NC_NOERR; +} +#endif + +/* Write an array of data to a variable. When it comes right down to + * it, this is what netCDF-4 is all about, this is *the* function, the + * big enchilda, the grand poo-bah, the alpha dog, the head honcho, + * the big cheese, the mighty kahuna, the top bananna, the high + * muckity-muck, numero uno. Well, you get the idea. */ +int +nc4_put_vara(NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *startp, + const size_t *countp, nc_type mem_nc_type, int is_long, void *data) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + + hid_t file_spaceid = 0, mem_spaceid = 0, xfer_plistid = 0; + size_t file_type_size; + + hsize_t *xtend_size = NULL, count[NC_MAX_VAR_DIMS]; + hsize_t fdims[NC_MAX_VAR_DIMS], fmaxdims[NC_MAX_VAR_DIMS]; + hsize_t start[NC_MAX_VAR_DIMS]; + int need_to_extend = 0; + int scalar = 0, retval = NC_NOERR, range_error = 0, i, d2; + void *bufr = NULL; +#ifndef HDF5_CONVERT + int need_to_convert = 0; + size_t len = 1; +#endif +#ifdef HDF5_CONVERT + hid_t mem_typeid = 0; +#endif + int no_data=0 ; + + /* Find our metadata for this file, group, and var. */ + assert(nc); + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + h5 = nc->nc4_info; + assert(grp && h5 && var && var->name); + + LOG((3, "nc4_put_vara: var->name %s mem_nc_type %d is_long %d", + var->name, mem_nc_type, is_long)); + + /* Check some stuff about the type and the file. If the file must + * be switched from define mode, it happens here. */ + if ((retval = check_for_vara(&mem_nc_type, var, h5))) + return retval; + + /* Convert from size_t and ptrdiff_t to hssize_t, and hsize_t. */ + for (i = 0; i < var->ndims; i++) + { + start[i] = startp[i]; + count[i] = countp[i]; + } + + /* Open this dataset if necessary, also checking for a weird case: + * a non-coordinate (and non-scalar) variable that has the same + * name as a dimension. */ + if (var->hdf5_name && strlen(var->hdf5_name) >= strlen(NON_COORD_PREPEND) && + strncmp(var->hdf5_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND)) == 0 && + var->ndims) + if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->hdf5_name, + H5P_DEFAULT)) < 0) + return NC_ENOTVAR; + if (!var->hdf_datasetid) + if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->name, + H5P_DEFAULT)) < 0) + return NC_ENOTVAR; + + /* Get file space of data. */ + if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + + /* Check to ensure the user selection is + * valid. H5Sget_simple_extent_dims gets the sizes of all the dims + * and put them in fdims. */ + if (H5Sget_simple_extent_dims(file_spaceid, fdims, fmaxdims) < 0) + BAIL(NC_EHDFERR); + +#ifdef LOGGING + log_dim_info(var, fdims, fmaxdims, start, count); +#endif + + /* Check dimension bounds. Remember that unlimited dimnsions can + * put data beyond their current length. */ + for (d2 = 0; d2 < var->ndims; d2++) + { + for (dim = grp->dim; dim; dim = dim->next) + { + if (dim->dimid == var->dimids[d2]) + { + if (!dim->unlimited) + { + if (start[d2] >= (hssize_t)fdims[d2]) + BAIL_QUIET(NC_EINVALCOORDS); + if (start[d2] + count[d2] > fdims[d2]) + BAIL_QUIET(NC_EEDGE); + } + } + } + } + + + /* A little quirk: if any of the count values are zero, then + return success and forget about it. */ + + for (d2 = 0; d2 < var->ndims; d2++) + if (count[d2] != 0) no_data++ ; +/* goto exit; */ + + /* Now you would think that no one would be crazy enough to write + a scalar dataspace with one of the array function calls, but you + would be wrong. So let's check to see if the dataset is + scalar. If it is, we won't try to set up a hyperslab. */ + if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALAR) + { + if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + scalar++; + } + else + { + if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET, start, NULL, + count, NULL) < 0) + BAIL(NC_EHDFERR); + + /* Create a space for the memory, just big enough to hold the slab + we want. */ + if ((mem_spaceid = H5Screate_simple(var->ndims, count, NULL)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + + /* Later on, we will need to know the size of this type in the + * file. */ + if ((retval = nc4_get_typelen_mem(h5, var->xtype, 0, &file_type_size))) + return retval; + +#ifndef HDF5_CONVERT + /* Are we going to convert any data? (No converting of compound or + * opaque types.) */ + if ((mem_nc_type != var->xtype || (var->xtype == NC_INT && is_long)) && + mem_nc_type != NC_COMPOUND && mem_nc_type != NC_OPAQUE) + { + /* We must convert - allocate a buffer. */ + need_to_convert++; + if (var->ndims) + for (d2=0; d2ndims; d2++) + len *= countp[d2]; + LOG((4, "converting data for var %s type=%d len=%d", var->name, + var->xtype, len)); + + /* If we're reading, we need bufr to have enough memory to store + * the data in the file. If we're writing, we need bufr to be + * big enough to hold all the data in the file's type. */ + if (!(bufr = malloc(len * file_type_size))) + BAIL(NC_ENOMEM); + } + else +#endif /* ifndef HDF5_CONVERT */ + bufr = data; + +#ifdef HDF5_CONVERT + /* Get the HDF type of the data in memory. */ + if ((retval = nc4_get_hdf_typeid(h5, mem_nc_type, &mem_typeid, + var->type_info->endianness))) + BAIL(retval); +#endif + + /* Create the data transfer property list. */ + if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif + + /* Apply the callback function which will detect range + * errors. Which one to call depends on the length of the + * destination buffer type. */ +#ifdef HDF5_CONVERT + if (H5Pset_type_conv_cb(xfer_plistid, except_func, &range_error) < 0) + BAIL(NC_EHDFERR); +#endif + +#ifdef USE_PARALLEL + /* Set up parallel I/O, if needed. */ + if ((retval = set_par_access(h5, var, xfer_plistid))) + BAIL(retval); +#endif + + /* Read/write this hyperslab into memory. */ + /* Does the dataset have to be extended? If it's already + extended to the required size, it will do no harm to reextend + it to that size. */ + if (var->ndims) + { + if (!(xtend_size = malloc(var->ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); + for (d2 = 0; d2 < var->ndims; d2++) + { + if ((retval = nc4_find_dim(grp, var->dimids[d2], &dim, NULL))) + BAIL(retval); + if (dim->unlimited) + { + if (start[d2] + count[d2] > fdims[d2]) + { + xtend_size[d2] = start[d2] + count[d2]; + need_to_extend++; + } + else + xtend_size[d2] = fdims[d2]; + + if (start[d2] + count[d2] > dim->len) + { + dim->len = start[d2] + count[d2]; + dim->extended++; + } + } + else + { + xtend_size[d2] = dim->len; + } + } + + /* If we need to extend it, we also need a new file_spaceid + to reflect the new size of the space. */ + if (need_to_extend) + { + LOG((4, "extending dataset")); + if (H5Dextend(var->hdf_datasetid, xtend_size) < 0) + BAIL(NC_EHDFERR); + if (file_spaceid > 0 && H5Sclose(file_spaceid) < 0) + BAIL2(NC_EHDFERR); + if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET, + start, NULL, count, NULL) < 0) + BAIL(NC_EHDFERR); + } + } + +#ifndef HDF5_CONVERT + /* Do we need to convert the data? */ + if (need_to_convert) + { + if ((retval = nc4_convert_type(data, bufr, mem_nc_type, var->xtype, + len, &range_error, var->fill_value, + (h5->cmode & NC_CLASSIC_MODEL), is_long, 0))) + BAIL(retval); + } +#endif + + /* Write the data. At last! */ + LOG((4, "about to H5Dwrite datasetid 0x%x mem_spaceid 0x%x " + "file_spaceid 0x%x", var->hdf_datasetid, mem_spaceid, file_spaceid)); +/* + if (no_data==0) + { + H5Sselect_none(mem_spaceid); + H5Sselect_none(file_spaceid); + bufr=NULL ; + } +*/ +/* if (no_data!=0) */ + if (H5Dwrite(var->hdf_datasetid, var->type_info->hdf_typeid, + mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0) + BAIL(NC_EHDFERR); + + + /* Remember that we have written to this var so that Fill Value + * can't be set for it. */ + if (!var->written_to) + var->written_to++; + + /* For strict netcdf-3 rules, ignore erange errors between UBYTE + * and BYTE types. */ + if ((h5->cmode & NC_CLASSIC_MODEL) && + (var->xtype == NC_UBYTE || var->xtype == NC_BYTE) && + (mem_nc_type == NC_UBYTE || mem_nc_type == NC_BYTE) && + range_error) + range_error = 0; + + exit: + if (file_spaceid > 0 && H5Sclose(file_spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (mem_spaceid > 0 && H5Sclose(mem_spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (xfer_plistid && (H5Pclose(xfer_plistid) < 0)) + BAIL2(NC_EPARINIT); +#ifdef EXTRA_TESTS + num_plists--; +#endif +#ifndef HDF5_CONVERT + if (need_to_convert) free(bufr); +#endif + if (xtend_size) free(xtend_size); + + /* If there was an error return it, otherwise return any potential + range error value. If none, return NC_NOERR as usual.*/ + if (retval) + return retval; + if (range_error) + return NC_ERANGE; + return NC_NOERR; +} + +int +nc4_get_vara(NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *startp, + const size_t *countp, nc_type mem_nc_type, int is_long, void *data) +{ + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + + hid_t file_spaceid = 0, mem_spaceid = 0; + hid_t xfer_plistid = 0; + hid_t hdf_datasetid; + size_t file_type_size; + + hsize_t *xtend_size = NULL, count[NC_MAX_VAR_DIMS]; + hsize_t fdims[NC_MAX_VAR_DIMS], fmaxdims[NC_MAX_VAR_DIMS]; + hsize_t start[NC_MAX_VAR_DIMS]; + void *fillvalue = NULL; + int no_read = 0, provide_fill = 0; + int fill_value_size[NC_MAX_VAR_DIMS]; + int scalar = 0, retval = NC_NOERR, range_error = 0, i, d2; + void *bufr = NULL; + int break_it; +#ifndef HDF5_CONVERT + int need_to_convert = 0; + size_t len = 1; +#endif + + /* Find our metadata for this file, group, and var. */ + assert(nc); + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + h5 = nc->nc4_info; + assert(grp && h5 && var && var->name); + + LOG((3, "nc4_get_vara: var->name %s mem_nc_type %d is_long %d", + var->name, mem_nc_type, is_long)); + + /* Check some stuff about the type and the file. */ + if ((retval = check_for_vara(&mem_nc_type, var, h5))) + return retval; + + /* Convert from size_t and ptrdiff_t to hssize_t, and hsize_t. */ + for (i = 0; i < var->ndims; i++) + { + start[i] = startp[i]; + count[i] = countp[i]; + } + + /* Open this dataset if necessary, also checking for a weird case: + * a non-coordinate (and non-scalar) variable that has the same + * name as a dimension. */ + if (var->hdf5_name && strlen(var->hdf5_name) >= strlen(NON_COORD_PREPEND) && + strncmp(var->hdf5_name, NON_COORD_PREPEND, strlen(NON_COORD_PREPEND)) == 0 && + var->ndims) + if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->hdf5_name, + H5P_DEFAULT)) < 0) + return NC_ENOTVAR; + if (!var->hdf_datasetid) + if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->name, + H5P_DEFAULT)) < 0) + return NC_ENOTVAR; + + /* Get file space of data. */ + if ((file_spaceid = H5Dget_space(var->hdf_datasetid)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + + /* Check to ensure the user selection is + * valid. H5Sget_simple_extent_dims gets the sizes of all the dims + * and put them in fdims. */ + if (H5Sget_simple_extent_dims(file_spaceid, fdims, fmaxdims) < 0) + BAIL(NC_EHDFERR); + +#ifdef LOGGING + log_dim_info(var, fdims, fmaxdims, start, count); +#endif + + /* Check dimension bounds. Remember that unlimited dimnsions can + * put data beyond their current length. */ + for (d2 = 0, break_it = 0; d2 < var->ndims; d2++) + { + for (g = grp; g && !break_it; g = g->parent) + for (dim = g->dim; dim; dim = dim->next) + { + if (dim->dimid == var->dimids[d2]) + { + if (!dim->unlimited) + { + if (start[d2] >= (hssize_t)fdims[d2]) + BAIL_QUIET(NC_EINVALCOORDS); + if (start[d2] + count[d2] > fdims[d2]) + BAIL_QUIET(NC_EEDGE); + } + if (dim->unlimited) + { + size_t ulen; + + /* We can't go beyond the latgest current extent of + the unlimited dim. */ + if ((retval = nc_inq_dimlen(ncid, dim->dimid, &ulen))) + BAIL(retval); + + /* Check for out of bound requests. */ + if (start[d2] >= (hssize_t)ulen && count[d2]) + BAIL_QUIET(NC_EINVALCOORDS); + if (start[d2] + count[d2] > ulen) + BAIL_QUIET(NC_EEDGE); + + /* THings get a little tricky here. If we're getting + a GET request beyond the end of this var's + current length in an unlimited dimension, we'll + later need to return the fill value for the + variable. */ + if (start[d2] >= (hssize_t)fdims[d2]) + fill_value_size[d2] = count[d2]; + else if (start[d2] + count[d2] > fdims[d2]) + fill_value_size[d2] = count[d2] - (fdims[d2] - start[d2]); + else + fill_value_size[d2] = 0; + count[d2] -= fill_value_size[d2]; + if (fill_value_size[d2]) + provide_fill++; + } + else + fill_value_size[d2] = count[d2]; + } + } + } + + /* A little quirk: if any of the count values are zero, don't + * read. */ + for (d2 = 0; d2 < var->ndims; d2++) + if (count[d2] == 0) + no_read++; + + /* Later on, we will need to know the size of this type in the + * file. */ + if ((retval = nc4_get_typelen_mem(h5, var->xtype, 0, &file_type_size))) + return retval; + + if (!no_read) + { + /* Now you would think that no one would be crazy enough to write + a scalar dataspace with one of the array function calls, but you + would be wrong. So let's check to see if the dataset is + scalar. If it is, we won't try to set up a hyperslab. */ + if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALAR) + { + if ((mem_spaceid = H5Screate(H5S_SCALAR)) < 0) + BAIL(NC_EHDFERR); + scalar++; +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + else + { + if (H5Sselect_hyperslab(file_spaceid, H5S_SELECT_SET, + start, NULL, count, NULL) < 0) + BAIL(NC_EHDFERR); + /* Create a space for the memory, just big enough to hold the slab + we want. */ + if ((mem_spaceid = H5Screate_simple(var->ndims, count, NULL)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + + /* Fix bug when reading HDF5 files with variable of type + * fixed-length string. We need to make it look like a + * variable-length string, because that's all netCDF-4 data + * model supports, lacking anonymous dimensions. So + * variable-length strings are in allocated memory that user has + * to free, which we allocate here. */ + if(var->type_info->class == H5T_STRING && + H5Tget_size(var->type_info->hdf_typeid) > 1 && + !H5Tis_variable_str(var->type_info->hdf_typeid)) { + hsize_t fstring_len; + if ((fstring_len = H5Tget_size(var->type_info->hdf_typeid)) < 0) + BAIL(NC_EHDFERR); + if (!(*(char **)data = malloc(1 + fstring_len))) + BAIL(NC_ENOMEM); + bufr = *(char **)data; + } + +#ifndef HDF5_CONVERT + /* Are we going to convert any data? (No converting of compound or + * opaque types.) */ + if ((mem_nc_type != var->xtype || (var->xtype == NC_INT && is_long)) && + mem_nc_type != NC_COMPOUND && mem_nc_type != NC_OPAQUE) + { + /* We must convert - allocate a buffer. */ + need_to_convert++; + if (var->ndims) + for (d2 = 0; d2 < var->ndims; d2++) + len *= countp[d2]; + LOG((4, "converting data for var %s type=%d len=%d", var->name, + var->xtype, len)); + + /* If we're reading, we need bufr to have enough memory to store + * the data in the file. If we're writing, we need bufr to be + * big enough to hold all the data in the file's type. */ + if (!(bufr = malloc(len * file_type_size))) + BAIL(NC_ENOMEM); + } + else +#endif /* ifndef HDF5_CONVERT */ + if(!bufr) + bufr = data; + + /* Get the HDF type of the data in memory. */ +#ifdef HDF5_CONVERT + if ((retval = nc4_get_hdf_typeid(h5, mem_nc_type, &mem_typeid, + var->type_info->endianness))) + BAIL(retval); +#endif + + /* Create the data transfer property list. */ + if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif + +#ifdef HDF5_CONVERT + /* Apply the callback function which will detect range + * errors. Which one to call depends on the length of the + * destination buffer type. */ + if (H5Pset_type_conv_cb(xfer_plistid, except_func, &range_error) < 0) + BAIL(NC_EHDFERR); +#endif + +#ifdef USE_PARALLEL + /* Set up parallel I/O, if needed. */ + if ((retval = set_par_access(h5, var, xfer_plistid))) + BAIL(retval); +#endif + + /* Read this hyperslab into memory. */ + LOG((5, "About to H5Dread some data...")); + if (H5Dread(var->hdf_datasetid, var->type_info->native_typeid, + mem_spaceid, file_spaceid, xfer_plistid, bufr) < 0) + BAIL(NC_EHDFERR); + +#ifndef HDF5_CONVERT + /* Eventually the block below will go away. Right now it's + needed to support conversions between int/float, and range + checking converted data in the netcdf way. These features are + being added to HDF5 at the HDF5 World Hall of Coding right + now, by a staff of thousands of programming gnomes. */ + if (need_to_convert) + { + if ((retval = nc4_convert_type(bufr, data, var->xtype, mem_nc_type, + len, &range_error, var->fill_value, + (h5->cmode & NC_CLASSIC_MODEL), 0, is_long))) + BAIL(retval); + + /* For strict netcdf-3 rules, ignore erange errors between UBYTE + * and BYTE types. */ + if ((h5->cmode & NC_CLASSIC_MODEL) && + (var->xtype == NC_UBYTE || var->xtype == NC_BYTE) && + (mem_nc_type == NC_UBYTE || mem_nc_type == NC_BYTE) && + range_error) + range_error = 0; + } +#endif + + /* For strict netcdf-3 rules, ignore erange errors between UBYTE + * and BYTE types. */ + if ((h5->cmode & NC_CLASSIC_MODEL) && + (var->xtype == NC_UBYTE || var->xtype == NC_BYTE) && + (mem_nc_type == NC_UBYTE || mem_nc_type == NC_BYTE) && + range_error) + range_error = 0; + + } /* endif ! no_read */ + + /* Now we need to fake up any further data that was asked for, + using the fill values instead. First skip past the data we + just read, if any. */ + if (!scalar && provide_fill) + { + void *filldata; + size_t real_data_size = 0; + size_t fill_len; + + /* Skip past the real data we've already read. */ + if (!no_read) + for (real_data_size = file_type_size, d2 = 0; d2 < var->ndims; d2++) + real_data_size *= (count[d2] - start[d2]); + + /* Get the fill value from the HDF5 variable. Memory will be + * allocated. */ + if (get_fill_value(h5, var, &fillvalue) < 0) + BAIL(NC_EHDFERR); + + /* How many fill values do we need? */ + for (fill_len = 1, d2 = 0; d2 < var->ndims; d2++) + fill_len *= (fill_value_size[d2] ? fill_value_size[d2] : 1); + + /* Copy the fill value into the rest of the data buffer. */ + filldata = (char *)data + real_data_size; + for (i = 0; i < fill_len; i++) + { + if (var->xtype == NC_STRING) + { + if (!(*(char **)filldata = malloc(sizeof(*(char **)fillvalue)))) + return NC_ENOMEM; + strcpy(*(char **)filldata, *(char **)fillvalue); + } + else + { + memcpy(filldata, fillvalue, file_type_size); + filldata = (char *)filldata + file_type_size; + } + } + } + + exit: +/** if (var->xtype == NC_CHAR && mem_typeid > 0 && H5Tclose(mem_typeid) < 0) + BAIL2(NC_EHDFERR);*/ + if (file_spaceid > 0) + { + if (H5Sclose(file_spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + } + if (mem_spaceid > 0) + { + if (H5Sclose(mem_spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + } + if (xfer_plistid > 0) + { + if (H5Pclose(xfer_plistid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + } +#ifndef HDF5_CONVERT + if (need_to_convert) + free(bufr); +#endif + if (xtend_size) + free(xtend_size); + if (fillvalue) + { + if (var->xtype == NC_STRING) + { + if (nc_free_string(1, (char **)fillvalue)) + return NC_ENOMEM; + } + else + free(fillvalue); + } + + /* If there was an error return it, otherwise return any potential + range error value. If none, return NC_NOERR as usual.*/ + if (retval) + return retval; + if (range_error) + return NC_ERANGE; + return NC_NOERR; +} + +/* This function is a bit of a hack. Turns out that HDF5 dimension + * scales cannot themselves have scales attached. This leaves + * multidimensional coordinate variables hosed. So this function + * writes a special attribute for such a variable, which has the ids + * of all the dimensions for that coordinate variable. This sucks, + * really. But that's the way the cookie crumbles. Better luck next + * time. This function also contains a new way of dealing with HDF5 + * error handling, abandoning the BAIL macros for a more organic and + * natural approach, made with whole grains, and locally-grown + * vegetables. */ +static int +write_coord_dimids(NC_VAR_INFO_T *var) +{ + hsize_t coords_len[1]; + hid_t c_spaceid = -1, c_attid = -1; + int ret = 0; + + /* Write our attribute. */ + coords_len[0] = var->ndims; + if ((c_spaceid = H5Screate_simple(1, coords_len, coords_len)) < 0) ret++; +#ifdef EXTRA_TESTS + num_spaces++; +#endif + if (!ret && (c_attid = H5Acreate(var->hdf_datasetid, COORDINATES, H5T_NATIVE_INT, + c_spaceid, H5P_DEFAULT)) < 0) ret++; + if (!ret && H5Awrite(c_attid, H5T_NATIVE_INT, var->dimids) < 0) ret++; + + /* Close up shop. */ + if (c_spaceid > 0 && H5Sclose(c_spaceid) < 0) ret++; +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (c_attid > 0 && H5Aclose(c_attid) < 0) ret++; + return ret ? NC_EHDFERR : 0; +} + +/* Write a special attribute for the netCDF-4 dimension ID. */ +static int +write_netcdf4_dimid(hid_t datasetid, int dimid) +{ + hid_t dimid_spaceid, dimid_attid; + + /* Create the space. */ + if ((dimid_spaceid = H5Screate(H5S_SCALAR)) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_spaces++; +#endif + + /* Does the attribute already exist? If so, don't try to create it. */ + H5E_BEGIN_TRY { + dimid_attid = H5Aopen_by_name(datasetid, ".", NC_DIMID_ATT_NAME, + H5P_DEFAULT, H5P_DEFAULT); + } H5E_END_TRY; + + /* Create the attribute if needed. */ + if (dimid_attid < 0) + if ((dimid_attid = H5Acreate(datasetid, NC_DIMID_ATT_NAME, + H5T_NATIVE_INT, dimid_spaceid, H5P_DEFAULT)) < 0) + return NC_EHDFERR; + + /* Write it. */ + LOG((4, "write_netcdf4_dimid: writting secret dimid %d", dimid)); + if (H5Awrite(dimid_attid, H5T_NATIVE_INT, &dimid) < 0) + return NC_EHDFERR; + + /* Close stuff*/ + if (H5Sclose(dimid_spaceid) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (H5Aclose(dimid_attid) < 0) + return NC_EHDFERR; + + return NC_NOERR; +} + +/* This function creates the HDF5 dataset for a variabale. */ +static int +var_create_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, int write_dimid) +{ + NC_GRP_INFO_T *g; + hid_t plistid = 0, access_plistid = 0, typeid = 0, spaceid = 0; + hsize_t *chunksize = NULL, *dimsize = NULL, *maxdimsize = NULL; + int d; + NC_DIM_INFO_T *dim = NULL; + void *fillp = NULL; + int dims_found = 0; + int set_chunksizes = 0; + char *name_to_use; + int retval = NC_NOERR; + + LOG((3, "var_create_dataset: name %s", var->name)); + + /* Scalar or not, we need a creation property list. */ + if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif + if ((access_plistid = H5Pcreate(H5P_DATASET_ACCESS)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif + + /* Find the HDF5 type of the dataset. */ + if ((retval = nc4_get_hdf_typeid(grp->file->nc4_info, var->xtype, &typeid, + var->type_info->endianness))) + BAIL(retval); + + /* Figure out what fill value to set, if any. */ + if (!var->no_fill) + { + if ((retval = get_fill_value(grp->file->nc4_info, var, &fillp))) + BAIL(retval); + + /* If there is a fill value, set it. */ + if (fillp) + { + if (var->xtype == NC_STRING) + { + if (H5Pset_fill_value(plistid, typeid, &fillp) < 0) + BAIL(NC_EHDFERR); + free((char *)fillp); + } + else + { + /* The fill value set in HDF5 must always be presented as + * a native type, even if the endianness for this dataset + * is non-native. HDF5 will translate the fill value to + * the target endiannesss. */ + hid_t fill_typeid; + if ((retval = nc4_get_hdf_typeid(grp->file->nc4_info, var->xtype, &fill_typeid, + NC_ENDIAN_NATIVE))) + BAIL(retval); + if (H5Pset_fill_value(plistid, fill_typeid, fillp) < 0) + BAIL(NC_EHDFERR); + if (var->type_info->class == NC_VLEN) + nc_free_vlen((nc_vlen_t *)fillp); + else + free(fillp); + if (var->type_info->nc_typeid == NC_STRING || var->type_info->nc_typeid == NC_CHAR) + if (H5Tclose(fill_typeid) < 0) + BAIL(NC_EHDFERR); + } + } + } else { + /* Required to truly turn HDF5 fill values off */ + if(H5Pset_fill_time(plistid,H5D_FILL_TIME_NEVER) < 0) + BAIL(NC_EHDFERR); + } + + /* If the user wants to shuffle the data, set that up now. */ + if (var->shuffle) + if (H5Pset_shuffle(plistid) < 0) + BAIL(NC_EHDFERR); + + /* If the user wants to deflate the data, set that up now. */ + if (var->deflate) + if (H5Pset_deflate(plistid, var->deflate_level) < 0) + BAIL(NC_EHDFERR); + + /* Szip? NO! We don't want anyone to produce szipped netCDF files! */ +/* #ifdef USE_SZIP */ +/* if (var->options_mask) */ +/* if (H5Pset_szip(plistid, var->options_mask, var->bits_per_pixel) < 0) */ +/* BAIL(NC_EHDFERR); */ +/* #endif */ + + /* If the user wants to fletcher error correcton, set that up now. */ + if (var->fletcher32) + if (H5Pset_fletcher32(plistid) < 0) + BAIL(NC_EHDFERR); + + /* If ndims non-zero, get info for all dimensions. We look up the + dimids and get the len of each dimension. We need this to create + the space for the dataset. In netCDF a dimension length of zero + means an unlimited dimension. */ + if (var->ndims) + { + int unlimdim = 0; + + /* Check to see if any unlimited dimensions are used in this var. */ + for (d = 0; d < var->ndims; d++) + if (var->dim[d]->unlimited) + unlimdim++; + + /* If there are no unlimited dims, and no filters, and the user + * has not specified chunksizes, use contiguous variable for + * better performance. */ + if (!unlimdim && !var->shuffle && !var->deflate && !var->options_mask && + !var->fletcher32 && !var->chunksizes[0]) + var->contiguous = 1; + + if (!(dimsize = malloc(var->ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); + if (!(maxdimsize = malloc(var->ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); + if (!(chunksize = malloc(var->ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); +/* for (d = 0; d < var->ndims; d++) + dimsize[d] = var->dim[d]->unlimited ? NC_HDF5_UNLIMITED_DIMSIZE : var->dim[d]->len; + maxdimsize[d] = var->dim[d]->unlimited ? H5S_UNLIMITED : (hsize_t)var->dim[d]->len; + chunksize[d] = var->chunksizes[d];*/ + + for (d = 0; d < var->ndims; d++) + for (g = grp; g && (dims_found < var->ndims); g = g->parent) + for (dim = g->dim; dim; dim = dim->next) + if (dim->dimid == var->dimids[d]) + { + dimsize[d] = dim->unlimited ? NC_HDF5_UNLIMITED_DIMSIZE : dim->len; + maxdimsize[d] = dim->unlimited ? H5S_UNLIMITED : (hsize_t)dim->len; + if (var->chunksizes[d]) + chunksize[d] = var->chunksizes[d]; + else + { + size_t type_size; + if (var->type_info->nc_typeid == NC_STRING) + type_size = sizeof(char *); + else + type_size = var->type_info->size; + + /* Unlimited dim always gets chunksize of 1. */ + if (dim->unlimited) + chunksize[d] = 1; + else + chunksize[d] = pow((double)DEFAULT_CHUNK_SIZE/type_size, + 1/(double)(var->ndims - unlimdim)); + + /* If the chunksize is greater than the dim + * length, make it the dim length. */ + if (!dim->unlimited && chunksize[d] > dim->len) + chunksize[d] = dim->len; + set_chunksizes++; + } + + if (!var->contiguous && !var->chunksizes[d]) + var->chunksizes[d] = chunksize[d]; + dims_found++; + break; + } + + if (var->contiguous) + { + if (H5Pset_layout(plistid, H5D_CONTIGUOUS) < 0) + BAIL(NC_EHDFERR); + } + else + { + if (H5Pset_chunk(plistid, var->ndims, chunksize) < 0) + BAIL(NC_EHDFERR); + } + + /* Create the dataspace. */ + if ((spaceid = H5Screate_simple(var->ndims, dimsize, maxdimsize)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + else + { + if ((spaceid = H5Screate(H5S_SCALAR)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + + /* Turn on creation order tracking. */ + if (H5Pset_attr_creation_order(plistid, H5P_CRT_ORDER_TRACKED| + H5P_CRT_ORDER_INDEXED) < 0) + BAIL(NC_EHDFERR); + + /* Set per-var chunk cache. */ + if (var->chunk_cache_size) + if (H5Pset_chunk_cache(access_plistid, var->chunk_cache_nelems, + var->chunk_cache_size, var->chunk_cache_preemption) < 0) + BAIL(NC_EHDFERR); + + /* At long last, create the dataset. */ + name_to_use = var->hdf5_name ? var->hdf5_name : var->name; + LOG((4, "var_create_dataset: about to H5Dcreate dataset %s of type 0x%x", + name_to_use, typeid)); + if ((var->hdf_datasetid = H5Dcreate2(grp->hdf_grpid, name_to_use, typeid, + spaceid, H5P_DEFAULT, plistid, access_plistid)) < 0) + BAIL(NC_EHDFERR); + var->created++; + var->dirty = 0; + + /* If this is a dimscale, mark it as such in the HDF5 file. Also + * find the dimension info and store the dataset id of the dimscale + * dataset. */ + if (var->dimscale) + { + if (H5DSset_scale(var->hdf_datasetid, var->name) < 0) + BAIL(NC_EHDFERR); + for (dim = grp->dim; dim; dim = dim->next) + if (strcmp(dim->name, var->name) == 0) + { + dim->hdf_dimscaleid = var->hdf_datasetid; + break; + } + + /* Make sure we found a dimension, and gave it a dimscale id. */ + if (!dim || !dim->hdf_dimscaleid) + BAIL(NC_EDIMMETA); + + /* If this is a multidimensional coordinate variable, write a + * coordinates attribute. */ + if (var->ndims > 1) + if ((retval = write_coord_dimids(var))) + BAIL(retval); + + /* If desired, write the netCDF dimid. */ + if (write_dimid) + if ((retval = write_netcdf4_dimid(var->hdf_datasetid, + var->dimids[0]))) + BAIL(retval); + + } + + exit: + if (var->type_info->nc_typeid == NC_STRING || var->type_info->nc_typeid == NC_CHAR) + if (typeid > 0 && H5Tclose(typeid) < 0) + BAIL2(NC_EHDFERR); + if (plistid > 0 && H5Pclose(plistid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (access_plistid > 0 && H5Pclose(access_plistid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (spaceid > 0 && H5Sclose(spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (maxdimsize) free(maxdimsize); + if (dimsize) free(dimsize); + if (chunksize) free(chunksize); + return retval; +} + +/* Adjust the chunk cache of a var for better performance. */ +int +nc4_adjust_var_cache(NC_GRP_INFO_T *grp, NC_VAR_INFO_T * var) +{ + size_t chunk_size_bytes = 1; + int d; + int retval; + + /* Nothing to be done. */ + if (var->contiguous) + return NC_NOERR; +#ifdef USE_PARALLEL + return NC_NOERR; +#endif + + /* How many bytes in the chunk? */ + for (d = 0; d < var->ndims; d++) + chunk_size_bytes *= var->chunksizes[d]; + if (var->type_info->size) + chunk_size_bytes *= var->type_info->size; + else + chunk_size_bytes *= sizeof(char *); + + /* If the chunk cache is too small, and the user has not changed + * the default value of the chunk cache size, then increase the + * size of the cache. */ + if (var->chunk_cache_size == CHUNK_CACHE_SIZE) + if (chunk_size_bytes > var->chunk_cache_size) + { + var->chunk_cache_size = chunk_size_bytes * DEFAULT_CHUNKS_IN_CACHE; + if (var->chunk_cache_size > MAX_DEFAULT_CACHE_SIZE) + var->chunk_cache_size = MAX_DEFAULT_CACHE_SIZE; + if ((retval = nc4_reopen_dataset(grp, var))) + return retval; + } + + return NC_NOERR; +} + +/* Read or write an attribute. */ +static int +put_att_grpa(NC_GRP_INFO_T *grp, int varid, NC_ATT_INFO_T *att) +{ + hid_t datasetid = 0, locid; + hid_t attid = 0, spaceid = 0, file_typeid = 0; + hsize_t dims[1]; /* netcdf attributes always 1-D. */ + int retval = NC_NOERR; + void *data; + int phoney_data = 99; + + assert(att->name); + LOG((3, "put_att_grpa: varid %d att->attnum %d att->name %s " + "att->xtype %d att->len %d", varid, att->attnum, att->name, + att->xtype, att->len)); + + /* If the file is read-only, return an error. */ + if (grp->file->nc4_info->no_write) + return NC_EPERM; + + /* Get the hid to attach the attribute to, or read it from. */ + if (varid == NC_GLOBAL) + locid = grp->hdf_grpid; + else + { + if ((retval = nc4_open_var_grp2(grp, varid, &datasetid))) + BAIL(retval); + locid = datasetid; + } + + /* Delete the att if it exists already. */ + H5E_BEGIN_TRY { + H5Adelete(locid, att->name); + } H5E_END_TRY; + + /* Get the length ready, and find the HDF type we'll be + * writing. */ + dims[0] = att->len; + if ((retval = nc4_get_hdf_typeid(grp->file->nc4_info, att->xtype, + &file_typeid, 0))) + BAIL(retval); + + /* Even if the length is zero, HDF5 won't let me write with a + * NULL pointer. So if the length of the att is zero, point to + * some phoney data (which won't be written anyway.)*/ + if (!dims[0]) + data = &phoney_data; + else if (att->data) + data = att->data; + else if (att->stdata) + data = att->stdata; + else + data = att->vldata; + + /* NC_CHAR types require some extra work. The space ID is set to + * scalar, and the type is told how long the string is. If it's + * really zero length, set the size to 1. (The fact that it's + * really zero will be marked by the NULL dataspace, but HDF5 + * doesn't allow me to set the size of the type to zero.)*/ + if (att->xtype == NC_CHAR) + { + size_t string_size = dims[0]; + if (!string_size) + { + string_size = 1; + if ((spaceid = H5Screate(H5S_NULL)) < 0) + BAIL(NC_EATTMETA); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + else + { + if ((spaceid = H5Screate(H5S_SCALAR)) < 0) + BAIL(NC_EATTMETA); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + if (H5Tset_size(file_typeid, string_size) < 0) + BAIL(NC_EATTMETA); + if (H5Tset_strpad(file_typeid, H5T_STR_NULLTERM) < 0) + BAIL(NC_EATTMETA); + } + else + { + if (!att->len) + { + if ((spaceid = H5Screate(H5S_NULL)) < 0) + BAIL(NC_EATTMETA); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + else + { + if ((spaceid = H5Screate_simple(1, dims, NULL)) < 0) + BAIL(NC_EATTMETA); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + } + } + if ((attid = H5Acreate(locid, att->name, file_typeid, spaceid, + H5P_DEFAULT)) < 0) + BAIL(NC_EATTMETA); + + /* Write the values, (even if length is zero). */ + if (H5Awrite(attid, file_typeid, data) < 0) + BAIL(NC_EATTMETA); + + exit: + if (att->xtype == NC_CHAR || att->xtype == NC_STRING) + if (file_typeid && H5Tclose(file_typeid)) + BAIL2(NC_EHDFERR); + if (attid > 0 && H5Aclose(attid) < 0) + BAIL2(NC_EHDFERR); + if (spaceid > 0 && H5Sclose(spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + return retval; +} + +/* Create a HDF5 defined type from a NC_TYPE_INFO_T struct, and commit + * it to the file. */ +static int +commit_type(NC_GRP_INFO_T *grp, NC_TYPE_INFO_T *type) +{ + NC_FIELD_INFO_T *field; + NC_ENUM_MEMBER_INFO_T *enum_m; + hid_t hdf_base_typeid, hdf_typeid; + int retval; + + assert(grp && type); + + /* Did we already record this type? */ + if (type->committed) + return NC_NOERR; + + /* Is this a compound type? */ + if (type->class == NC_COMPOUND) + { + if ((type->hdf_typeid = H5Tcreate(H5T_COMPOUND, type->size)) < 0) + return NC_EHDFERR; + LOG((4, "creating compound type %s hdf_typeid 0x%x", type->name, + type->hdf_typeid)); + for (field = type->field; field; field = field->next) + { + if ((retval = nc4_get_hdf_typeid(grp->file->nc4_info, field->nctype, + &hdf_base_typeid, type->endianness))) + return retval; + /* If this is an array, create a special array type. */ + if (field->ndims) + { + int d; + hsize_t dims[NC_MAX_DIMS]; + for (d = 0; d < field->ndims; d++) + dims[d] = field->dim_size[d]; + if ((hdf_typeid = H5Tarray_create(hdf_base_typeid, field->ndims, + dims, NULL)) < 0) + return NC_EHDFERR; + } + else + hdf_typeid = hdf_base_typeid; + LOG((4, "inserting field %s offset %d hdf_typeid 0x%x", field->name, + field->offset, hdf_typeid)); + if (H5Tinsert(type->hdf_typeid, field->name, field->offset, + hdf_typeid) < 0) + return NC_EHDFERR; + if (field->ndims && H5Tclose(hdf_typeid) < 0) + return NC_EHDFERR; + } + } + else if (type->class == NC_VLEN) + { + /* Find the HDF typeid of the base type of this vlen. */ + if ((retval = nc4_get_hdf_typeid(grp->file->nc4_info, type->base_nc_type, + &type->base_hdf_typeid, type->endianness))) + return retval; + + /* Create a vlen type. */ + if ((type->hdf_typeid = H5Tvlen_create(type->base_hdf_typeid)) < 0) + return NC_EHDFERR; + } + else if (type->class == NC_OPAQUE) + { + /* Create the opaque type. */ + if ((type->hdf_typeid = H5Tcreate(H5T_OPAQUE, type->size)) < 0) + return NC_EHDFERR; + } + else if (type->class == NC_ENUM) + { + if (!type->enum_member) + return NC_EINVAL; + + /* Find the HDF typeid of the base type of this enum. */ + if ((retval = nc4_get_hdf_typeid(grp->file->nc4_info, type->base_nc_type, + &type->base_hdf_typeid, type->endianness))) + return retval; + + /* Create an enum type. */ + if ((type->hdf_typeid = H5Tenum_create(type->base_hdf_typeid)) < 0) + return NC_EHDFERR; + + /* Add all the members to the HDF5 type. */ + for (enum_m = type->enum_member; enum_m; enum_m = enum_m->next) + if (H5Tenum_insert(type->hdf_typeid, enum_m->name, + enum_m->value) < 0) + return NC_EHDFERR; + } + else + { + LOG((0, "Unknown class: %d", type->class)); + return NC_EBADTYPE; + } + + /* Commit the type. */ + if (H5Tcommit(grp->hdf_grpid, type->name, type->hdf_typeid) < 0) + return NC_EHDFERR; + type->committed++; + LOG((4, "just committed type %s, HDF typeid: 0x%x", type->name, + type->hdf_typeid)); + + /* Later we will always use the native typeid. In this case, it is + * a copy of the same type pointed to by hdf_typeid, but it's + * easier to maintain a copy. */ + if ((type->native_typeid = H5Tget_native_type(type->hdf_typeid, + H5T_DIR_DEFAULT)) < 0) + return NC_EHDFERR; + + return NC_NOERR; +} + +/* Write an attribute, with value 1, to indicate that strict NC3 rules + * apply to this file. */ +static int +write_nc3_strict_att(hid_t hdf_grpid) +{ + hid_t attid = 0, spaceid = 0; + int one = 1, num, a; + char att_name[NC_MAX_NAME + 1]; + int retval = NC_NOERR; + + /* If the attribute already exists, call that a success and return + * NC_NOERR. */ + if ((num = H5Aget_num_attrs(hdf_grpid)) < 0) + return NC_EHDFERR; + for (a = 0; a < num; a++) + { + if ((attid = H5Aopen_idx(hdf_grpid, (unsigned int)a)) < 0) + BAIL(NC_EHDFERR); + if (H5Aget_name(attid, NC_MAX_HDF5_NAME, att_name) < 0) + BAIL(NC_EHDFERR); + if (!strcmp(att_name, NC3_STRICT_ATT_NAME)) + { + if (H5Aclose(attid) < 0) + return NC_EFILEMETA; + return NC_NOERR; + } + } + + /* Create the attribute to mark this as a file that needs to obey + * strict netcdf-3 rules. */ + if ((spaceid = H5Screate(H5S_SCALAR)) < 0) + BAIL(NC_EFILEMETA); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + if ((attid = H5Acreate(hdf_grpid, NC3_STRICT_ATT_NAME, + H5T_NATIVE_INT, spaceid, H5P_DEFAULT)) < 0) + BAIL(NC_EFILEMETA); + if (H5Awrite(attid, H5T_NATIVE_INT, &one) < 0) + BAIL(NC_EFILEMETA); + + exit: + if (spaceid && (H5Sclose(spaceid) < 0)) + BAIL2(NC_EFILEMETA); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (attid && (H5Aclose(attid) < 0)) + BAIL2(NC_EFILEMETA); + return retval; +} + +static int +create_group(NC_GRP_INFO_T *grp) +{ + hid_t gcpl_id = 0; + int retval = NC_NOERR;; + + assert(grp); + + /* If this is not the root group, create it in the HDF5 file. */ + if (grp->parent) + { + /* Create group, with link_creation_order set in the group + * creation property list. */ + if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_plists++; +#endif + if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) + BAIL(NC_EHDFERR); + if (H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED|H5P_CRT_ORDER_INDEXED) < 0) + BAIL(NC_EHDFERR); + if ((grp->hdf_grpid = H5Gcreate2(grp->parent->hdf_grpid, grp->name, + H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0) + BAIL(NC_EHDFERR); + if (H5Pclose(gcpl_id) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + } + else + { + /* Since this is the root group, we have to open it. */ + if ((grp->hdf_grpid = H5Gopen2(grp->file->nc4_info->hdfid, "/", H5P_DEFAULT)) < 0) + BAIL(NC_EFILEMETA); + } + return NC_NOERR; + + exit: + if (gcpl_id > 0 && H5Pclose(gcpl_id) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + if (grp->hdf_grpid > 0 && H5Gclose(grp->hdf_grpid) < 0) + BAIL2(NC_EHDFERR); + return retval; +} + +/* After all the datasets of the file have been read, it's time to + * sort the wheat from the chaff. Which of the datasets are netCDF + * dimensions, and which are coordinate variables, and which are + * non-coordinate variables. */ +static int +attach_dimscales(NC_GRP_INFO_T *grp) +{ + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim1; + NC_GRP_INFO_T *g; + int d; + int retval = NC_NOERR; + + /* Attach dimension scales. */ + for (var = grp->var; var; var = var->next) + { + /* Scales themselves do not attach. But I really wish they + * would. */ + if (var->dimscale) + { + /* If this is a multidimensional coordinate variable, it will + * have a special coords attribute (read earlier) with a list + * of the dimensions for this variable. */ + } + else /* not a dimscale... */ + { + /* Find the scale for each dimension and attach it. */ + for (d = 0; d < var->ndims; d++) + { + /* Is there a dimscale for this dimension? */ + if (var->dimscale_attached) + { + if (!var->dimscale_attached[d]) + { + for (g = grp; g && !var->dimscale_attached[d]; g = g->parent) + for (dim1 = g->dim; dim1; dim1 = dim1->next) + if (var->dimids[d] == dim1->dimid) + { + LOG((2, "attach_dimscales: attaching scale for dimid %d to var %s", + var->dimids[d], var->name)); + if (H5DSattach_scale(var->hdf_datasetid, dim1->hdf_dimscaleid, d) < 0) + BAIL(NC_EHDFERR); + var->dimscale_attached[d]++; + break; + } + } + + /* If we didn't find a dimscale to attach, that's a problem! */ + if (!var->dimscale_attached[d]) + { + LOG((0, "no dimscale found!")); + return NC_EDIMSCALE; + } + } + else + { + /* Create a phoney dimension! */ + + } + } + } /* next d */ + } + exit: + return retval; +} + +/* Write all the dirty atts in an attlist. */ +static int +write_attlist(NC_ATT_INFO_T *attlist, int varid, NC_GRP_INFO_T *grp) +{ + NC_ATT_INFO_T *att; + int retval; + + for (att = attlist; att; att = att->next) + { + if (att->dirty) + { + LOG((4, "write_attlist: writing att %s to varid %d", att->name, varid)); + if ((retval = put_att_grpa(grp, varid, att))) + return retval; + att->dirty = 0; + att->created++; + } + } + return NC_NOERR; +} + +/* Using the HDF5 group iterator is more efficient than the original + * code (O(n) vs O(n**2) for n variables in the group) */ +#define USE_ITERATE_CODE +#ifdef USE_ITERATE_CODE +typedef struct { + char *name; /* The name of the object to searched*/ + int *exists; /* 1 if the object exists, 0 otherswise */ +} var_exists_iter_info; + +/*------------------------------------------------------------------------- + * Function: var_exists_cb + * + * Purpose: Callback routine for checking an object by its name + * + * Return: Exist: 1 + * Not exist: 0 + * Failure: -1 + * + * Programmer: Peter Cao + * 1/25/2012 + * + *------------------------------------------------------------------------- + */ +static int +var_exists_cb(hid_t grpid, const char *name, const H5L_info_t *info, + void *_op_data) +{ + var_exists_iter_info *iter_info = (var_exists_iter_info *)_op_data; + H5I_type_t otype; + hid_t oid; + + if ((oid = H5Oopen(grpid, name, H5P_DEFAULT)) < 0) + return H5_ITER_STOP; + + if ((otype = H5Iget_type( oid ))<0) { + H5Oclose(oid); + return H5_ITER_STOP; + } + H5Oclose(oid); + + if (otype == H5I_DATASET) { + if (!strcmp(iter_info->name, name)) { + *(iter_info->exists) = 1; + return (H5_ITER_STOP); + } + } + + return (H5_ITER_CONT); +} /* end var_exists_cb() */ + +static int +var_exists(hid_t grpid, char *name, int *exists) +{ + hsize_t num_obj; + var_exists_iter_info iter_info; + iter_info.name = name; + iter_info.exists = exists; + + if (H5Gget_num_objs(grpid, &num_obj) < 0) + return NC_EVARMETA; + + if (!name) + return NC_NOERR; + + *exists = 0; + if (H5Literate(grpid, H5_INDEX_CRT_ORDER, H5_ITER_INC, NULL, var_exists_cb, &iter_info) < 0) + return NC_EHDFERR; + + return NC_NOERR; +} +#else +static int +var_exists(hid_t grpid, char *name, int *exists) +{ + hsize_t num_obj, i; + H5O_info_t obj_info; + int obj_class; + char obj_name[NC_MAX_NAME + 1]; + ssize_t size; + int retval = NC_NOERR; + + *exists = 0; + if (H5Gget_num_objs(grpid, &num_obj) < 0) + return NC_EVARMETA; + for (i = 0; i < num_obj; i++) + { + if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i, &obj_info, H5P_DEFAULT) < 0) + return NC_EHDFERR; + obj_class = obj_info.type; + if ((size = H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i, NULL, 0, H5P_DEFAULT)) < 0) + return NC_EHDFERR; + if (size > NC_MAX_NAME) + return NC_EMAXNAME; + if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i, obj_name, size+1, H5P_DEFAULT) < 0) + return NC_EHDFERR; + if (obj_class == H5O_TYPE_DATASET) + { + if (!strncmp(name, obj_name, NC_MAX_NAME)) + { + *exists = 1; + return NC_NOERR; + } + } + } + + return retval; +} +#endif /* USE_ITERATE_CODE */ + +/* This function writes a variable. The principle difficulty comes + * from the possibility that this is a coordinate variable, and was + * already written to the file as a dimension-only dimscale. If this + * occurs, then it must be deleted and recreated. */ +static int +write_var(NC_VAR_INFO_T *var, NC_GRP_INFO_T *grp, int write_dimid) +{ + NC_DIM_INFO_T *d1 = NULL; + int replace_existing_var = 0; + int exists; + int retval; + + if (!var->dirty) + { + if (write_dimid && var->ndims) + if ((retval = write_netcdf4_dimid(var->hdf_datasetid, + var->dimids[0]))) + BAIL(retval); + } + else + { + LOG((4, "write_var: writing var %s", var->name)); + + if (var->created) + replace_existing_var = 1; + + /* If this is a coordinate var, and a dataset has already + * been created for it, then delete that dataset and recreate + * it (because its type may be wrong anyway.) But then we + * have to reattach dimension scales for all vars! Oh well, + * this all only happens when the user defines a var, writes + * metadata, reenters define mode, and adds a coordinate + * var. Presumably this will happen rarely. */ + + /* Is this a coordinate var that has already been created in + * the HDF5 as a dimscale dataset? Check for dims with the + * same name in this group. If there is one, check to see if + * this object exists in the HDF group. */ + if (var->dimscale) + for (d1 = grp->dim; d1; d1 = d1->next) + if (!strcmp(d1->name, var->name)) + { + if ((retval = var_exists(grp->hdf_grpid, var->name, &exists))) + return retval; + if (exists) + { + replace_existing_var++; + + /* If we're replacing an existing dimscale dataset, go to + * every var in the file and detatch this dimension scale, + * because we have to delete it. */ + if ((retval = rec_detach_scales(grp->file->nc4_info->root_grp, + var->dimids[0], d1->hdf_dimscaleid))) + return retval; + break; + } + } + + /* Delete the HDF5 dataset that is to be replaced. */ + if (replace_existing_var) + { + /* If this is a dimension scale, do this stuff. */ + if (d1) + { + assert(d1 && d1->hdf_dimscaleid); + if (H5Dclose(d1->hdf_dimscaleid) < 0) + return NC_EDIMMETA; + } + else + { + int dims_detached = 0; + int finished = 0; + int d; + NC_DIM_INFO_T *dim1; + NC_GRP_INFO_T *g; + + /* If this is a regular var, detach all its dim scales. */ + for (d = 0; d < var->ndims; d++) + for (g = grp; g && !finished; g = g->parent) + for (dim1 = g->dim; dim1; dim1 = dim1->next) + if (var->dimids[d] == dim1->dimid) + { + if (H5DSdetach_scale(var->hdf_datasetid, dim1->hdf_dimscaleid, d) < 0) + BAIL(NC_EHDFERR); + var->dimscale_attached[d] = 0; + if (dims_detached++ == var->ndims) + finished++; + } + } + + /* Free the HDF5 dataset id. */ + if (var->hdf_datasetid && H5Dclose(var->hdf_datasetid)) + BAIL(NC_EHDFERR); + + /* Now delete the variable. */ + if (H5Gunlink(grp->hdf_grpid, var->name) < 0) + return NC_EDIMMETA; + } + + /* Create the dataset. */ + if ((retval = var_create_dataset(grp, var, write_dimid))) + return retval; + + /* Reattach this scale everywhere it is used. (Recall that + * netCDF dimscales are always 1-D). */ + if (d1 && replace_existing_var) + { + d1->hdf_dimscaleid = var->hdf_datasetid; + if ((retval = rec_reattach_scales(grp->file->nc4_info->root_grp, + var->dimids[0], d1->hdf_dimscaleid))) + return retval; + } + } + + /* Now check the atributes for this var. */ + /* Write attributes for this var. */ + if ((retval = write_attlist(var->att, var->varid, grp))) + BAIL(retval); + + return NC_NOERR; + exit: + return retval; +} + +static int +write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, int write_dimid) +{ + hid_t spaceid, create_propid; + hsize_t dims[1], max_dims[1], chunk_dims[1] = {1}; + int dimscale_exists = 0; + char dimscale_wo_var[NC_MAX_NAME]; + int retval; + + if (dim->dirty) + { + /* If there's no dimscale dataset for this dim, create one, + * and mark that it should be hidden from netCDF as a + * variable. (That is, it should appear as a dimension + * without an associated variable.) */ + if (!dimscale_exists) + { + LOG((4, "write_dim: creating dim %s", dim->name)); + + /* Create a property list. If this dimension scale is + * unlimited (i.e. it's an unlimited dimension), then set + * up chunking, with a chunksize of 1. */ + if ((create_propid = H5Pcreate(H5P_DATASET_CREATE)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists++; +#endif + dims[0] = dim->len; + max_dims[0] = dim->len; + if (dim->unlimited) + { + max_dims[0] = H5S_UNLIMITED; + if (H5Pset_chunk(create_propid, 1, chunk_dims) < 0) + BAIL(NC_EHDFERR); + } + + /* Set up space. */ + if ((spaceid = H5Screate_simple(1, dims, max_dims)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + + /* If we define, and then rename this dimension before + * creation of the dimscale dataset, then we can throw + * away the old_name of the dimension. */ + if (dim->old_name && strlen(dim->old_name)) + strcpy(dim->old_name, ""); + + if (H5Pset_attr_creation_order(create_propid, H5P_CRT_ORDER_TRACKED| + H5P_CRT_ORDER_INDEXED) < 0) + BAIL(NC_EHDFERR); + + /* Create the dataset that will be the dimension scale. */ + LOG((4, "write_dim: about to H5Dcreate a dimscale dataset %s", dim->name)); + if ((dim->hdf_dimscaleid = H5Dcreate1(grp->hdf_grpid, dim->name, H5T_IEEE_F32BE, + spaceid, create_propid)) < 0) + BAIL(NC_EHDFERR); + + /* Close the spaceid and create_propid. */ + if (H5Sclose(spaceid) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (H5Pclose(create_propid) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_plists--; +#endif + + /* Indicate that this is a scale. Also indicate that not + * be shown to the user as a variable. It is hidden. It is + * a DIM WITHOUT A VARIABLE! */ + sprintf(dimscale_wo_var, "%s%10d", DIM_WITHOUT_VARIABLE, (int)dim->len); + if (H5DSset_scale(dim->hdf_dimscaleid, dimscale_wo_var) < 0) + BAIL(NC_EHDFERR); + + } + dim->dirty = 0; + } + + /* Did we extend an unlimited dimension? */ + if (dim->extended) + { + NC_VAR_INFO_T *v1; + + assert(dim->unlimited); + /* If this is a dimension without a variable, then update + * the secret length information at the end of the NAME + * attribute. */ + for (v1 = grp->var; v1; v1 = v1->next) + if (!strcmp(v1->name, dim->name)) + break; + + if (v1) + { + hsize_t *new_size; + NC_GRP_INFO_T *g; + NC_DIM_INFO_T *dim1; + int d1; + + /* Extend the dimension scale dataset to reflect the new + * length of the dimension. */ + if (!(new_size = malloc(v1->ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); + for (d1 = 0; d1 < v1->ndims; d1++) + { + if (v1->dimids[d1] == dim->dimid) + new_size[d1] = dim->len; + else + { + int break_it = 0; + for (g = grp; g && !break_it; g = g->parent) + for (dim1 = g->dim; dim1; dim1 = dim1->next) + if (dim1->dimid == v1->dimids[d1]) + { + new_size[d1] = dim1->len; + break_it++; + break; + } + } + } + if (H5Dextend(v1->hdf_datasetid, new_size) < 0) + BAIL(NC_EHDFERR); + free(new_size); + } + } + + /* Did we rename this dimension? */ + if (dim->old_name && strlen(dim->old_name)) + { + /* Rename the dimension's dataset in the HDF5 file. */ + if (H5Gmove2(grp->hdf_grpid, dim->old_name, grp->hdf_grpid, dim->name) < 0) + return NC_EHDFERR; + + /* Reset old_name. */ + strcpy(dim->old_name, ""); + } + + /* If desired, write the secret dimid. This will be used instead of + * the dimid that the dimension would otherwise receive based on + * creation order. This can be necessary when dims and their + * coordinate variables were created in different order. */ + if (write_dimid && dim->hdf_dimscaleid) + if ((retval = write_netcdf4_dimid(dim->hdf_dimscaleid, + dim->dimid))) + BAIL(retval); + + return NC_NOERR; + exit: + return retval; +} + +/* Recursively write all the metadata in a group. Groups and types + * have all already been written. */ +int +nc4_rec_write_metadata(NC_GRP_INFO_T *grp) +{ + NC_DIM_INFO_T *dim; + NC_VAR_INFO_T *var; + NC_GRP_INFO_T *child_grp; + int found_coord, coord_varid = -1, wrote_coord; + int bad_coord_order = 0; + int last_dimid = -1; + int retval; + + assert(grp && grp->name && grp->hdf_grpid); + LOG((3, "nc4_rec_write_metadata: grp->name %s", grp->name)); + + /* Write global attributes for this group. */ + if ((retval = write_attlist(grp->att, NC_GLOBAL, grp))) + return retval; + + /* If the user writes coord vars in a different order then he + * defined their dimensions, then, when the file is reopened, the + * order of the dimids will change to match the order of the coord + * vars. Detect if this is about to happen. */ + for (var = grp->var; var; var = var->next) + { + LOG((5, "checking %s for out of order coord var", var->name)); + if (var->ndims && var->dimscale) + { + if (var->dimids[0] < last_dimid) + { + bad_coord_order++; + break; + } + last_dimid = var->dimids[0]; + } + } + + /* Did the user define a dimension, end define mode, reenter define + * mode, and then define a coordinate variable for that dimension? + * If so, dimensions will be out of order. */ + for (var = grp->var; var; var = var->next) + if (var->dirty && !var->created && var->ndims) + for (dim = grp->dim; dim && dim->next; dim = dim->next) + if (strcmp(dim->name, var->name) && !dim->dirty) + { + LOG((5, "coord var defined after enddef/redef")); + bad_coord_order++; + } + + + /* For some stupid reason, the dim list is stored backwards! Get to + * the back of the list. */ + for (dim = grp->dim; dim && dim->next; dim = dim->next) + ; + + /* Set the pointer to the beginning of the list of vars in this + * group. */ + var = grp->var; + + /* Because of HDF5 ordering the dims and vars have to be stored in + * this way to ensure that the dims and coordinate vars come out in + * the correct order. */ + while (dim || var) + { + /* Write non-coord dims in order, stopping at the first one that + * has an associated coord var. */ + for (found_coord = 0; dim && !found_coord; dim = dim->prev) + { + if (!dim->coord_var_in_grp) + { + if ((retval = write_dim(dim, grp, bad_coord_order))) + return retval; + } + else + { + found_coord++; + coord_varid = dim->coord_var->varid; + } + } + + /* Write each var. When we get to the coord var we are waiting + * for (if any), then we break after writing it. */ + for (wrote_coord = 0; var && !wrote_coord; var = var->next) + { + if ((retval = write_var(var, grp, bad_coord_order))) + return retval; + if (found_coord && var->varid == coord_varid) + wrote_coord++; + } + } /* end while */ + + if ((retval = attach_dimscales(grp))) + return retval; + + /* If there are any child groups, write their metadata. */ + for (child_grp = grp->children; child_grp; child_grp = child_grp->next) + if ((retval = nc4_rec_write_metadata(child_grp))) + return retval; + + return NC_NOERR; +} + +/* Recursively write all groups and types. */ +int +nc4_rec_write_types(NC_GRP_INFO_T *grp) +{ + NC_GRP_INFO_T *child_grp; + NC_TYPE_INFO_T *type; + int retval; + + assert(grp && grp->name); + LOG((3, "nc4_rec_write_types: grp->name %s", grp->name)); + + /* Create the group in the HDF5 file if it doesn't exist. */ + if (!grp->hdf_grpid) + if ((retval = create_group(grp))) + return retval; + + /* If this is the root group of a file with strict NC3 rules, write + * an attribute. But don't leave the attribute open. */ + if (!grp->parent && (grp->file->nc4_info->cmode & NC_CLASSIC_MODEL)) + if ((retval = write_nc3_strict_att(grp->hdf_grpid))) + return retval; + + /* If there are any user-defined types, write them now. */ + for (type = grp->type; type; type = type->next) + if ((retval = commit_type(grp, type))) + return retval; + + /* If there are any child groups, write their groups and types. */ + for (child_grp = grp->children; child_grp; child_grp = child_grp->next) + if ((retval = nc4_rec_write_types(child_grp))) + return retval; + + return NC_NOERR; +} + +/* This reads/writes a whole var at a time. If the file has an + unlimited dimension, then we will look at the number of records + currently existing for this var, and read/write that many. This + this is not what the user intended, particularly with writing, then + that is there look-out! So we will not be extending datasets + here. */ +int +pg_var(NC_PG_T pg, NC_FILE_INFO_T *nc, int ncid, int varid, nc_type xtype, + int is_long, void *ip) +{ + NC_GRP_INFO_T *grp; + NC_VAR_INFO_T *var; + size_t start[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS]; + int i; + int retval; + + assert(nc); + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + assert(grp && var && var->name); + + /* For each dimension, the start will be 0, and the count will be + * the length of the dimension. */ + for (i = 0; i < var->ndims; i++) + { + start[i] = 0; + if ((retval = nc_inq_dimlen(ncid, var->dimids[i], &(count[i])))) + return retval; + } + + /* Read or write the data. */ + if (pg == GET) + return nc4_get_vara(nc, ncid, varid, start, count, xtype, + is_long, ip); + else + return nc4_put_vara(nc, ncid, varid, start, count, xtype, + is_long, ip); +} + +/* Write or read some mapped data. Yea, like I even understand what it + is! + + I stole this code, lock, stock, and semicolons, from the netcdf + 3.5.1 beta release. It walks through the stride and map arrays, and + converts them to a series of calles to the varm function. + + I had to modify the code a little to fit it in, and generalize it + for all data types, and for both puts and gets. + + Ed Hartnett, 9/43/03 +*/ +int +nc4_pg_varm(NC_PG_T pg, NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *start, + const size_t *edges, const ptrdiff_t *stride, + const ptrdiff_t *map, nc_type xtype, int is_long, void *data) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + int maxidim; /* maximum dimensional index */ + size_t mem_type_size; + int convert_map = 0; + ptrdiff_t new_map[NC_MAX_VAR_DIMS]; + int i; + int retval = NC_NOERR; + + LOG((3, "nc4_pg_varm: ncid 0x%x varid %d xtype %d", ncid, varid, + xtype)); + + /* Find metadata for this file and var. */ + assert(nc && nc->nc4_info); + h5 = nc->nc4_info; + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + assert(grp && var && var->name); + + /* If mem_nc_type is NC_NAT, it means we were called by + * nc_get|put_varm, the old V2 API call! In this case we want to + * use the file type as the mem type as well. Also, for these two + * functions only, we interpret the map array as referring to + * numbers of bytes rather than number of elements. (This is + * something that changed between V2 and V3.) Also we do not allow + * mapped access to user-defined vars in nc4. */ + if (xtype == NC_NAT) + { + if (var->xtype > NC_STRING) + return NC_EMAPTYPE; + xtype = var->xtype; + convert_map++; + } + assert(xtype); + + /* What is the size of this type? */ + if ((retval = nc4_get_typelen_mem(h5, xtype, is_long, &mem_type_size))) + return retval; + + if(map != NULL && var->ndims && convert_map) + { + /* convert map units from bytes to units of sizeof(type) */ + for(i = 0; i < var->ndims; i++) + { + if(map[i] % mem_type_size != 0) + return NC_EINVAL; + new_map[i] = map[i] / mem_type_size; + } + map = new_map; + } + + /* No text to number hanky-panky is allowed for those observing + * strict netcdf-3 rules! It's sick. */ + if ((h5->cmode & NC_CLASSIC_MODEL) && (xtype == NC_CHAR || var->xtype == NC_CHAR) && + (xtype != var->xtype)) + return NC_ECHAR; + + /* If the file is read-only, return an error. */ + if (pg == PUT && h5->no_write) + return NC_EPERM; + + /* If we're in define mode, we can't read or write data. If strict + * nc3 rules are in effect, return an error, otherwise leave define + * mode. */ + if (h5->flags & NC_INDEF) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_EINDEFINE; + if ((retval = nc_enddef(ncid))) + BAIL(retval); + } + +#ifdef LOGGING + { + int i; + if (start) + for (i=0; indims; i++) + LOG((4, "start[%d] %d", i, start[i])); + if (edges) + for (i=0; indims; i++) + LOG((4, "edges[%d] %d", i, edges[i])); + if (stride) + for (i=0; indims; i++) + LOG((4, "stride[%d] %d", i, stride[i])); + if (map) + for (i=0; indims; i++) + LOG((4, "map[%d] %d", i, map[i])); + } +#endif /* LOGGING */ + + /* The code below was stolen from netcdf-3. Some comments by Ed. */ + maxidim = (int) var->ndims - 1; + if (maxidim < 0) + { + /* The variable is a scalar; consequently, there is only one + thing to get and only one place to put it. (Why was I + called?) */ + return pg_var(pg, nc, ncid, varid, xtype, is_long, data); + } + + /* The variable is an array. */ + { + int idim; + size_t *mystart = NULL; + size_t *myedges; + size_t *iocount; /* count vector */ + size_t *stop; /* stop indexes */ + size_t *length; /* edge lengths in bytes */ + ptrdiff_t *mystride; + ptrdiff_t *mymap; + + /* Verify stride argument. */ + for (idim = 0; idim <= maxidim; ++idim) + { + if (stride != NULL + && (stride[idim] == 0 + /* cast needed for braindead systems with signed size_t */ + || (unsigned long) stride[idim] >= X_INT_MAX)) + { + return NC_ESTRIDE; + } + } + + /* The mystart array of pointer info is needed to walk our way + through the dimensions as specified by the start, edges, + stride and (gulp!) map parameters. */ + if (!(mystart = (size_t *)calloc((size_t)var->ndims * 7, sizeof(ptrdiff_t)))) + return NC_ENOMEM; + myedges = mystart + var->ndims; + iocount = myedges + var->ndims; + stop = iocount + var->ndims; + length = stop + var->ndims; + mystride = (ptrdiff_t *)(length + var->ndims); + mymap = mystride + var->ndims; + + /* Initialize I/O parameters. */ + for (idim = maxidim; idim >= 0; --idim) + { + /* Get start value, use 0 if non provided. */ + mystart[idim] = start != NULL ? start[idim] : 0; + + /* If any edges are 0, return NC_NOERR and forget it. */ + if (edges[idim] == 0) + { + retval = NC_NOERR; + goto done; + } + + /* If edges not provided, use the current dimlen. */ + if (edges) + myedges[idim] = edges[idim]; + else + { + size_t len; + if ((retval = nc_inq_dimlen(ncid, var->dimids[idim], &len))) + goto done; + myedges[idim] = len - mystart[idim]; + } + + /* If stride not provided, use 1. */ + mystride[idim] = stride != NULL ? stride[idim] : 1; + + /* If map is not provided, do something dark and + mysterious. */ + if (map) + mymap[idim] = map[idim]; + else + mymap[idim] = idim == maxidim ? 1 : + mymap[idim + 1] * (ptrdiff_t) myedges[idim + 1]; + + iocount[idim] = 1; + length[idim] = mymap[idim] * myedges[idim]; + stop[idim] = mystart[idim] + myedges[idim] * mystride[idim]; + } + + /* Check start, edges */ + for (idim = maxidim; idim >= 0; --idim) + { + size_t dimlen; + if ((retval = nc_inq_dimlen(ncid, var->dimids[idim], &dimlen))) + goto done; + /* Don't check unlimited dimension on PUTs. */ + if (pg == PUT) + { + int stop = 0, d, num_unlim_dim, unlim_dimids[NC_MAX_DIMS]; + if ((retval = nc_inq_unlimdims(ncid, &num_unlim_dim, unlim_dimids))) + goto done; + for (d = 0; d < num_unlim_dim; d++) + if (var->dimids[idim] == unlim_dimids[d]) + stop++; + if (stop) + break; + } + LOG((4, "idim=%d mystart[idim]=%d myedge[idim]=%d dimlen=%d", + idim, mystart[idim], myedges[idim], dimlen)); + if (mystart[idim] >= dimlen) + { + retval = NC_EINVALCOORDS; + goto done; + } + + if (mystart[idim] + myedges[idim] > dimlen) + { + retval = NC_EEDGE; + goto done; + } + } + + /* OK, now we're just getting too fancy... As an optimization, + adjust I/O parameters when the fastest dimension has unity + stride both externally and internally. In this case, the user + could have called a simpler routine + (i.e. ncvarnc_get_vara_text).*/ + if (mystride[maxidim] == 1 + && mymap[maxidim] == 1) + { + iocount[maxidim] = myedges[maxidim]; + mystride[maxidim] = (ptrdiff_t) myedges[maxidim]; + mymap[maxidim] = (ptrdiff_t) length[maxidim]; + } + + /* Perform I/O. Exit when done. */ + for (;;) + { + int lretval; + if (pg == GET) + lretval = nc4_get_vara(nc, ncid, varid, mystart, iocount, xtype, + is_long, data); + else + lretval = nc4_put_vara(nc, ncid, varid, mystart, iocount, xtype, + is_long, data); + if (lretval != NC_NOERR + && (retval == NC_NOERR || lretval != NC_ERANGE)) + retval = lretval; + + /* + * The following code permutes through the variable s + * external start-index space and it s internal address + * space. At the UPC, this algorithm is commonly + * called "odometer code". + */ + idim = maxidim; + carry: + data = (char *)data + (mymap[idim] * mem_type_size); + LOG((4, "data=0x%x mymap[%d]=%d", data, idim, (int)mymap[idim])); + mystart[idim] += mystride[idim]; + LOG((4, "mystart[%d]=%d length[%d]=%d", idim, (int)mystart[idim], + idim, (int)length[idim])); + if (mystart[idim] == stop[idim]) + { + mystart[idim] = start[idim]; + data = (char *)data - (length[idim] * mem_type_size); + if (--idim < 0) + break; /* normal return */ + goto carry; + } + } /* I/O loop */ + done: + free(mystart); + } /* variable is array */ + + exit: + return retval; +} + +/* This function will copy data from one buffer to another, in + accordance with the types. Range errors will be noted, and the fill + value used (or the default fill value if none is supplied) for + values that overflow the type. + + I should be able to take this out when HDF5 does the right thing + with data type conversion. + + Ed Hartnett, 11/15/3 +*/ + +int +nc4_convert_type(const void *src, void *dest, + const nc_type src_type, const nc_type dest_type, + const size_t len, int *range_error, + const void *fill_value, int strict_nc3, int src_long, + int dest_long) +{ + char *cp, *cp1; + float *fp, *fp1; + double *dp, *dp1; + int *ip, *ip1; + signed long *lp, *lp1; + short *sp, *sp1; + signed char *bp, *bp1; + unsigned char *ubp, *ubp1; + unsigned short *usp, *usp1; + unsigned int *uip, *uip1; + long long *lip, *lip1; + unsigned long long *ulip, *ulip1; + size_t count = 0; + + *range_error = 0; + LOG((3, "nc4_convert_type: len %d src_type %d dest_type %d src_long %d" + " dest_long %d", len, src_type, dest_type, src_long, dest_long)); + + /* OK, this is ugly. If you can think of anything better, I'm open + to suggestions! + + Note that we don't use a default fill value for type + NC_BYTE. This is because Lord Voldemort cast a nofilleramous spell + at Harry Potter, but it bounced off his scar and hit the netcdf-4 + code. + */ + switch (src_type) + { + case NC_CHAR: + switch (dest_type) + { + case NC_CHAR: + for (cp = (char *)src, cp1 = dest; count < len; count++) + *cp1++ = *cp++; + break; + default: + LOG((0, "nc4_convert_type: Uknown destination type.")); + } + break; + case NC_BYTE: + switch (dest_type) + { + case NC_BYTE: + for (bp = (signed char *)src, bp1 = dest; count < len; count++) + *bp1++ = *bp++; + break; + case NC_UBYTE: + for (bp = (signed char *)src, ubp = dest; count < len; count++) + { + if (*bp < 0) + (*range_error)++; + *ubp++ = *bp++; + } + break; + case NC_SHORT: + for (bp = (signed char *)src, sp = dest; count < len; count++) + *sp++ = *bp++; + break; + case NC_USHORT: + for (bp = (signed char *)src, usp = dest; count < len; count++) + { + if (*bp < 0) + (*range_error)++; + *usp++ = *bp++; + } + break; + case NC_INT: + if (dest_long) + { + for (bp = (signed char *)src, lp = dest; count < len; count++) + *lp++ = *bp++; + break; + } + else + { + for (bp = (signed char *)src, ip = dest; count < len; count++) + *ip++ = *bp++; + break; + } + case NC_UINT: + for (bp = (signed char *)src, uip = dest; count < len; count++) + { + if (*bp < 0) + (*range_error)++; + *uip++ = *bp++; + } + break; + case NC_INT64: + for (bp = (signed char *)src, lip = dest; count < len; count++) + *lip++ = *bp++; + break; + case NC_UINT64: + for (bp = (signed char *)src, ulip = dest; count < len; count++) + { + if (*bp < 0) + (*range_error)++; + *ulip++ = *bp++; + } + break; + case NC_FLOAT: + for (bp = (signed char *)src, fp = dest; count < len; count++) + *fp++ = *bp++; + break; + case NC_DOUBLE: + for (bp = (signed char *)src, dp = dest; count < len; count++) + *dp++ = *bp++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_UBYTE: + switch (dest_type) + { + case NC_BYTE: + for (ubp = (unsigned char *)src, bp = dest; count < len; count++) + { + if (!strict_nc3 && *ubp > X_SCHAR_MAX) + (*range_error)++; + *bp++ = *ubp++; + } + break; + case NC_SHORT: + for (ubp = (unsigned char *)src, sp = dest; count < len; count++) + *sp++ = *ubp++; + break; + case NC_UBYTE: + for (ubp = (unsigned char *)src, ubp1 = dest; count < len; count++) + *ubp1++ = *ubp++; + break; + case NC_USHORT: + for (ubp = (unsigned char *)src, usp = dest; count < len; count++) + *usp++ = *ubp++; + break; + case NC_INT: + if (dest_long) + { + for (ubp = (unsigned char *)src, lp = dest; count < len; count++) + *lp++ = *ubp++; + break; + } + else + { + for (ubp = (unsigned char *)src, ip = dest; count < len; count++) + *ip++ = *ubp++; + break; + } + case NC_UINT: + for (ubp = (unsigned char *)src, uip = dest; count < len; count++) + *uip++ = *ubp++; + break; + case NC_INT64: + for (ubp = (unsigned char *)src, lip = dest; count < len; count++) + *lip++ = *ubp++; + break; + case NC_UINT64: + for (ubp = (unsigned char *)src, ulip = dest; count < len; count++) + *ulip++ = *ubp++; + break; + case NC_FLOAT: + for (ubp = (unsigned char *)src, fp = dest; count < len; count++) + *fp++ = *ubp++; + break; + case NC_DOUBLE: + for (ubp = (unsigned char *)src, dp = dest; count < len; count++) + *dp++ = *ubp++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_SHORT: + switch (dest_type) + { + case NC_UBYTE: + for (sp = (short *)src, ubp = dest; count < len; count++) + { + if (*sp > X_UCHAR_MAX || *sp < 0) + (*range_error)++; + *ubp++ = *sp++; + } + break; + case NC_BYTE: + for (sp = (short *)src, bp = dest; count < len; count++) + { + if (*sp > X_SCHAR_MAX || *sp < X_SCHAR_MIN) + (*range_error)++; + *bp++ = *sp++; + } + break; + case NC_SHORT: + for (sp = (short *)src, sp1 = dest; count < len; count++) + *sp1++ = *sp++; + break; + case NC_USHORT: + for (sp = (short *)src, usp = dest; count < len; count++) + { + if (*sp < 0) + (*range_error)++; + *usp++ = *sp++; + } + break; + case NC_INT: + if (dest_long) + for (sp = (short *)src, lp = dest; count < len; count++) + *lp++ = *sp++; + else + for (sp = (short *)src, ip = dest; count < len; count++) + *ip++ = *sp++; + break; + case NC_UINT: + for (sp = (short *)src, uip = dest; count < len; count++) + { + if (*sp < 0) + (*range_error)++; + *uip++ = *sp++; + } + break; + case NC_INT64: + for (sp = (short *)src, lip = dest; count < len; count++) + *lip++ = *sp++; + break; + case NC_UINT64: + for (sp = (short *)src, ulip = dest; count < len; count++) + { + if (*sp < 0) + (*range_error)++; + *ulip++ = *sp++; + } + break; + case NC_FLOAT: + for (sp = (short *)src, fp = dest; count < len; count++) + *fp++ = *sp++; + break; + case NC_DOUBLE: + for (sp = (short *)src, dp = dest; count < len; count++) + *dp++ = *sp++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_USHORT: + switch (dest_type) + { + case NC_UBYTE: + for (usp = (unsigned short *)src, ubp = dest; count < len; count++) + { + if (*usp > X_UCHAR_MAX) + (*range_error)++; + *ubp++ = *usp++; + } + break; + case NC_BYTE: + for (usp = (unsigned short *)src, bp = dest; count < len; count++) + { + if (*usp > X_SCHAR_MAX) + (*range_error)++; + *bp++ = *usp++; + } + break; + case NC_SHORT: + for (usp = (unsigned short *)src, sp = dest; count < len; count++) + { + if (*usp > X_SHORT_MAX) + (*range_error)++; + *sp++ = *usp++; + } + break; + case NC_USHORT: + for (usp = (unsigned short *)src, usp1 = dest; count < len; count++) + *usp1++ = *usp++; + break; + case NC_INT: + if (dest_long) + for (usp = (unsigned short *)src, lp = dest; count < len; count++) + *lp++ = *usp++; + else + for (usp = (unsigned short *)src, ip = dest; count < len; count++) + *ip++ = *usp++; + break; + case NC_UINT: + for (usp = (unsigned short *)src, uip = dest; count < len; count++) + *uip++ = *usp++; + break; + case NC_INT64: + for (usp = (unsigned short *)src, lip = dest; count < len; count++) + *lip++ = *usp++; + break; + case NC_UINT64: + for (usp = (unsigned short *)src, ulip = dest; count < len; count++) + *ulip++ = *usp++; + break; + case NC_FLOAT: + for (usp = (unsigned short *)src, fp = dest; count < len; count++) + *fp++ = *usp++; + break; + case NC_DOUBLE: + for (usp = (unsigned short *)src, dp = dest; count < len; count++) + *dp++ = *usp++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_INT: + if (src_long) + { + switch (dest_type) + { + case NC_UBYTE: + for (lp = (long *)src, ubp = dest; count < len; count++) + { + if (*lp > X_UCHAR_MAX || *lp < 0) + (*range_error)++; + *ubp++ = *lp++; + } + break; + case NC_BYTE: + for (lp = (long *)src, bp = dest; count < len; count++) + { + if (*lp > X_SCHAR_MAX || *lp < X_SCHAR_MIN) + (*range_error)++; + *bp++ = *lp++; + } + break; + case NC_SHORT: + for (lp = (long *)src, sp = dest; count < len; count++) + { + if (*lp > X_SHORT_MAX || *lp < X_SHORT_MIN) + (*range_error)++; + *sp++ = *lp++; + } + break; + case NC_USHORT: + for (lp = (long *)src, usp = dest; count < len; count++) + { + if (*lp > X_USHORT_MAX || *lp < 0) + (*range_error)++; + *usp++ = *lp++; + } + break; + case NC_INT: /* src is long */ + if (dest_long) + { + for (lp = (long *)src, lp1 = dest; count < len; count++) + { + if (*lp > X_LONG_MAX || *lp < X_LONG_MIN) + (*range_error)++; + *lp1++ = *lp++; + } + } + else /* dest is int */ + { + for (lp = (long *)src, ip = dest; count < len; count++) + { + if (*lp > X_INT_MAX || *lp < X_INT_MIN) + (*range_error)++; + *ip++ = *lp++; + } + } + break; + case NC_UINT: + for (lp = (long *)src, uip = dest; count < len; count++) + { + if (*lp > X_UINT_MAX || *lp < 0) + (*range_error)++; + *uip++ = *lp++; + } + break; + case NC_INT64: + for (lp = (long *)src, lip = dest; count < len; count++) + *lip++ = *lp++; + break; + case NC_UINT64: + for (lp = (long *)src, ulip = dest; count < len; count++) + { + if (*lp < 0) + (*range_error)++; + *ulip++ = *lp++; + } + break; + case NC_FLOAT: + for (lp = (long *)src, fp = dest; count < len; count++) + *fp++ = *lp++; + break; + case NC_DOUBLE: + for (lp = (long *)src, dp = dest; count < len; count++) + *dp++ = *lp++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + } + else + { + switch (dest_type) + { + case NC_UBYTE: + for (ip = (int *)src, ubp = dest; count < len; count++) + { + if (*ip > X_UCHAR_MAX || *ip < 0) + (*range_error)++; + *ubp++ = *ip++; + } + break; + case NC_BYTE: + for (ip = (int *)src, bp = dest; count < len; count++) + { + if (*ip > X_SCHAR_MAX || *ip < X_SCHAR_MIN) + (*range_error)++; + *bp++ = *ip++; + } + break; + case NC_SHORT: + for (ip = (int *)src, sp = dest; count < len; count++) + { + if (*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) + (*range_error)++; + *sp++ = *ip++; + } + break; + case NC_USHORT: + for (ip = (int *)src, usp = dest; count < len; count++) + { + if (*ip > X_USHORT_MAX || *ip < 0) + (*range_error)++; + *usp++ = *ip++; + } + break; + case NC_INT: /* src is int */ + if (dest_long) + { + for (ip = (int *)src, lp1 = dest; count < len; count++) + { + if (*ip > X_LONG_MAX || *ip < X_LONG_MIN) + (*range_error)++; + *lp1++ = *ip++; + } + } + else /* dest is int */ + { + for (ip = (int *)src, ip1 = dest; count < len; count++) + { + if (*ip > X_INT_MAX || *ip < X_INT_MIN) + (*range_error)++; + *ip1++ = *ip++; + } + } + break; + case NC_UINT: + for (ip = (int *)src, uip = dest; count < len; count++) + { + if (*ip > X_UINT_MAX || *ip < 0) + (*range_error)++; + *uip++ = *ip++; + } + break; + case NC_INT64: + for (ip = (int *)src, lip = dest; count < len; count++) + *lip++ = *ip++; + break; + case NC_UINT64: + for (ip = (int *)src, ulip = dest; count < len; count++) + { + if (*ip < 0) + (*range_error)++; + *ulip++ = *ip++; + } + break; + case NC_FLOAT: + for (ip = (int *)src, fp = dest; count < len; count++) + *fp++ = *ip++; + break; + case NC_DOUBLE: + for (ip = (int *)src, dp = dest; count < len; count++) + *dp++ = *ip++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + } + break; + case NC_UINT: + switch (dest_type) + { + case NC_UBYTE: + for (uip = (unsigned int *)src, ubp = dest; count < len; count++) + { + if (*uip > X_UCHAR_MAX) + (*range_error)++; + *ubp++ = *uip++; + } + break; + case NC_BYTE: + for (uip = (unsigned int *)src, bp = dest; count < len; count++) + { + if (*uip > X_SCHAR_MAX) + (*range_error)++; + *bp++ = *uip++; + } + break; + case NC_SHORT: + for (uip = (unsigned int *)src, sp = dest; count < len; count++) + { + if (*uip > X_SHORT_MAX) + (*range_error)++; + *sp++ = *uip++; + } + break; + case NC_USHORT: + for (uip = (unsigned int *)src, usp = dest; count < len; count++) + { + if (*uip > X_USHORT_MAX) + (*range_error)++; + *usp++ = *uip++; + } + break; + case NC_INT: + if (dest_long) + for (uip = (unsigned int *)src, lp = dest; count < len; count++) + { + if (*uip > X_LONG_MAX) + (*range_error)++; + *lp++ = *uip++; + } + else + for (uip = (unsigned int *)src, ip = dest; count < len; count++) + { + if (*uip > X_INT_MAX) + (*range_error)++; + *ip++ = *uip++; + } + break; + case NC_UINT: + for (uip = (unsigned int *)src, uip1 = dest; count < len; count++) + { + if (*uip > X_UINT_MAX) + (*range_error)++; + *uip1++ = *uip++; + } + break; + case NC_INT64: + for (uip = (unsigned int *)src, lip = dest; count < len; count++) + *lip++ = *uip++; + break; + case NC_UINT64: + for (uip = (unsigned int *)src, ulip = dest; count < len; count++) + *ulip++ = *uip++; + break; + case NC_FLOAT: + for (uip = (unsigned int *)src, fp = dest; count < len; count++) + *fp++ = *uip++; + break; + case NC_DOUBLE: + for (uip = (unsigned int *)src, dp = dest; count < len; count++) + *dp++ = *uip++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_INT64: + switch (dest_type) + { + case NC_UBYTE: + for (lip = (long long *)src, ubp = dest; count < len; count++) + { + if (*lip > X_UCHAR_MAX || *lip < 0) + (*range_error)++; + *ubp++ = *lip++; + } + break; + case NC_BYTE: + for (lip = (long long *)src, bp = dest; count < len; count++) + { + if (*lip > X_SCHAR_MAX || *lip < X_SCHAR_MIN) + (*range_error)++; + *bp++ = *lip++; + } + break; + case NC_SHORT: + for (lip = (long long *)src, sp = dest; count < len; count++) + { + if (*lip > X_SHORT_MAX || *lip < X_SHORT_MIN) + (*range_error)++; + *sp++ = *lip++; + } + break; + case NC_USHORT: + for (lip = (long long *)src, usp = dest; count < len; count++) + { + if (*lip > X_USHORT_MAX || *lip < 0) + (*range_error)++; + *usp++ = *lip++; + } + break; + case NC_UINT: + for (lip = (long long *)src, uip = dest; count < len; count++) + { + if (*lip > X_UINT_MAX || *lip < 0) + (*range_error)++; + *uip++ = *lip++; + } + break; + case NC_INT: + if (dest_long) + for (lip = (long long *)src, lp = dest; count < len; count++) + { + if (*lip > X_LONG_MAX || *lip < X_LONG_MIN) + (*range_error)++; + *lp++ = *lip++; + } + else + for (lip = (long long *)src, ip = dest; count < len; count++) + { + if (*lip > X_INT_MAX || *lip < X_INT_MIN) + (*range_error)++; + *ip++ = *lip++; + } + break; + case NC_INT64: + for (lip = (long long *)src, lip1 = dest; count < len; count++) + *lip1++ = *lip++; + break; + case NC_UINT64: + for (lip = (long long *)src, ulip = dest; count < len; count++) + { + if (*lip < 0) + (*range_error)++; + *ulip++ = *lip++; + } + break; + case NC_FLOAT: + for (lip = (long long *)src, fp = dest; count < len; count++) + *fp++ = *lip++; + break; + case NC_DOUBLE: + for (lip = (long long *)src, dp = dest; count < len; count++) + *dp++ = *lip++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_UINT64: + switch (dest_type) + { + case NC_UBYTE: + for (ulip = (unsigned long long *)src, ubp = dest; count < len; count++) + { + if (*ulip > X_UCHAR_MAX) + (*range_error)++; + *ubp++ = *ulip++; + } + break; + case NC_BYTE: + for (ulip = (unsigned long long *)src, bp = dest; count < len; count++) + { + if (*ulip > X_SCHAR_MAX) + (*range_error)++; + *bp++ = *ulip++; + } + break; + case NC_SHORT: + for (ulip = (unsigned long long *)src, sp = dest; count < len; count++) + { + if (*ulip > X_SHORT_MAX) + (*range_error)++; + *sp++ = *ulip++; + } + break; + case NC_USHORT: + for (ulip = (unsigned long long *)src, usp = dest; count < len; count++) + { + if (*ulip > X_USHORT_MAX) + (*range_error)++; + *usp++ = *ulip++; + } + break; + case NC_UINT: + for (ulip = (unsigned long long *)src, uip = dest; count < len; count++) + { + if (*ulip > X_UINT_MAX) + (*range_error)++; + *uip++ = *ulip++; + } + break; + case NC_INT: + if (dest_long) + for (ulip = (unsigned long long *)src, lp = dest; count < len; count++) + { + if (*ulip > X_LONG_MAX) + (*range_error)++; + *lp++ = *ulip++; + } + else + for (ulip = (unsigned long long *)src, ip = dest; count < len; count++) + { + if (*ulip > X_INT_MAX) + (*range_error)++; + *ip++ = *ulip++; + } + break; + case NC_INT64: + for (ulip = (unsigned long long *)src, lip = dest; count < len; count++) + { + if (*ulip > X_INT64_MAX) + (*range_error)++; + *lip++ = *ulip++; + } + break; + case NC_UINT64: + for (ulip = (unsigned long long *)src, ulip1 = dest; count < len; count++) + *ulip1++ = *ulip++; + break; + case NC_FLOAT: + for (ulip = (unsigned long long *)src, fp = dest; count < len; count++) + *fp++ = *ulip++; + break; + case NC_DOUBLE: + for (ulip = (unsigned long long *)src, dp = dest; count < len; count++) + *dp++ = *ulip++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_FLOAT: + switch (dest_type) + { + case NC_UBYTE: + for (fp = (float *)src, ubp = dest; count < len; count++) + { + if (*fp > X_UCHAR_MAX || *fp < 0) + (*range_error)++; + *ubp++ = *fp++; + } + break; + case NC_BYTE: + for (fp = (float *)src, bp = dest; count < len; count++) + { + if (*fp > (double)X_SCHAR_MAX || *fp < (double)X_SCHAR_MIN) + (*range_error)++; + *bp++ = *fp++; + } + break; + case NC_SHORT: + for (fp = (float *)src, sp = dest; count < len; count++) + { + if (*fp > (double)X_SHORT_MAX || *fp < (double)X_SHORT_MIN) + (*range_error)++; + *sp++ = *fp++; + } + break; + case NC_USHORT: + for (fp = (float *)src, usp = dest; count < len; count++) + { + if (*fp > X_USHORT_MAX || *fp < 0) + (*range_error)++; + *usp++ = *fp++; + } + break; + case NC_UINT: + for (fp = (float *)src, uip = dest; count < len; count++) + { + if (*fp > X_UINT_MAX || *fp < 0) + (*range_error)++; + *uip++ = *fp++; + } + break; + case NC_INT: + if (dest_long) + for (fp = (float *)src, lp = dest; count < len; count++) + { + if (*fp > (double)X_LONG_MAX || *fp < (double)X_LONG_MIN) + (*range_error)++; + *lp++ = *fp++; + } + else + for (fp = (float *)src, ip = dest; count < len; count++) + { + if (*fp > (double)X_INT_MAX || *fp < (double)X_INT_MIN) + (*range_error)++; + *ip++ = *fp++; + } + break; + case NC_INT64: + for (fp = (float *)src, lip = dest; count < len; count++) + { + if (*fp > X_INT64_MAX || *fp X_UINT64_MAX || *fp < 0) + (*range_error)++; + *lip++ = *fp++; + } + break; + case NC_FLOAT: + for (fp = (float *)src, fp1 = dest; count < len; count++) + { +/* if (*fp > X_FLOAT_MAX || *fp < X_FLOAT_MIN) + (*range_error)++;*/ + *fp1++ = *fp++; + } + break; + case NC_DOUBLE: + for (fp = (float *)src, dp = dest; count < len; count++) + *dp++ = *fp++; + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + case NC_DOUBLE: + switch (dest_type) + { + case NC_UBYTE: + for (dp = (double *)src, ubp = dest; count < len; count++) + { + if (*dp > X_UCHAR_MAX || *dp < 0) + (*range_error)++; + *ubp++ = *dp++; + } + break; + case NC_BYTE: + for (dp = (double *)src, bp = dest; count < len; count++) + { + if (*dp > X_SCHAR_MAX || *dp < X_SCHAR_MIN) + (*range_error)++; + *bp++ = *dp++; + } + break; + case NC_SHORT: + for (dp = (double *)src, sp = dest; count < len; count++) + { + if (*dp > X_SHORT_MAX || *dp < X_SHORT_MIN) + (*range_error)++; + *sp++ = *dp++; + } + break; + case NC_USHORT: + for (dp = (double *)src, usp = dest; count < len; count++) + { + if (*dp > X_USHORT_MAX || *dp < 0) + (*range_error)++; + *usp++ = *dp++; + } + break; + case NC_UINT: + for (dp = (double *)src, uip = dest; count < len; count++) + { + if (*dp > X_UINT_MAX || *dp < 0) + (*range_error)++; + *uip++ = *dp++; + } + break; + case NC_INT: + if (dest_long) + for (dp = (double *)src, lp = dest; count < len; count++) + { + if (*dp > X_LONG_MAX || *dp < X_LONG_MIN) + (*range_error)++; + *lp++ = *dp++; + } + else + for (dp = (double *)src, ip = dest; count < len; count++) + { + if (*dp > X_INT_MAX || *dp < X_INT_MIN) + (*range_error)++; + *ip++ = *dp++; + } + break; + case NC_INT64: + for (dp = (double *)src, lip = dest; count < len; count++) + { + if (*dp > X_INT64_MAX || *dp < X_INT64_MIN) + (*range_error)++; + *lip++ = *dp++; + } + break; + case NC_UINT64: + for (dp = (double *)src, lip = dest; count < len; count++) + { + if (*dp > X_UINT64_MAX || *dp < 0) + (*range_error)++; + *lip++ = *dp++; + } + break; + case NC_FLOAT: + for (dp = (double *)src, fp = dest; count < len; count++) + { + if (*dp > X_FLOAT_MAX || *dp < X_FLOAT_MIN) + (*range_error)++; + *fp++ = *dp++; + } + break; + case NC_DOUBLE: + for (dp = (double *)src, dp1 = dest; count < len; count++) + { + /* if (*dp > X_DOUBLE_MAX || *dp < X_DOUBLE_MIN) */ + /* (*range_error)++; */ + *dp1++ = *dp++; + } + break; + default: + LOG((0, "nc4_convert_type: unexpected dest type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + break; + default: + LOG((0, "nc4_convert_type: unexpected src type. " + "src_type %d, dest_type %d", src_type, dest_type)); + return NC_EBADTYPE; + } + return NC_NOERR; +} + +/* In our first pass through the data, we may have encountered + * variables before encountering their dimscales, so go through the + * vars in this file and make sure we've got a dimid for each. */ +int +nc4_rec_match_dimscales(NC_GRP_INFO_T *grp) +{ + NC_GRP_INFO_T *g; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + H5G_stat_t statbuf; + int d, finished; + int retval = NC_NOERR; + + assert(grp && grp->name); + LOG((4, "nc4_rec_match_dimscales: grp->name %s", grp->name)); + + /* Perform var dimscale match for child groups. */ + for (g = grp->children; g; g = g->next) + if ((retval = nc4_rec_match_dimscales(g))) + return retval; + + /* Check all the vars in this group. If they have dimscale info, + * try and find a dimension for them. */ + for (var = grp->var; var; var = var->next) + { + /* Are there dimscales for this variable? */ + if (var->dimscale_hdf5_objids) + { + for (d = 0; d < var->ndims; d++) + { + LOG((5, "nc4_rec_match_dimscales: var %s has dimscale info...", var->name)); + /* Look at all the dims in this group to see if they + * match. */ + finished = 0; + for (g = grp; g && !finished; g = g->parent) + { + for (dim = g->dim; dim; dim = dim->next) + { + if (!dim->hdf_dimscaleid) + return NC_EDIMMETA; + if (H5Gget_objinfo(dim->hdf_dimscaleid, ".", 1, &statbuf) < 0) + return NC_EHDFERR; + if (var->dimscale_hdf5_objids[d].fileno[0] == statbuf.fileno[0] && + var->dimscale_hdf5_objids[d].objno[0] == statbuf.objno[0] && + var->dimscale_hdf5_objids[d].fileno[1] == statbuf.fileno[1] && + var->dimscale_hdf5_objids[d].objno[1] == statbuf.objno[1]) + { + LOG((4, "nc4_rec_match_dimscales: for dimension %d, found dim %s", + d, dim->name)); + var->dimids[d] = dim->dimid; + finished++; + break; + } + } /* next dim */ + } /* next grp */ + LOG((5, "nc4_rec_match_dimscales: dimid for this dimscale is %d", var->xtype)); + } /* next var->dim */ + } + else + { + if (!var->dimscale) + { + hid_t spaceid = 0; + hsize_t *h5dimlen = NULL, *h5dimlenmax = NULL; + int dataset_ndims; + + /* No dimscales for this var! Invent phony dimensions. */ + + /* Find the space information for this dimension. */ + if ((spaceid = H5Dget_space(var->hdf_datasetid)) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_spaces++; +#endif + + /* Get the len of each dim in the space. */ + if (var->ndims) + { + if (!(h5dimlen = malloc(var->ndims * sizeof(hsize_t)))) + return NC_ENOMEM; + if (!(h5dimlenmax = malloc(var->ndims * sizeof(hsize_t)))) + return NC_ENOMEM; + if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid, h5dimlen, + h5dimlenmax)) < 0) + return NC_EHDFERR; + if (dataset_ndims != var->ndims) + return NC_EHDFERR; + } + else + { + /* Make sure it's scalar. */ + if (H5Sget_simple_extent_type(spaceid) != H5S_SCALAR) + return NC_EHDFERR; + } + + /* Release the space object. */ + if (H5Sclose(spaceid) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_spaces--; +#endif + + /* Create a phony dimension for each dimension in the + * dataset, unless there already is one the correct + * size. */ + for (d = 0; d < var->ndims; d++) + { + NC_DIM_INFO_T *dim = NULL; + char phony_dim_name[NC_MAX_NAME + 1]; + + /* Is there already a phony dimension of the correct size? */ + for (dim = grp->dim; dim; dim = dim->next) + if ((dim->len == h5dimlen[d]) && + ((h5dimlenmax[d] == H5S_UNLIMITED && dim->unlimited) || + (h5dimlenmax[d] != H5S_UNLIMITED && !dim->unlimited))) + break; + + /* Didn't find a phony dim? Then create one. */ + if (!dim) + { + LOG((3, "nc4_rec_match_dimscales: creating phony dim for var %s", var->name)); + if ((retval = nc4_dim_list_add(&grp->dim))) + return retval; + grp->ndims++; + dim = grp->dim; + dim->dimid = grp->file->nc4_info->next_dimid++; + sprintf(phony_dim_name, "phony_dim_%d", dim->dimid); + if (!(dim->name = malloc((strlen(phony_dim_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(dim->name, phony_dim_name); + dim->len = h5dimlen[d]; + if (h5dimlenmax[d] == H5S_UNLIMITED) + dim->unlimited = 1; + } + + /* The variable must remember the dimid. */ + var->dimids[d] = dim->dimid; + } /* next dim */ + + /* Free the memory we malloced. */ + free(h5dimlen); + free(h5dimlenmax); + } + } + } + + return retval; +} + +/* Get the length, in bytes, of one element of a type in memory. */ +int +nc4_get_typelen_mem(NC_HDF5_FILE_INFO_T *h5, nc_type xtype, int is_long, + size_t *len) +{ + NC_TYPE_INFO_T *type; + int retval; + + LOG((4, "nc4_get_typelen_mem xtype: %d", xtype)); + assert(len); + + /* If this is an atomic type, the answer is easy. */ + switch (xtype) + { + case NC_BYTE: + case NC_CHAR: + case NC_UBYTE: + *len = sizeof(char); + return NC_NOERR; + case NC_SHORT: + case NC_USHORT: + *len = sizeof(short); + return NC_NOERR; + case NC_INT: + case NC_UINT: + if (is_long) + *len = sizeof(long); + else + *len = sizeof(int); + return NC_NOERR; + case NC_FLOAT: + *len = sizeof(float); + return NC_NOERR; + case NC_DOUBLE: + *len = sizeof(double); + return NC_NOERR; + case NC_INT64: + case NC_UINT64: + *len = sizeof(long long); + return NC_NOERR; + case NC_STRING: + *len = 0; /* can't even guess! */ + return NC_NOERR; + } + + /* See if var is compound type. */ + if ((retval = nc4_find_type(h5, xtype, &type))) + return retval; + + if (!type) + return NC_EBADTYPE; + + *len = type->size; + + LOG((5, "type->size ", type->size)); + + return NC_NOERR; +} diff --git a/extern/src_netcdf4/nc4internal.c b/extern/src_netcdf4/nc4internal.c new file mode 100644 index 0000000..db13e42 --- /dev/null +++ b/extern/src_netcdf4/nc4internal.c @@ -0,0 +1,1476 @@ +/** \file \internal +Internal netcdf-4 functions. + +This file contains functions internal to the netcdf4 library. None of +the functions in this file are exposed in the exetnal API. These +functions all relate to the manipulation of netcdf-4's in-memory +buffer of metadata information, i.e. the linked list of NC_FILE_INFO_T +structs. + +Copyright 2003-2011, University Corporation for Atmospheric +Research. See the COPYRIGHT file for copying and redistribution +conditions. + +*/ +#include "config.h" +#include "nc4internal.h" +#include "nc.h" /* from libsrc */ +#include "ncdispatch.h" /* from libdispatch */ +#include + +#define MEGABYTE 1048576 + +/* These are the default chunk cache sizes for HDF5 files created or + * opened with netCDF-4. */ +extern size_t nc4_chunk_cache_size; +extern size_t nc4_chunk_cache_nelems; +extern float nc4_chunk_cache_preemption; + +/* This is to track opened HDF5 objects to make sure they are + * closed. */ +#ifdef EXTRA_TESTS +extern int num_spaces; +#endif /* EXTRA_TESTS */ + +#ifdef LOGGING +/* This is the severity level of messages which will be logged. Use + severity 0 for errors, 1 for important log messages, 2 for less + important, etc. */ +int nc_log_level = -1; + +#endif /* LOGGING */ + +/* Check and normalize and name. */ +int +nc4_check_name(const char *name, char *norm_name) +{ + char *temp; + int retval; + + /* Check the length. */ + if (strlen(name) > NC_MAX_NAME) + return NC_EMAXNAME; + + /* Make sure this is a valid netcdf name. This should be done + * before the name is normalized, because it gives better error + * codes for bad utf8 strings. */ + if ((retval = NC_check_name(name))) + return retval; + + /* Normalize the name. */ + if (!(temp = (char *)utf8proc_NFC((const unsigned char *)name))) + return NC_EINVAL; + strcpy(norm_name, temp); + free(temp); + + return NC_NOERR; +} + +/* Given a varid, find its shape. For unlimited dimensions, return + the current number of records. */ +static int +find_var_shape_grp(NC_GRP_INFO_T *grp, int varid, int *ndims, + int *dimid, size_t *dimlen) +{ + hid_t datasetid = 0, spaceid = 0; + NC_VAR_INFO_T *var; + hsize_t *h5dimlen = NULL, *h5dimlenmax = NULL; + int d, dataset_ndims = 0; + int retval = NC_NOERR; + + /* Find this var. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + if (!var) + return NC_ENOTVAR; + + /* Get the dimids and the ndims for this var. */ + if (ndims) + *ndims = var->ndims; + + if (dimid) + for (d = 0; d < var->ndims; d++) + dimid[d] = var->dimids[d]; + + if (dimlen) + { + /* If the var hasn't been created yet, its size is 0. */ + if (!var->created) + { + for (d = 0; d < var->ndims; d++) + dimlen[d] = 0; + } + else + { + /* Get the number of records in the dataset. */ + if ((retval = nc4_open_var_grp2(grp, var->varid, &datasetid))) + BAIL(retval); + if ((spaceid = H5Dget_space(datasetid)) < 0) + BAIL(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces++; +#endif + /* If it's a scalar dataset, it has length one. */ + if (H5Sget_simple_extent_type(spaceid) == H5S_SCALAR) + { + dimlen[0] = 1; + } + else + { + /* Check to make sure ndims is right, then get the len of each + dim in the space. */ + if ((dataset_ndims = H5Sget_simple_extent_ndims(spaceid)) < 0) + BAIL(NC_EHDFERR); + if (ndims && dataset_ndims != *ndims) + BAIL(NC_EHDFERR); + if (!(h5dimlen = malloc(dataset_ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); + if (!(h5dimlenmax = malloc(dataset_ndims * sizeof(hsize_t)))) + BAIL(NC_ENOMEM); + if ((dataset_ndims = H5Sget_simple_extent_dims(spaceid, + h5dimlen, h5dimlenmax)) < 0) + BAIL(NC_EHDFERR); + LOG((5, "find_var_shape_nc: varid %d len %d max: %d", + varid, (int)h5dimlen[0], (int)h5dimlenmax[0])); + for (d=0; d 0 && H5Sclose(spaceid) < 0) + BAIL2(NC_EHDFERR); +#ifdef EXTRA_TESTS + num_spaces--; +#endif + if (h5dimlen) free(h5dimlen); + if (h5dimlenmax) free(h5dimlenmax); + return retval; +} + +/* Given an NC_FILE_INFO_T pointer, add the necessary stuff for a + * netcdf-4 file. */ +int +nc4_nc4f_list_add(NC_FILE_INFO_T *nc, const char *path, int mode) +{ + NC_HDF5_FILE_INFO_T *h5; + NC_GRP_INFO_T *grp; + + assert(nc && !nc->nc4_info && path); + + /* The NC_FILE_INFO_T was allocated and inited by + ncfunc.c before this function is called. We need to malloc and + initialize the substructure NC_HDF_FILE_INFO_T. */ + if (!(nc->nc4_info = calloc(1, sizeof(NC_HDF5_FILE_INFO_T)))) + return NC_ENOMEM; + h5 = nc->nc4_info; + + /* Hang on to the filename for nc_abort. */ + if (!(h5->path = malloc((strlen(path) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(h5->path, path); + + /* Hang on to cmode, and note that we're in define mode. */ + h5->cmode = mode | NC_INDEF; + + /* The next_typeid needs to be set beyond the end of our atomic + * types. */ + h5->next_typeid = NC_FIRSTUSERTYPEID; + + /* There's always at least one open group - the root + * group. Allocate space for one group's worth of information. Set + * its hdf id, name, and a pointer to it's file structure. */ + return nc4_grp_list_add(&(h5->root_grp), h5->next_nc_grpid++, + NULL, nc, NC_GROUP_NAME, &grp); +} +/* /\* Given an ncid, find the relevant group and return a pointer to */ +/* * it. *\/ */ +/* NC_GRP_INFO_T * */ +/* find_nc_grp(int ncid) */ +/* { */ +/* NC_FILE_INFO_T *f; */ + +/* for (f = nc_file; f; f = f->next) */ +/* { */ +/* if (f->ext_ncid == (ncid & FILE_ID_MASK)) */ +/* { */ +/* assert(f->nc4_info && f->nc4_info->root_grp); */ +/* return nc4_rec_find_grp(f->nc4_info->root_grp, (ncid & GRP_ID_MASK)); */ +/* } */ +/* } */ + +/* return NULL; */ +/* } */ + +/* Given an ncid, find the relevant group and return a pointer to it, + * return an error of this is not a netcdf-4 file (or if strict nc3 is + * turned on for this file.) */ + + +int +nc4_find_nc4_grp(int ncid, NC_GRP_INFO_T **grp) +{ + NC_FILE_INFO_T *f = nc4_find_nc_file(ncid); + if(f == NULL) return NC_EBADID; + + /* No netcdf-3 files allowed! */ + if (!f->nc4_info) return NC_ENOTNC4; + assert(f->nc4_info->root_grp); + + /* This function demands netcdf-4 files without strict nc3 + * rules.*/ + if (f->nc4_info->cmode & NC_CLASSIC_MODEL) return NC_ESTRICTNC3; + + /* If we can't find it, the grp id part of ncid is bad. */ + if (!(*grp = nc4_rec_find_grp(f->nc4_info->root_grp, (ncid & GRP_ID_MASK)))) + return NC_EBADID; + return NC_NOERR; +} + +/* Given an ncid, find the relevant group and return a pointer to it, + * also set a pointer to the nc4_info struct of the related file. For + * netcdf-3 files, *h5 will be set to NULL. */ +int +nc4_find_grp_h5(int ncid, NC_GRP_INFO_T **grp, NC_HDF5_FILE_INFO_T **h5) +{ + NC_FILE_INFO_T *f = nc4_find_nc_file(ncid); + if(f == NULL) return NC_EBADID; + if (f->nc4_info) { + assert(f->nc4_info->root_grp); + /* If we can't find it, the grp id part of ncid is bad. */ + if (!(*grp = nc4_rec_find_grp(f->nc4_info->root_grp, (ncid & GRP_ID_MASK)))) + return NC_EBADID; + *h5 = (*grp)->file->nc4_info; + assert(*h5); + } else { + *h5 = NULL; + *grp = NULL; + } + return NC_NOERR; +} + +int +nc4_find_nc_grp_h5(int ncid, NC_FILE_INFO_T **nc, NC_GRP_INFO_T **grp, + NC_HDF5_FILE_INFO_T **h5) +{ + NC_FILE_INFO_T *f = nc4_find_nc_file(ncid); + if(f == NULL) return NC_EBADID; + *nc = f; + if (f->nc4_info) { + assert(f->nc4_info->root_grp); + /* If we can't find it, the grp id part of ncid is bad. */ + if (!(*grp = nc4_rec_find_grp(f->nc4_info->root_grp, (ncid & GRP_ID_MASK)))) + return NC_EBADID; + + *h5 = (*grp)->file->nc4_info; + assert(*h5); + } else { + *h5 = NULL; + *grp = NULL; + } + return NC_NOERR; +} + +/* Recursively hunt for a group id. */ +NC_GRP_INFO_T * +nc4_rec_find_grp(NC_GRP_INFO_T *start_grp, int target_nc_grpid) +{ + NC_GRP_INFO_T *g, *res; + + assert(start_grp); + + /* Is this the group we are searching for? */ + if (start_grp->nc_grpid == target_nc_grpid) + return start_grp; + + /* Shake down the kids. */ + if (start_grp->children) + for (g = start_grp->children; g; g = g->next) + if ((res = nc4_rec_find_grp(g, target_nc_grpid))) + return res; + + /* Can't find if. Fate, why do you mock me? */ + return NULL; +} + +/* Given an ncid and varid, get pointers to the group and var + * metadata. */ +int +nc4_find_g_var_nc(NC_FILE_INFO_T *nc, int ncid, int varid, + NC_GRP_INFO_T **grp, NC_VAR_INFO_T **var) +{ + /* Find the group info. */ + assert(grp && var && nc && nc->nc4_info && nc->nc4_info->root_grp); + *grp = nc4_rec_find_grp(nc->nc4_info->root_grp, (ncid & GRP_ID_MASK)); + + /* Find the var info. */ + for ((*var) = (*grp)->var; (*var); (*var) = (*var)->next) + if ((*var)->varid == varid) + break; + if (!(*var)) + return NC_ENOTVAR; + + return NC_NOERR; +} + +/* Find a dim in a grp (or parents). */ +int +nc4_find_dim(NC_GRP_INFO_T *grp, int dimid, NC_DIM_INFO_T **dim, + NC_GRP_INFO_T **dim_grp) +{ + NC_GRP_INFO_T *g, *dg = NULL; + int finished = 0; + + assert(grp && dim); + + /* Find the dim info. */ + for (g = grp; g && !finished; g = g->parent) + for ((*dim) = g->dim; (*dim); (*dim) = (*dim)->next) + if ((*dim)->dimid == dimid) + { + dg = g; + finished++; + break; + } + + /* If we didn't find it, return an error. */ + if (!(*dim)) + return NC_EBADDIM; + + /* Give the caller the group the dimension is in. */ + if (dim_grp) + *dim_grp = dg; + + return NC_NOERR; +} + +/* Recursively hunt for a HDF type id. */ +NC_TYPE_INFO_T * +nc4_rec_find_hdf_type(NC_GRP_INFO_T *start_grp, hid_t target_hdf_typeid) +{ + NC_GRP_INFO_T *g; + NC_TYPE_INFO_T *type, *res; + htri_t equal; + + assert(start_grp); + + /* Does this group have the type we are searching for? */ + for (type = start_grp->type; type; type = type->next) + { + if ((equal = H5Tequal(type->native_typeid ? type->native_typeid : type->hdf_typeid, target_hdf_typeid)) < 0) + return NULL; + if (equal) + return type; + } + + /* Shake down the kids. */ + if (start_grp->children) + for (g = start_grp->children; g; g = g->next) + if ((res = nc4_rec_find_hdf_type(g, target_hdf_typeid))) + return res; + + /* Can't find if. Fate, why do you mock me? */ + return NULL; +} + +/* Recursively hunt for a netCDF type id. */ +NC_TYPE_INFO_T * +nc4_rec_find_nc_type(NC_GRP_INFO_T *start_grp, nc_type target_nc_typeid) +{ + NC_GRP_INFO_T *g; + NC_TYPE_INFO_T *type, *res; + + assert(start_grp); + + /* Does this group have the type we are searching for? */ + for (type = start_grp->type; type; type = type->next) + if (type->nc_typeid == target_nc_typeid) + return type; + + /* Shake down the kids. */ + if (start_grp->children) + for (g = start_grp->children; g; g = g->next) + if ((res = nc4_rec_find_nc_type(g, target_nc_typeid))) + return res; + + /* Can't find if. Fate, why do you mock me? */ + return NULL; +} + +/* Recursively hunt for a netCDF type by name. */ +NC_TYPE_INFO_T * +nc4_rec_find_named_type(NC_GRP_INFO_T *start_grp, char *name) +{ + NC_GRP_INFO_T *g; + NC_TYPE_INFO_T *type, *res; + + assert(start_grp); + + /* Does this group have the type we are searching for? */ + for (type = start_grp->type; type; type = type->next) + if (!strcmp(type->name, name)) + return type; + + /* Search subgroups. */ + if (start_grp->children) + for (g = start_grp->children; g; g = g->next) + if ((res = nc4_rec_find_named_type(g, name))) + return res; + + /* Can't find if. Oh, woe is me! */ + return NULL; +} + +/* Use a netCDF typeid to find a type in a type_list. */ +int +nc4_find_type(NC_HDF5_FILE_INFO_T *h5, nc_type typeid, NC_TYPE_INFO_T **type) +{ + if (typeid < 0 || !type) + return NC_EINVAL; + *type = NULL; + + /* Atomic types don't have associated NC_TYPE_INFO_T struct, just + * return NOERR. */ + if (typeid <= NC_STRING) + return NC_NOERR; + + /* Find the type. */ + if(!(*type = nc4_rec_find_nc_type(h5->root_grp, typeid))) + return NC_EBADTYPID; + + return NC_NOERR; +} + +/* Find the actual length of a dim by checking the length of that dim + * in all variables that use it, in grp or children. *len must be + * initialized to zero before this function is called. */ +int +nc4_find_dim_len(NC_GRP_INFO_T *grp, int dimid, size_t **len) +{ + NC_GRP_INFO_T *g; + NC_VAR_INFO_T *var; + int d, ndims, dimids[NC_MAX_DIMS]; + size_t dimlen[NC_MAX_DIMS]; + int retval; + + assert(grp && len); + LOG((3, "nc4_find_dim_len: grp->name %s dimid %d", grp->name, dimid)); + + /* If there are any groups, call this function recursively on + * them. */ + for (g = grp->children; g; g = g->next) + if ((retval = nc4_find_dim_len(g, dimid, len))) + return retval; + + /* For all variables in this group, find the ones that use this + * dimension, and remember the max length. */ + for (var = grp->var; var; var = var->next) + { + /* Find dimensions of this var. */ + if ((retval = find_var_shape_grp(grp, var->varid, &ndims, + dimids, dimlen))) + return retval; + + /* Check for any dimension that matches dimid. If found, check + * if its length is longer than *lenp. */ + for (d = 0; d < ndims; d++) + { + if (dimids[d] == dimid) + { + /* Remember the max length in *lenp. */ + **len = dimlen[d] > **len ? dimlen[d] : **len; + break; + } + } + } + + return NC_NOERR; +} + +/* Given a group, find an att. */ +int +nc4_find_grp_att(NC_GRP_INFO_T *grp, int varid, const char *name, int attnum, + NC_ATT_INFO_T **att) +{ + NC_VAR_INFO_T *var; + NC_ATT_INFO_T *attlist = NULL; + + assert(grp && grp->name); + LOG((4, "nc4_find_grp_att: grp->name %s varid %d name %s attnum %d", + grp->name, varid, name, attnum)); + + /* Get either the global or a variable attribute list. */ + if (varid == NC_GLOBAL) + attlist = grp->att; + else + { + for(var = grp->var; var; var = var->next) + { + if (var->varid == varid) + { + attlist = var->att; + break; + } + } + if (!var) + return NC_ENOTVAR; + } + + /* Now find the attribute by name or number. If a name is provided, + * ignore the attnum. */ + for (*att = attlist; *att; *att = (*att)->next) + if ((name && !strcmp((*att)->name, name)) || + (!name && (*att)->attnum == attnum)) + return NC_NOERR; + + /* If we get here, we couldn't find the attribute. */ + return NC_ENOTATT; +} + +/* Given an ncid, varid, and name or attnum, find and return pointer + to NC_ATT_INFO_T metadata. */ +int +nc4_find_nc_att(int ncid, int varid, const char *name, int attnum, + NC_ATT_INFO_T **att) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_ATT_INFO_T *attlist = NULL; + int retval; + + LOG((4, "nc4_find_nc_att: ncid 0x%x varid %d name %s attnum %d", + ncid, varid, name, attnum)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + assert(grp && h5); + + /* Get either the global or a variable attribute list. */ + if (varid == NC_GLOBAL) + attlist = grp->att; + else + { + for(var = grp->var; var; var = var->next) + { + if (var->varid == varid) + { + attlist = var->att; + break; + } + } + if (!var) + return NC_ENOTVAR; + } + + /* Now find the attribute by name or number. If a name is provided, ignore the attnum. */ + for (*att = attlist; *att; *att = (*att)->next) + if ((name && !strcmp((*att)->name, name)) || + (!name && (*att)->attnum == attnum)) + return NC_NOERR; + + /* If we get here, we couldn't find the attribute. */ + return NC_ENOTATT; +} + +void +nc4_file_list_free(void) +{ + free_NCList(); +} + + +int +NC4_new_nc(NC** ncpp) +{ + NC_FILE_INFO_T** ncp; + /* Allocate memory for this info. */ + if (!(ncp = calloc(1, sizeof(NC_FILE_INFO_T)))) + return NC_ENOMEM; + if(ncpp) *ncpp = (NC*)ncp; + return NC_NOERR; +} + +int +nc4_file_list_add(NC_FILE_INFO_T** ncp, NC_Dispatch* dispatch) +{ + NC_FILE_INFO_T *nc; + int status = NC_NOERR; + + /* Allocate memory for this info; use the dispatcher to do this */ + status = dispatch->new_nc((NC**)&nc); + if(status) return status; + + /* Add this file to the list. */ + if ((status = add_to_NCList((NC *)nc))) + { + if(nc && nc->ext_ncid > 0) + { + del_from_NCList((NC *)nc); + free(nc); + } + return status; + } + + /* Return a pointer to the new struct. */ + if(ncp) + *ncp = nc; + + return NC_NOERR; +} + +/* Remove a NC_FILE_INFO_T from the linked list. This will nc_free the + memory too. */ +void +nc4_file_list_del(NC_FILE_INFO_T *nc) +{ + /* Remove file from master list. */ + del_from_NCList((NC *)nc); + free(nc); +} + + +/* Given an id, walk the list and find the appropriate + NC_FILE_INFO_T. */ +NC_FILE_INFO_T* +nc4_find_nc_file(int ext_ncid) +{ + return (NC_FILE_INFO_T*)find_in_NCList(ext_ncid); +} + + +/* Add to the end of a var list. Return a pointer to the newly + * added var. */ +int +nc4_var_list_add(NC_VAR_INFO_T **list, NC_VAR_INFO_T **var) +{ + NC_VAR_INFO_T *v; + + /* Allocate storage for new variable. */ + if (!(*var = calloc(1, sizeof(NC_VAR_INFO_T)))) + return NC_ENOMEM; + + /* Go to the end of the list and set the last one to point at our + * new var, or, if the list is empty, our new var becomes the + * list. */ + if(*list) + { + for (v = *list; v; v = v->next) + if (!v->next) + break; + v->next = *var; + (*var)->prev = v; + } + else + *list = *var; + + /* These are the HDF5-1.8.4 defaults. */ + (*var)->chunk_cache_size = nc4_chunk_cache_size; + (*var)->chunk_cache_nelems = nc4_chunk_cache_nelems; + (*var)->chunk_cache_preemption = nc4_chunk_cache_preemption; + + return NC_NOERR; +} + +/* Add to the beginning of a dim list. */ +int +nc4_dim_list_add(NC_DIM_INFO_T **list) +{ + NC_DIM_INFO_T *dim; + if (!(dim = calloc(1, sizeof(NC_DIM_INFO_T)))) + return NC_ENOMEM; + if(*list) + (*list)->prev = dim; + dim->next = *list; + *list = dim; + return NC_NOERR; +} + +/* Add to the beginning of a dim list. */ +int +nc4_dim_list_add2(NC_DIM_INFO_T **list, NC_DIM_INFO_T **new_dim) +{ + NC_DIM_INFO_T *dim; + if (!(dim = calloc(1, sizeof(NC_DIM_INFO_T)))) + return NC_ENOMEM; + if(*list) + (*list)->prev = dim; + dim->next = *list; + *list = dim; + + /* Return pointer to new dimension. */ + if (new_dim) + *new_dim = dim; + return NC_NOERR; +} + +/* Add to the end of an att list. */ +int +nc4_att_list_add(NC_ATT_INFO_T **list) +{ + NC_ATT_INFO_T *att, *a1; + if (!(att = calloc(1, sizeof(NC_ATT_INFO_T)))) + return NC_ENOMEM; + if (*list) + { + for (a1 = *list; a1; a1 = a1->next) + if (!a1->next) + break; + a1->next = att; + att->prev = a1; + } + else + { + *list = att; + } + + return NC_NOERR; +} + +/* Add to the end of a group list. Can't use 0 as a new_nc_grpid - + * it's reserverd for the root group. */ +int +nc4_grp_list_add(NC_GRP_INFO_T **list, int new_nc_grpid, + NC_GRP_INFO_T *parent_grp, NC_FILE_INFO_T *nc, + char *name, NC_GRP_INFO_T **grp) +{ + NC_GRP_INFO_T *g; + + LOG((3, "grp_list_add: new_nc_grpid %d name %s ", + new_nc_grpid, name)); + + /* Get the memory to store this groups info. */ + if (!(*grp = calloc(1, sizeof(NC_GRP_INFO_T)))) + return NC_ENOMEM; + + /* If the list is not NULL, add this group to it. Otherwise, this + * group structure becomes the list. */ + if (*list) + { + /* Move to end of the list. */ + for (g = *list; g; g = g->next) + if (!g->next) + break; + g->next = *grp; /* Add grp to end of list. */ + (*grp)->prev = g; + } + else + { + *list = *grp; + } + + /* Fill in this group's information. */ + (*grp)->nc_grpid = new_nc_grpid; + (*grp)->parent = parent_grp; + if (!((*grp)->name = malloc((strlen(name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy((*grp)->name, name); + (*grp)->file = nc; + + return NC_NOERR; +} + +/* Names for groups, variables, and types must not be the same. This + * function checks that a proposed name is not already in + * use. Normalzation of UTF8 strings should happen before this + * function is called. */ +int +nc4_check_dup_name(NC_GRP_INFO_T *grp, char *name) +{ + NC_TYPE_INFO_T *type; + NC_GRP_INFO_T *g; + NC_VAR_INFO_T *var; + + /* Any types of this name? */ + for (type = grp->type; type; type = type->next) + if (!strcmp(type->name, name)) + return NC_ENAMEINUSE; + + /* Any child groups of this name? */ + for (g = grp->children; g; g = g->next) + if (!strcmp(g->name, name)) + return NC_ENAMEINUSE; + + /* Any variables of this name? */ + for (var = grp->var; var; var = var->next) + if (!strcmp(var->name, name)) + return NC_ENAMEINUSE; + + return NC_NOERR; +} + +/* Add to the end of a type list. */ +int +nc4_type_list_add(NC_TYPE_INFO_T **list, NC_TYPE_INFO_T **new_type) +{ + NC_TYPE_INFO_T *type, *t; + + if (!(type = calloc(1, sizeof(NC_TYPE_INFO_T)))) + return NC_ENOMEM; + + if (*list) + { + for (t = *list; t; t = t->next) + if (!t->next) + break; + t->next = type; + type->prev = t; + } + else + { + *list = type; + } + + if (new_type) + *new_type = type; + + return NC_NOERR; +} + +/* Add to the end of a compound field list. */ +int +nc4_field_list_add(NC_FIELD_INFO_T **list, int fieldid, const char *name, + size_t offset, hid_t field_hdf_typeid, hid_t native_typeid, + nc_type xtype, int ndims, const int *dim_sizesp) +{ + NC_FIELD_INFO_T *field, *f; + int i; + + /* Name has already been checked and UTF8 normalized. */ + if (!name) + return NC_EINVAL; + + /* Allocate storage for this field information. */ + if (!(field = calloc(1, sizeof(NC_FIELD_INFO_T)))) + return NC_ENOMEM; + + /* Add this field to list. */ + if (*list) + { + for (f = *list; f; f = f->next) + if (!f->next) + break; + f->next = field; + field->prev = f; + } + else + { + *list = field; + } + + /* Store the information about this field. */ + field->fieldid = fieldid; + if (!(field->name = malloc((strlen(name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(field->name, name); + field->hdf_typeid = field_hdf_typeid; + field->native_typeid = native_typeid; + field->nctype = xtype; + field->offset = offset; + field->ndims = ndims; + if (ndims) + { + if (!(field->dim_size = malloc(ndims * sizeof(int)))) + return NC_ENOMEM; + for (i = 0; i < ndims; i++) + field->dim_size[i] = dim_sizesp[i]; + } + + return NC_NOERR; +} + +/* Add a member to an enum type. */ +int +nc4_enum_member_add(NC_ENUM_MEMBER_INFO_T **list, size_t size, + const char *name, const void *value) +{ + NC_ENUM_MEMBER_INFO_T *member, *m; + + /* Name has already been checked. */ + assert(name && size > 0 && value); + LOG((4, "nc4_enum_member_add: size %d name %s", size, name)); + + /* Allocate storage for this field information. */ + if (!(member = calloc(1, sizeof(NC_ENUM_MEMBER_INFO_T))) || + !(member->value = calloc(1, size))) + return NC_ENOMEM; + + /* Add this field to list. */ + if (*list) + { + for (m = *list; m; m = m->next) + if (!m->next) + break; + m->next = member; + member->prev = m; + } + else + { + *list = member; + } + + /* Store the information about this member. */ + if (!(member->name = malloc((strlen(name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(member->name, name); + memcpy(member->value, value, size); + + return NC_NOERR; +} + +/* Delete a var from a var list, and free the memory. */ +static int +var_list_del(NC_VAR_INFO_T **list, NC_VAR_INFO_T *var) +{ + NC_ATT_INFO_T *a, *att; + int ret; + + /* First delete all the attributes attached to this var. */ + att = (*list)->att; + while (att) + { + a = att->next; + if ((ret = nc4_att_list_del(&var->att, att))) + return ret; + att = a; + } + + /* Free some things that may be allocated. */ + if (var->chunksizes) + free(var->chunksizes); + if (var->hdf5_name) + free(var->hdf5_name); + if (var->name) + free(var->name); + if (var->dimids) + free(var->dimids); + if (var->dim) + free(var->dim); + + /* Remove the var from the linked list. */ + if(*list == var) + *list = var->next; + else + var->prev->next = var->next; + + if(var->next) + var->next->prev = var->prev; + + /* Delete any fill value allocation. This must be done before the + * type_info is freed. */ + if (var->fill_value) + { + if (var->hdf_datasetid) + { + if (var->type_info->class == NC_VLEN) + nc_free_vlen((nc_vlen_t *)var->fill_value); + else if (var->type_info->nc_typeid == NC_STRING) + free(*(char **)var->fill_value); + } + free(var->fill_value); + } + + /* For atomic types we have allocated space for type information. */ +/* if (var->hdf_datasetid && var->xtype <= NC_STRING)*/ + if (var->xtype <= NC_STRING) + { + if (var->type_info->native_typeid) + if ((H5Tclose(var->type_info->native_typeid)) < 0) + return NC_EHDFERR; + + /* Only need to close the hdf_typeid when it was obtained with + * H5Dget_type (which happens when reading a file, but not when + * creating a variable). */ + if (var->type_info->close_hdf_typeid || var->xtype == NC_STRING) + if ((H5Tclose(var->type_info->hdf_typeid)) < 0) + return NC_EHDFERR; + + /* Free the name. */ + if (var->type_info->name) + free(var->type_info->name); + + free(var->type_info); + } + + /* Delete any HDF5 dimscale objid information. */ + if (var->dimscale_hdf5_objids) + free(var->dimscale_hdf5_objids); + + /* Delete information about the attachment status of dimscales. */ + if (var->dimscale_attached) + free(var->dimscale_attached); + + /* Delete the var. */ + free(var); + + return NC_NOERR; +} + +/* Delete a field from a field list, and nc_free the memory. */ +static void +field_list_del(NC_FIELD_INFO_T **list, NC_FIELD_INFO_T *field) +{ + + /* Take this field out of the list. */ + if(*list == field) + *list = field->next; + else + field->prev->next = field->next; + + if(field->next) + field->next->prev = field->prev; + + /* Free some stuff. */ + if (field->name) + free(field->name); + if (field->dim_size) + free(field->dim_size); + + /* Nc_Free the memory. */ + free(field); +} + +/* Delete a type from a type list, and nc_free the memory. */ +int +type_list_del(NC_TYPE_INFO_T **list, NC_TYPE_INFO_T *type) +{ + NC_FIELD_INFO_T *field, *f; + NC_ENUM_MEMBER_INFO_T *enum_member, *em; + + /* Close any open user-defined HDF5 typieds. */ + if (type->hdf_typeid) + { + if (H5Tclose(type->hdf_typeid) < 0) + return NC_EHDFERR; + } + if (type->native_typeid) + { + if (H5Tclose(type->native_typeid) < 0) + return NC_EHDFERR; + } + + /* Free the name. */ + if (type->name) + free(type->name); + + /* Delete all the fields in this type (there will be some if its a + * compound). */ + field = type->field; + while (field) + { + f = field->next; + field_list_del(&type->field, field); + field = f; + } + + /* Delete all the enum_members, if any. */ + enum_member = type->enum_member; + while (enum_member) + { + em = enum_member->next; + free(enum_member->value); + free(enum_member->name); + free(enum_member); + enum_member = em; + } + + /* Take this type out of the list. */ + if(*list == type) + *list = type->next; + else + type->prev->next = type->next; + + if(type->next) + type->next->prev = type->prev; + + /* Nc_Free the memory. */ + free(type); + + return NC_NOERR; +} + +/* Delete a del from a var list, and nc_free the memory. */ +int +nc4_dim_list_del(NC_DIM_INFO_T **list, NC_DIM_INFO_T *dim) +{ + /* Take this dimension out of the list. */ + if(*list == dim) + *list = dim->next; + else + dim->prev->next = dim->next; + + if(dim->next) + dim->next->prev = dim->prev; + + /* Free memory allocated for names. */ + if (dim->name) + free(dim->name); + if (dim->old_name) + free(dim->old_name); + + free(dim); + return NC_NOERR; +} + +/* Remove a NC_GRP_INFO_T from the linked list. This will nc_free the + memory too. */ +static void +grp_list_del(NC_GRP_INFO_T **list, NC_GRP_INFO_T *grp) +{ + if(*list == grp) + *list = grp->next; + else + grp->prev->next = grp->next; + + if(grp->next) + grp->next->prev = grp->prev; + + free(grp); +} + +/* Recursively delete the data for a group (and everything it + * contains) in our internal metadata store. */ +int +nc4_rec_grp_del(NC_GRP_INFO_T **list, NC_GRP_INFO_T *grp) +{ + NC_GRP_INFO_T *g, *c; + NC_VAR_INFO_T *v, *var; + NC_ATT_INFO_T *a, *att; + NC_DIM_INFO_T *d, *dim; + NC_TYPE_INFO_T *type, *t; + int retval; + + assert(grp); + LOG((3, "nc4_rec_grp_del: grp->name %s", grp->name)); + + /* Recursively call this function for each child, if any, stopping + * if there is an error. */ + g = grp->children; + while(g) + { + c = g->next; + if ((retval = nc4_rec_grp_del(&(grp->children), g))) + return retval; + g = c; + } + + /* Delete all the list contents for vars, dims, and atts, in each + * group. */ + att = grp->att; + while (att) + { + LOG((4, "nc4_rec_grp_del: deleting att %s", att->name)); + a = att->next; + if ((retval = nc4_att_list_del(&grp->att, att))) + return retval; + att = a; + } + + /* Delete all vars. */ + var = grp->var; + while (var) + { + LOG((4, "nc4_rec_grp_del: deleting var %s", var->name)); + /* Close HDF5 dataset associated with this var, unless it's a + * scale. */ + if (var->hdf_datasetid && !var->dimscale && + H5Dclose(var->hdf_datasetid) < 0) + return NC_EHDFERR; + v = var->next; + if ((retval = var_list_del(&grp->var, var))) + return retval; + var = v; + } + + /* Delete all dims. */ + dim = grp->dim; + while (dim) + { + LOG((4, "nc4_rec_grp_del: deleting dim %s", dim->name)); + /* Close HDF5 dataset associated with this dim. */ + if (dim->hdf_dimscaleid && H5Dclose(dim->hdf_dimscaleid) < 0) + return NC_EHDFERR; + d = dim->next; + if ((retval = nc4_dim_list_del(&grp->dim, dim))) + return retval; + dim = d; + } + + /* Delete all types. */ + type = grp->type; + while (type) + { + LOG((4, "nc4_rec_grp_del: deleting type %s", type->name)); + t = type->next; + if ((retval = type_list_del(&grp->type, type))) + return retval; + type = t; + } + + /* Tell HDF5 we're closing this group. */ + LOG((4, "nc4_rec_grp_del: closing group %s", grp->name)); + if (grp->hdf_grpid && H5Gclose(grp->hdf_grpid) < 0) + return NC_EHDFERR; + + /* Free the name. */ + free(grp->name); + + /* Finally, redirect pointers around this entry in the list, and + * nc_free its memory. */ + grp_list_del(list, grp); + + return NC_NOERR; +} + +/* Remove a NC_ATT_INFO_T from the linked list. This will nc_free the + memory too. +*/ +int +nc4_att_list_del(NC_ATT_INFO_T **list, NC_ATT_INFO_T *att) +{ + int i; + + /* Take this att out of the list. */ + if(*list == att) + *list = att->next; + else + att->prev->next = att->next; + + if(att->next) + att->next->prev = att->prev; + + /* Free memory that was malloced to hold data for this + * attribute. */ + if (att->data) + free(att->data); + + /* Free the name. */ + if (att->name) + free(att->name); + + /* Close the HDF5 typeid. */ + if (att->native_typeid && H5Tclose(att->native_typeid) < 0) + return NC_EHDFERR; + + /* If this is a string array attribute, delete all members of the + * string array, then delete the array of pointers to strings. (The + * array was filled with pointers by HDF5 when the att was read, + * and memory for each string was allocated by HDF5. That's why I + * use free and not nc_free, because the netCDF library didn't + * allocate the memory that is being freed.) */ + if (att->stdata) + { + for (i = 0; i < att->len; i++) + free(att->stdata[i]); + free(att->stdata); + } + + /* If this att has vlen data, release it. */ + if (att->vldata) + { + for (i = 0; i < att->len; i++) + nc_free_vlen(&att->vldata[i]); + free(att->vldata); + } + + free(att); + return NC_NOERR; +} + +/* Normalize a UTF8 name. Put the result in norm_name, which can be + * NC_MAX_NAME + 1 in size. This function makes sure the free() gets + * called on the return from utf8proc_NFC, and also ensures that the + * name is not too long. */ +int +nc4_normalize_name(const char *name, char *norm_name) +{ + char *temp_name; + if (!(temp_name = (char *)utf8proc_NFC((const unsigned char *)name))) + return NC_EINVAL; + if (strlen(temp_name) > NC_MAX_NAME) + { + free(temp_name); + return NC_EMAXNAME; + } + strcpy(norm_name, temp_name); + free(temp_name); + return NC_NOERR; +} + +/* Print out a bunch of info to stderr about the metadata for + debugging purposes. */ +#ifdef LOGGING +/* Use this to set the global log level. Set it to NC_TURN_OFF_LOGGING + (-1) to turn off all logging. Set it to 0 to show only errors, and + to higher numbers to show more and more logging details. */ +int +nc_set_log_level(int new_level) +{ + /* If the user wants to completely turn off logging, turn off HDF5 + logging too. Now I truely can't think of what to do if this + fails, so just ignore the return code. */ + if (new_level == NC_TURN_OFF_LOGGING) + { + H5Eset_auto(NULL, NULL); + LOG((1, "HDF5 error messages turned off!")); + } + + /* Do we need to turn HDF5 logging back on? */ + if (new_level > NC_TURN_OFF_LOGGING && + nc_log_level <= NC_TURN_OFF_LOGGING) + { + if (H5Eset_auto((H5E_auto_t)&H5Eprint, stderr) < 0) + LOG((0, "H5Eset_auto failed!")); + LOG((1, "HDF5 error messages turned on.")); + } + + /* Now remember the new level. */ + nc_log_level = new_level; + LOG((4, "log_level changed to %d", nc_log_level)); + return 0; +} + +/* Recursively print the metadata of a group. */ +#define MAX_NESTS 10 +static int +rec_print_metadata(NC_GRP_INFO_T *grp, int *tab_count) +{ + NC_GRP_INFO_T *g; + NC_ATT_INFO_T *att; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + NC_TYPE_INFO_T *type; + NC_FIELD_INFO_T *field; + char tabs[MAX_NESTS] = ""; + char dims_string[NC_MAX_DIMS*4]; + char temp_string[10]; + int t, retval, d; + + /* Come up with a number of tabs relative to the group. */ + for (t = 0; t < *tab_count && t < MAX_NESTS; t++) + strcat(tabs, "\t"); + + LOG((2, "%s GROUP - %s nc_grpid: %d nvars: %d natts: %d", + tabs, grp->name, grp->nc_grpid, grp->nvars, grp->natts)); + + for(att = grp->att; att; att = att->next) + LOG((2, "%s GROUP ATTRIBUTE - attnum: %d name: %s type: %d len: %d", + tabs, att->attnum, att->name, att->xtype, att->len)); + + /* To display dims starting with 0 and going up, go through list is + * reverse order. */ + for(dim = grp->dim; dim && dim->next; dim = dim->next) + ; + for( ; dim; dim = dim->prev) + LOG((2, "%s DIMENSION - dimid: %d name: %s len: %d unlimited: %d", + tabs, dim->dimid, dim->name, dim->len, dim->unlimited)); + + /* To display vars starting with 0 and going up, go through list is + * reverse order. */ + for(var = grp->var; var && var->next; var = var->next) + ; + for( ; var; var = var->prev) + { + strcpy(dims_string, ""); + for (d = 0; d < var->ndims; d++) + { + sprintf(temp_string, " %d", var->dimids[d]); + strcat(dims_string, temp_string); + } + LOG((2, "%s VARIABLE - varid: %d name: %s type: %d ndims: %d dimscale: %d dimids:%s", + tabs, var->varid, var->name, var->xtype, var->ndims, var->dimscale, + dims_string)); + for(att = var->att; att; att = att->next) + LOG((2, "%s VAR ATTRIBUTE - attnum: %d name: %s type: %d len: %d", + tabs, att->attnum, att->name, att->xtype, att->len)); + } + + for (type = grp->type; type; type = type->next) + { + LOG((2, "%s TYPE - nc_typeid: %d hdf_typeid: 0x%x size: %d committed: %d " + "name: %s num_fields: %d base_nc_type: %d", tabs, type->nc_typeid, + type->hdf_typeid, type->size, type->committed, type->name, + type->num_fields, type->base_nc_type)); + /* Is this a compound type? */ + if (type->class == NC_COMPOUND) + { + LOG((3, "compound type")); + for (field = type->field; field; field = field->next) + LOG((4, "field %s offset %d nctype %d ndims %d", field->name, + field->offset, field->nctype, field->ndims)); + } + else if (type->class == NC_VLEN) + LOG((3, "VLEN type")); + else if (type->class == NC_OPAQUE) + LOG((3, "Opaque type")); + else if (type->class == NC_ENUM) + LOG((3, "Enum type")); + else + { + LOG((0, "Unknown class: %d", type->class)); + return NC_EBADTYPE; + } + } + + /* Call self for each child of this group. */ + if (grp->children) + { + (*tab_count)++; + for (g = grp->children; g; g = g->next) + if ((retval = rec_print_metadata(g, tab_count))) + return retval; + (*tab_count)--; + } + + return NC_NOERR; +} + +/* Print out the internal metadata for a file. This is useful to check + * that netCDF is working! Nonetheless, this function will print + * nothing if logging is not set to at least two. */ +int +log_metadata_nc(NC_FILE_INFO_T *nc) +{ + NC_HDF5_FILE_INFO_T *h5 = nc->nc4_info; + int tab_count = 0; + + LOG((2, "*** NetCDF-4 Internal Metadata: int_ncid 0x%x ext_ncid 0x%x", + nc->int_ncid, nc->ext_ncid)); + if (!h5) + { + LOG((2, "This is a netCDF-3 file.")); + return NC_NOERR; + } + LOG((2, "FILE - hdfid: 0x%x path: %s cmode: 0x%x parallel: %d redef: %d " + "fill_mode: %d no_write: %d next_nc_grpid: %d", h5->hdfid, h5->path, + h5->cmode, h5->parallel, h5->redef, h5->fill_mode, h5->no_write, + h5->next_nc_grpid)); + return rec_print_metadata(h5->root_grp, &tab_count); +} + +#endif /*LOGGING */ + +/* Show the in-memory metadata for a netcdf file. */ +int +NC4_show_metadata(int ncid) +{ + int retval = NC_NOERR; +#ifdef LOGGING + NC_FILE_INFO_T *nc; + int old_log_level = nc_log_level; + + /* Find file metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + + /* Log level must be 2 to see metadata. */ + nc_log_level = 2; + retval = log_metadata_nc(nc); + nc_log_level = old_log_level; +#endif /*LOGGING*/ + return retval; +} + diff --git a/extern/src_netcdf4/nc4internal.h b/extern/src_netcdf4/nc4internal.h new file mode 100644 index 0000000..3e6cc83 --- /dev/null +++ b/extern/src_netcdf4/nc4internal.h @@ -0,0 +1,425 @@ +/** \file + This header file contains the definitions of structs used to hold + netCDF file metadata in memory. + + Copyright 2005-2011 University Corporation for Atmospheric + Research/Unidata. +*/ + +#ifndef _NC4INTERNAL_ +#define _NC4INTERNAL_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_PARALLEL +#include +#else +#define MPI_Info int +#define MPI_Comm int +#include +#endif /* USE_PARALLEL */ +#include + +#ifdef USE_HDF4 +#include +#endif + +#define FILE_ID_MASK (0xffff0000) +#define GRP_ID_MASK (0x0000ffff) +#define ID_SHIFT (16) + +typedef enum {GET, PUT} NC_PG_T; +typedef enum {VAR, DIM, ATT} NC_OBJ_T; + +#define NC_MAX_HDF5_NAME (NC_MAX_NAME + 10) +#define NC_V2_ERR (-1) + +/* The name of the root group. */ +#define NC_GROUP_NAME "/" + +#define MEGABYTE 1048576 + +/* + * limits of the external representation + */ +#define X_SCHAR_MIN (-128) +#define X_SCHAR_MAX 127 +#define X_UCHAR_MAX 255U +#define X_SHORT_MIN (-32768) +#define X_SHRT_MIN X_SHORT_MIN /* alias compatible with limits.h */ +#define X_SHORT_MAX 32767 +#define X_SHRT_MAX X_SHORT_MAX /* alias compatible with limits.h */ +#define X_USHORT_MAX 65535U +#define X_USHRT_MAX X_USHORT_MAX /* alias compatible with limits.h */ +#define X_INT_MIN (-2147483647-1) +#define X_INT_MAX 2147483647 +#define X_LONG_MIN X_INT_MIN +#define X_LONG_MAX X_INT_MAX +#define X_UINT_MAX 4294967295U +#ifdef WIN32 /* Windows, of course, has to be a *little* different. */ +#define X_FLOAT_MAX 3.402823466e+38f +#else +#define X_FLOAT_MAX 3.40282347e+38f +#endif /* WIN32 */ +#define X_FLOAT_MIN (-X_FLOAT_MAX) +#define X_DOUBLE_MAX 1.7976931348623157e+308 +#define X_DOUBLE_MIN (-X_DOUBLE_MAX) + +/* These have to do with creating chuncked datasets in HDF5. */ +#define NC_HDF5_UNLIMITED_DIMSIZE (0) +#define NC_HDF5_CHUNKSIZE_FACTOR (10) +#define NC_HDF5_MIN_CHUNK_SIZE (2) + +#define NC_EMPTY_SCALE "NC_EMPTY_SCALE" + +/* This is an attribute I had to add to handle multidimensional + * coordinate variables. */ +#define COORDINATES "_Netcdf4Coordinates" +#define COORDINATES_LEN (NC_MAX_NAME * 5) + +/* This is used when the user defines a non-coordinate variable with + * same name as a dimension. */ +#define NON_COORD_PREPEND "_nc4_non_coord_" + +/* An attribute in the HDF5 root group of this name means that the + * file must follow strict netCDF classic format rules. */ +#define NC3_STRICT_ATT_NAME "_nc3_strict" + +/* If this attribute is present on a dimscale variable, use the value + * as the netCDF dimid. */ +#define NC_DIMID_ATT_NAME "_Netcdf4Dimid" + +/* This is a struct to handle the dim metadata. */ +typedef struct NC_DIM_INFO +{ + char *name; + size_t len; + int dimid; + int unlimited; + int extended; + struct NC_DIM_INFO *next; + struct NC_DIM_INFO *prev; + hid_t hdf_dimscaleid; + char *old_name; /* only used to rename dim */ + int dirty; + unsigned char coord_var_in_grp; + struct NC_VAR_INFO *coord_var; /* The coord var, if it exists. */ + int too_long; /* True if len it too big to fit in local size_t. */ +} NC_DIM_INFO_T; + +typedef struct NC_ATT_INFO +{ + int len; + char *name; + struct NC_ATT_INFO *next; + struct NC_ATT_INFO *prev; + int dirty; + int created; + nc_type xtype; + hid_t native_typeid; + int attnum; + void *data; + nc_vlen_t *vldata; /* only used for vlen */ + char **stdata; /* only for string type. */ + int class; +} NC_ATT_INFO_T; + +/* This is a struct to handle the var metadata. */ +typedef struct NC_VAR_INFO +{ + char *name; + char *hdf5_name; /* used if different from name */ + int ndims; + int *dimids; + NC_DIM_INFO_T **dim; + int varid; + int natts; + struct NC_VAR_INFO *next; + struct NC_VAR_INFO *prev; + int dirty; + int created; + int written_to; + int *dimscale_attached; + struct NC_TYPE_INFO *type_info; + nc_type xtype; + hid_t hdf_datasetid; + NC_ATT_INFO_T *att; + int no_fill; + void *fill_value; + size_t *chunksizes; + int contiguous; + int parallel_access; + int dimscale; + HDF5_OBJID_T *dimscale_hdf5_objids; + int deflate; + int deflate_level; + int shuffle; + int fletcher32; + int options_mask; + int pixels_per_block; + size_t chunk_cache_size, chunk_cache_nelems; + float chunk_cache_preemption; + /* Stuff below is for hdf4 files. */ + int sdsid; + int hdf4_data_type; + /* Stuff below for diskless data files. */ + void *diskless_data; +} NC_VAR_INFO_T; + +typedef struct NC_FIELD_INFO +{ + struct NC_FIELD_INFO *next; + struct NC_FIELD_INFO *prev; + nc_type nctype; + hid_t hdf_typeid; + hid_t native_typeid; + size_t offset; + char *name; + int fieldid; + int ndims; + int *dim_size; +} NC_FIELD_INFO_T; + +typedef struct NC_ENUM_MEMBER_INFO +{ + struct NC_ENUM_MEMBER_INFO *next; + struct NC_ENUM_MEMBER_INFO *prev; + char *name; + void *value; +} NC_ENUM_MEMBER_INFO_T; + +typedef struct NC_TYPE_INFO +{ + struct NC_TYPE_INFO *next; + struct NC_TYPE_INFO *prev; + nc_type nc_typeid; + hid_t hdf_typeid; + hid_t native_typeid; + size_t size; + int committed; /* What the pig is, but the hen isn't, at breakfast. */ + char *name; + int class; /* NC_VLEN, NC_COMPOUND, NC_OPAQUE, or NC_ENUM */ + int num_enum_members; + NC_ENUM_MEMBER_INFO_T *enum_member; + NC_FIELD_INFO_T *field; /* Used for compound types. */ + int num_fields; + nc_type base_nc_type; /* for VLEN and ENUM only */ + hid_t base_hdf_typeid; /* for VLEN only */ + int close_hdf_typeid; /* True when hdf_typeid must be H5Tclosed. */ + int endianness; +} NC_TYPE_INFO_T; + +/* This holds information for one group. Groups reproduce with + * parthenogenesis. */ +typedef struct NC_GRP_INFO +{ + int nc_grpid; + struct NC_GRP_INFO *parent; + struct NC_GRP_INFO *children; + struct NC_GRP_INFO *next; /* points to siblings */ + struct NC_GRP_INFO *prev; /* points to siblings */ + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + NC_ATT_INFO_T *att; + int nvars; + int ndims; + int natts; + struct NC_FILE_INFO *file; + char *name; + hid_t hdf_grpid; + NC_TYPE_INFO_T *type; +} NC_GRP_INFO_T; + +/* These constants apply to the cmode parameter in the + * HDF5_FILE_INFO_T defined below. */ +#define NC_CREAT 2 /* in create phase, cleared by ncendef */ +#define NC_INDEF 8 /* in define mode, cleared by ncendef */ +#define NC_NSYNC 0x10 /* synchronise numrecs on change */ +#define NC_HSYNC 0x20 /* synchronise whole header on change */ +#define NC_NDIRTY 0x40 /* numrecs has changed */ +#define NC_HDIRTY 0x80 /* header info has changed */ + +/* This is the metadata we need to keep track of for each + netcdf-4/HDF5 file. */ +typedef struct +{ + hid_t hdfid; + int flags; + int cmode; + int nvars; + int ndims; + int natts; + int parallel; /* true if file is open for parallel access */ + int redef; + char *path; + int fill_mode; + int no_write; /* true if nc_open has mode NC_NOWRITE. */ + NC_GRP_INFO_T *root_grp; + short next_nc_grpid; + NC_TYPE_INFO_T *type; + int next_typeid; + int next_dimid; + int ignore_creationorder; + int hdf4; + int sdid; +} NC_HDF5_FILE_INFO_T; + +/* In the nc_file array there will be one entry for each open file.*/ + + /* There's an external ncid (ext_ncid) and an internal ncid + * (int_ncid). The ext_ncid is the ncid returned to the user. If + * the user has opened or created a netcdf-4 file, then the + * ext_ncid is the same as the int_ncid. If he has opened or + * created a netcdf-3 file ext_ncid (which the user sees) is + * different from the int_ncid, which is the ncid returned by the + * netcdf-3 layer, which insists on inventing its own ncids, + * regardless of what is already in use due to previously opened + * netcdf-4 files. The ext_ncid contains the ncid for the root + * group (i.e. group zero). */ + +/* Warning: fields from BEGIN COMMON to END COMMON must be same for: + 1. NCcommon (include/ncdispatch.h) + 2. NC (libsrc/nc.h) + 3. NC_FILE_INFO (libsrc4/nc4internal.h) + 4. whatever libdiskless uses +*/ +typedef struct NC_FILE_INFO +{ +/*BEGIN COMMON*/ + int ext_ncid; + int int_ncid; + struct NC_Dispatch* dispatch; + void* dispatchdata; + char* path; + int substrate; +/*END COMMON*/ + +#ifdef USE_PNETCDF + /* pnetcdf_file will be true if the file is created/opened with the + * parallel-netcdf library. pnetcdf_access_mode keeps track of + * whether independpent or collective mode is + * desired. pnetcdf_ndims keeps track of how many dims each var + * has, which I need to know to convert start, count, and stride + * arrays from size_t to MPI_Offset. (I can't use an inq function + * to find out the number of dims, because these are collective in + * pnetcdf.) */ + int pnetcdf_file; + int pnetcdf_access_mode; + int pnetcdf_ndims[NC_MAX_VARS]; +#endif /* USE_PNETCDF */ + + /* The nc4_info pointer will remain NULL for netcdf3 files, + * otherwise it points to information about the netcdf-4 file. */ + NC_HDF5_FILE_INFO_T *nc4_info; +} NC_FILE_INFO_T; + +/* These functions only use the netcdf API calls, so they will work on + both new format and old format files. */ +/*int copy_dataset(int ncid_in, int ncid_out);*/ + + +/* These functions convert beteen netcdf and HDF5 types. */ +int nc4_get_typelen_mem(NC_HDF5_FILE_INFO_T *h5, nc_type xtype, + int is_long, size_t *len); +int nc4_convert_type(const void *src, void *dest, + const nc_type src_type, const nc_type dest_type, + const size_t len, int *range_error, + const void *fill_value, int strict_nc3, int src_long, + int dest_long); + +/* These functions do HDF5 things. */ +int nc4_open_var_grp2(NC_GRP_INFO_T *grp, int varid, hid_t *dataset); +int pg_var(NC_PG_T pg, NC_FILE_INFO_T *nc, int ncid, int varid, nc_type xtype, int is_long, + void *ip); +int nc4_pg_var1(NC_PG_T pg, NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *indexp, + nc_type xtype, int is_long, void *ip); +int nc4_put_vara(NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *startp, + const size_t *countp, nc_type xtype, int is_long, void *op); +int nc4_get_vara(NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *startp, + const size_t *countp, nc_type xtype, int is_long, void *op); +int nc4_pg_varm(NC_PG_T pg, NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, nc_type xtype, int is_long, void *op); +int nc4_rec_match_dimscales(NC_GRP_INFO_T *grp); +int nc4_rec_write_metadata(NC_GRP_INFO_T *grp); +int nc4_rec_write_types(NC_GRP_INFO_T *grp); +int nc4_enddef_netcdf4_file(NC_HDF5_FILE_INFO_T *h5); +int nc4_reopen_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var); +int nc4_adjust_var_cache(NC_GRP_INFO_T *grp, NC_VAR_INFO_T * var); + +/* The following functions manipulate the in-memory linked list of + metadata, without using HDF calls. */ +int nc4_find_nc_grp_h5(int ncid, NC_FILE_INFO_T **nc, NC_GRP_INFO_T **grp, + NC_HDF5_FILE_INFO_T **h5); +int nc4_find_grp_h5(int ncid, NC_GRP_INFO_T **grp, NC_HDF5_FILE_INFO_T **h5); +int nc4_find_nc4_grp(int ncid, NC_GRP_INFO_T **grp); +NC_GRP_INFO_T *nc4_find_nc_grp(int ncid); +NC_GRP_INFO_T *nc4_rec_find_grp(NC_GRP_INFO_T *start_grp, int target_nc_grpid); +NC_FILE_INFO_T *nc4_find_nc_file(int ncid); +int nc4_find_dim(NC_GRP_INFO_T *grp, int dimid, NC_DIM_INFO_T **dim, NC_GRP_INFO_T **dim_grp); +int nc4_find_dim_len(NC_GRP_INFO_T *grp, int dimid, size_t **len); +int nc4_find_type(NC_HDF5_FILE_INFO_T *h5, int typeid, NC_TYPE_INFO_T **type); +NC_TYPE_INFO_T *nc4_rec_find_nc_type(NC_GRP_INFO_T *start_grp, hid_t target_nc_typeid); +NC_TYPE_INFO_T *nc4_rec_find_hdf_type(NC_GRP_INFO_T *start_grp, hid_t target_hdf_typeid); +NC_TYPE_INFO_T *nc4_rec_find_named_type(NC_GRP_INFO_T *start_grp, char *name); +NC_TYPE_INFO_T *nc4_rec_find_equal_type(NC_GRP_INFO_T *start_grp, int ncid1, NC_TYPE_INFO_T *type); +int nc4_find_nc_att(int ncid, int varid, const char *name, int attnum, + NC_ATT_INFO_T **att); +int nc4_find_g_var_nc(NC_FILE_INFO_T *nc, int ncid, int varid, + NC_GRP_INFO_T **grp, NC_VAR_INFO_T **var); +int nc4_find_grp_att(NC_GRP_INFO_T *grp, int varid, const char *name, int attnum, + NC_ATT_INFO_T **att); +int nc4_get_hdf_typeid(NC_HDF5_FILE_INFO_T *h5, nc_type xtype, + hid_t *hdf_typeid, int endianness); +/*int var_info_nc(NC_PG_T pg, hid_t dataset, NC_VAR_INFO_T *var_info);*/ + +/* These list functions add and delete vars, atts, and files. */ +int nc4_file_list_add(NC_FILE_INFO_T**, struct NC_Dispatch*); +void nc4_file_list_free(void); + +int nc4_nc4f_list_add(NC_FILE_INFO_T *nc, const char *path, int mode); +int nc4_var_list_add(NC_VAR_INFO_T **list, NC_VAR_INFO_T **var); +int nc4_dim_list_add(NC_DIM_INFO_T **list); +int nc4_dim_list_del(NC_DIM_INFO_T **list, NC_DIM_INFO_T *dim); +int nc4_att_list_add(NC_ATT_INFO_T **list); +int nc4_type_list_add(NC_TYPE_INFO_T **list, NC_TYPE_INFO_T **new_type); +int nc4_field_list_add(NC_FIELD_INFO_T **list, int fieldid, const char *name, + size_t offset, hid_t field_hdf_typeid, hid_t native_typeid, + nc_type xtype, int ndims, const int *dim_sizesp); +void nc4_file_list_del(NC_FILE_INFO_T *nc); +int nc4_att_list_del(NC_ATT_INFO_T **list, NC_ATT_INFO_T *att); +int nc4_grp_list_add(NC_GRP_INFO_T **list, int new_nc_grpid, NC_GRP_INFO_T *parent_grp, + NC_FILE_INFO_T *nc, char *name, NC_GRP_INFO_T **grp); +int nc4_rec_grp_del(NC_GRP_INFO_T **list, NC_GRP_INFO_T *grp); +int nc4_enum_member_add(NC_ENUM_MEMBER_INFO_T **list, size_t size, + const char *name, const void *value); + +int NC_check_name(const char *name); + +/* Check and normalize names. */ +int nc4_check_name(const char *name, char *norm_name); +int nc4_normalize_name(const char *name, char *norm_name); + +/* Check for name collisions. */ +int nc4_check_dup_name(NC_GRP_INFO_T *grp, char *norm_name); + +/* Insert and read one element into an already allocated vlen array + * element (this is for F77). */ +/*int nc_put_vlen_element(int ncid, int typeid, void *vlen_element, size_t len, const void *data); + int nc_get_vlen_element(int ncid, int typeid, const void *vlen_element, size_t *len, void *data);*/ + +/* This is only included if --enable-logging is used for configure; it + prints info about the metadata to stderr. */ +#ifdef LOGGING +int log_metadata_nc(NC_FILE_INFO_T *nc); +#endif + +#endif /* _NETCDF4_ */ diff --git a/extern/src_netcdf4/nc4type.c b/extern/src_netcdf4/nc4type.c new file mode 100644 index 0000000..d57a5aa --- /dev/null +++ b/extern/src_netcdf4/nc4type.c @@ -0,0 +1,741 @@ +/* + +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file handles the nc4 user-defined type functions (i.e. compound +and opaque types). + +Copyright 2005, University Corporation for Atmospheric Research. See +the COPYRIGHT file for copying and redistribution conditions. + +$Id: nc4type.c,v 1.73 2010/05/25 17:54:24 dmh Exp $ +*/ + +#include "nc4internal.h" + +#define NUM_ATOMIC_TYPES 13 +char atomic_name[NUM_ATOMIC_TYPES][NC_MAX_NAME + 1] = {"none", "byte", "char", + "short", "int", "float", + "double", "ubyte", + "ushort", "uint", + "int64", "uint64", "string"}; + +EXTERNL int +NC4_inq_type_equal(int ncid1, nc_type typeid1, int ncid2, + nc_type typeid2, int *equalp) +{ + NC_GRP_INFO_T *grp1, *grp2; + NC_TYPE_INFO_T *type1, *type2; + int retval; + + LOG((2, "nc_inq_type_equal: ncid1 0x%x typeid1 %d ncid2 0x%x typeid2 %d", + ncid1, typeid1, ncid2, typeid2)); + + /* Check input. */ + if(equalp == NULL) return NC_NOERR; + + if (typeid1 <= NC_NAT || typeid2 <= NC_NAT) + return NC_EINVAL; + + /* If one is atomic, and the other user-defined, the types are not + * equal. */ + if ((typeid1 <= NC_STRING && typeid2 > NC_STRING) || + (typeid2 <= NC_STRING && typeid1 > NC_STRING)) + { + if (equalp) *equalp = 0; + return NC_NOERR; + } + + /* If both are atomic types, the answer is easy. */ + if (typeid1 <= NUM_ATOMIC_TYPES) + { + if (equalp) + { + if (typeid1 == typeid2) + *equalp = 1; + else + *equalp = 0; + } + return NC_NOERR; + } + + /* Not atomic types - so find type1 and type2 information. */ + if ((retval = nc4_find_nc4_grp(ncid1, &grp1))) + return retval; + if (!(type1 = nc4_rec_find_nc_type(grp1->file->nc4_info->root_grp, + typeid1))) + return NC_EBADTYPE; + if ((retval = nc4_find_nc4_grp(ncid2, &grp2))) + return retval; + if (!(type2 = nc4_rec_find_nc_type(grp2->file->nc4_info->root_grp, + typeid2))) + return NC_EBADTYPE; + + /* Are the two types equal? */ + if (equalp) + *equalp = (int)H5Tequal(type1->native_typeid, type2->native_typeid); + + return NC_NOERR; +} + +/* Get the id of a type from the name. */ +EXTERNL int +NC4_inq_typeid(int ncid, const char *name, nc_type *typeidp) +{ + NC_GRP_INFO_T *grp, *grp2; + NC_HDF5_FILE_INFO_T *h5; + NC_TYPE_INFO_T *type = NULL; + char *norm_name; + int i, retval; + + for (i = 0; i < NUM_ATOMIC_TYPES; i++) + if (!strcmp(name, atomic_name[i])) + { + if (typeidp) + *typeidp = i; + return NC_NOERR; + } + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + /* Must be a netCDF-4 file. */ + if (!h5) + return NC_ENOTNC4; + + /* If the first char is a /, this is a fully-qualified + * name. Otherwise, this had better be a local name (i.e. no / in + * the middle). */ + if (name[0] != '/' && strstr(name, "/")) + return NC_EINVAL; + + /* Normalize name. */ + if (!(norm_name = malloc(strlen(name) + 1))) + return NC_ENOMEM; + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + + /* Is the type in this group? If not, search parents. */ + for (grp2 = grp; grp2; grp2 = grp2->parent) + for (type = grp2->type; type; type = type->next) + if (!strcmp(norm_name, type->name)) + { + if (typeidp) + *typeidp = type->nc_typeid; + break; + } + + /* Still didn't find type? Search file recursively, starting at the + * root group. */ + if (!type) + if ((type = nc4_rec_find_named_type(grp->file->nc4_info->root_grp, norm_name))) + if (typeidp) + *typeidp = type->nc_typeid; + + free(norm_name); + + /* OK, I give up already! */ + if (!type) + return NC_EBADTYPE; + + return NC_NOERR; +} + +/* Find all user-defined types for a location. This finds all + * user-defined types in a group. */ +int +NC4_inq_typeids(int ncid, int *ntypes, int *typeids) +{ + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_TYPE_INFO_T *type; + int num = 0; + int retval; + + LOG((2, "nc_inq_typeids: ncid 0x%x", ncid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + /* If this is a netCDF-4 file, count types. */ + if (h5 && grp->type) + for (type = grp->type; type; type = type->next) + { + if (typeids) + typeids[num] = type->nc_typeid; + num++; + } + + /* Give the count to the user. */ + if (ntypes) + *ntypes = num; + + return NC_NOERR; +} + + +/* This internal function adds a new user defined type to the metadata + * of a group of an open file. */ +static int +add_user_type(int ncid, size_t size, const char *name, nc_type base_typeid, + nc_type type_class, nc_type *typeidp) +{ + NC_HDF5_FILE_INFO_T *h5; + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + LOG((2, "add_user_type: ncid 0x%x size %d name %s base_typeid %d ", + ncid, size, norm_name, base_typeid)); + + /* Find group metadata. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + + /* Only netcdf-4 files! */ + if (!h5) + return NC_ENOTNC4; + + /* Turn on define mode if it is not on. */ + if (!(h5->cmode & NC_INDEF)) + if ((retval = nc_redef(ncid))) + return retval; + + /* No size is provided for vlens or enums, get it from the base type. */ + if (type_class == NC_VLEN || type_class == NC_ENUM) + { + if ((retval = nc4_get_typelen_mem(grp->file->nc4_info, base_typeid, 0, + &size))) + return retval; + } + else if (size <= 0) + return NC_EINVAL; + + /* Check that this name is not in use as a var, grp, or type. */ + if ((retval = nc4_check_dup_name(grp, norm_name))) + return retval; + + /* Add to our list of types. */ + if ((retval = nc4_type_list_add(&(grp->type), &type))) + return retval; + + /* Remember info about this type. */ + type->nc_typeid = grp->file->nc4_info->next_typeid++; + type->size = size; + if (!(type->name = malloc((strlen(norm_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(type->name, norm_name); + type->class = type_class; + type->base_nc_type = base_typeid; + + /* Return the typeid to the user. */ + if (typeidp) + *typeidp = type->nc_typeid; + + return NC_NOERR; +} + + +/* The sizes of types may vary from platform to platform, but within + * netCDF files, type sizes are fixed. */ +#define NC_CHAR_LEN sizeof(char) +#define NC_STRING_LEN sizeof(char *) +#define NC_BYTE_LEN 1 +#define NC_SHORT_LEN 2 +#define NC_INT_LEN 4 +#define NC_FLOAT_LEN 4 +#define NC_DOUBLE_LEN 8 +#define NC_INT64_LEN 8 + +/* Get the name and size of a type. For strings, 1 is returned. For + * VLEN the base type len is returned. */ +int +NC4_inq_type(int ncid, nc_type typeid, char *name, size_t *size) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + int atomic_size[NUM_ATOMIC_TYPES] = {0, NC_BYTE_LEN, NC_CHAR_LEN, NC_SHORT_LEN, + NC_INT_LEN, NC_FLOAT_LEN, NC_DOUBLE_LEN, + NC_BYTE_LEN, NC_SHORT_LEN, NC_INT_LEN, NC_INT64_LEN, + NC_INT64_LEN, NC_STRING_LEN}; + + int retval; + + LOG((2, "nc_inq_type: ncid 0x%x typeid %d", ncid, typeid)); + + /* If this is an atomic type, the answer is easy. */ + if (typeid <= NUM_ATOMIC_TYPES) + { + if (name) + strcpy(name, atomic_name[typeid]); + if (size) + *size = atomic_size[typeid]; + return NC_NOERR; + } + + /* Not an atomic type - so find group. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find this type. */ + if (!(type = nc4_rec_find_nc_type(grp->file->nc4_info->root_grp, typeid))) + return NC_EBADTYPE; + + if (name) + strcpy(name, type->name); + + if (size) + { + if (type->class != NC_VLEN) + *size = type->size; + else + *size = sizeof(nc_vlen_t); + } + + return NC_NOERR; +} + +/* Create a compound type. */ +int +NC4_def_compound(int ncid, size_t size, const char *name, nc_type *typeidp) +{ + return add_user_type(ncid, size, name, 0, NC_COMPOUND, typeidp); +} + +/* Insert a named field into a compound type. */ +int +NC4_insert_compound(int ncid, nc_type typeid, const char *name, size_t offset, + nc_type field_typeid) +{ + return nc_insert_array_compound(ncid, typeid, name, offset, + field_typeid, 0, NULL); +} + +/* Insert a named array into a compound type. */ +EXTERNL int +NC4_insert_array_compound(int ncid, int typeid, const char *name, + size_t offset, nc_type field_typeid, + int ndims, const int *dim_sizesp) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + LOG((2, "nc_insert_array_compound: ncid 0x%x, typeid %d name %s " + "offset %d field_typeid %d ndims %d", ncid, typeid, + name, offset, field_typeid, ndims)); + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + /* Find file metadata. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find type metadata. */ + if ((retval = nc4_find_type(grp->file->nc4_info, typeid, &type))) + return retval; + + /* Did the user give us a good compound type typeid? */ + if (!type || type->class != NC_COMPOUND) + return NC_EBADTYPE; + + /* If this type has already been written to the file, you can't + * change it. */ + if (type->committed) + return NC_ETYPDEFINED; + + /* Insert new field into this type's list of fields. */ + if ((retval = nc4_field_list_add(&type->field, type->num_fields, + norm_name, offset, 0, 0, field_typeid, + ndims, dim_sizesp))) + return retval; + + type->num_fields++; + + return NC_NOERR; +} + +/* Find info about any user defined type. */ +int +NC4_inq_user_type(int ncid, nc_type typeid, char *name, size_t *size, + nc_type *base_nc_typep, size_t *nfieldsp, int *classp) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + NC_FIELD_INFO_T *field; + int retval; + + LOG((2, "nc_inq_user_type: ncid 0x%x typeid %d", ncid, typeid)); + + /* Find group metadata. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find this type. */ + if (!(type = nc4_rec_find_nc_type(grp->file->nc4_info->root_grp, typeid))) + return NC_EBADTYPE; + + /* Count the number of fields. */ + if (nfieldsp) + { + *nfieldsp = 0; + if (type->class == NC_COMPOUND) + for (field = type->field; field; field = field->next) + (*nfieldsp)++; + else if (type->class == NC_ENUM) + *nfieldsp = type->num_enum_members; + } + + /* Fill in size and name info, if desired. */ + if (size) + { + if (type->class != NC_VLEN) + *size = type->size; + else + *size = sizeof(nc_vlen_t); + } + if (name) + strcpy(name, type->name); + + /* VLENS and ENUMs have a base type - that is, they type they are + * arrays of or enums of. */ + if (base_nc_typep) + *base_nc_typep = type->base_nc_type; + + /* If the user wants it, tell whether this is a compound, opaque, + * vlen, enum, or string class of type. */ + if (classp) + *classp = type->class; + + return NC_NOERR; +} + +/* Given the ncid, typeid and fieldid, get info about the field. */ +int +NC4_inq_compound_field(int ncid, nc_type typeid, int fieldid, char *name, + size_t *offsetp, nc_type *field_typeidp, int *ndimsp, + int *dim_sizesp) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + NC_FIELD_INFO_T *field; + int d, retval; + + /* Find file metadata. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find this type. */ + if (!(type = nc4_rec_find_nc_type(grp->file->nc4_info->root_grp, typeid))) + return NC_EBADTYPE; + + /* Find the field. */ + for (field = type->field; field; field = field->next) + if (field->fieldid == fieldid) + { + if (name) + strcpy(name, field->name); + if (offsetp) + *offsetp = field->offset; + if (field_typeidp) + *field_typeidp = field->nctype; + if (ndimsp) + *ndimsp = field->ndims; + if (dim_sizesp) + for (d = 0; d < field->ndims; d++) + dim_sizesp[d] = field->dim_size[d]; + return NC_NOERR; + } + + return NC_EBADFIELD; +} + +/* Find a netcdf-4 file. THis will return an error if it finds a + * netcdf-3 file, or a netcdf-4 file with strict nc3 rules. */ +static int +find_nc4_file(int ncid, NC_FILE_INFO_T **nc) +{ + + /* Find file metadata. */ + if (!((*nc) = nc4_find_nc_file(ncid))) + return NC_EBADID; + + /* Check for netcdf-3 files or netcdf-3 rules. */ + if (!(*nc)->nc4_info) + return NC_ENOTNC4; + if ((*nc)->nc4_info->cmode & NC_CLASSIC_MODEL) + return NC_ESTRICTNC3; + + return NC_NOERR; +} + +/* Given the typeid and the name, get the fieldid. */ +int +NC4_inq_compound_fieldindex(int ncid, nc_type typeid, const char *name, int *fieldidp) +{ + NC_FILE_INFO_T *nc; + NC_TYPE_INFO_T *type; + NC_FIELD_INFO_T *field; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + LOG((2, "nc_inq_compound_fieldindex: ncid 0x%x typeid %d name %s", + ncid, typeid, name)); + + /* Find file metadata. */ + if ((retval = find_nc4_file(ncid, &nc))) + return retval; + + /* Find the type. */ + if ((retval = nc4_find_type(nc->nc4_info, typeid, &type))) + return retval; + + /* Did the user give us a good compound type typeid? */ + if (!type || type->class != NC_COMPOUND) + return NC_EBADTYPE; + + /* Normalize name. */ + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + + /* Find the field with this name. */ + for (field = type->field; field; field = field->next) + if (!strcmp(field->name, norm_name)) + break; + + if (!field) + return NC_EBADFIELD; + + if (fieldidp) + *fieldidp = field->fieldid; + return NC_NOERR; +} + + +/* Opaque type. */ + +/* Create an opaque type. Provide a size and a name. */ +int +NC4_def_opaque(int ncid, size_t datum_size, const char *name, + nc_type *typeidp) +{ + return add_user_type(ncid, datum_size, name, 0, NC_OPAQUE, typeidp); +} + + +/* Define a variable length type. */ +int +NC4_def_vlen(int ncid, const char *name, nc_type base_typeid, + nc_type *typeidp) +{ + return add_user_type(ncid, 0, name, base_typeid, NC_VLEN, typeidp); +} + +/* Create an enum type. Provide a base type and a name. At the moment + * only ints are accepted as base types. */ +int +NC4_def_enum(int ncid, nc_type base_typeid, const char *name, + nc_type *typeidp) +{ + return add_user_type(ncid, 0, name, base_typeid, NC_ENUM, typeidp); +} + + +/* Get enum name from enum value. Name size will be <= NC_MAX_NAME. */ +int +NC4_inq_enum_ident(int ncid, nc_type xtype, long long value, char *identifier) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + NC_ENUM_MEMBER_INFO_T *enum_member; + long long ll_val; + int i; + int retval; + + LOG((3, "nc_inq_enum_ident: xtype %d value %d\n", xtype, value)); + + /* Find group metadata. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find this type. */ + if (!(type = nc4_rec_find_nc_type(grp->file->nc4_info->root_grp, xtype))) + return NC_EBADTYPE; + + /* Complain if they are confused about the type. */ + if (type->class != NC_ENUM) + return NC_EBADTYPE; + + /* Move to the desired enum member in the list. */ + enum_member = type->enum_member; + for (i = 0; i < type->num_enum_members; i++) + { + switch (type->base_nc_type) + { + case NC_BYTE: + ll_val = *(char *)enum_member->value; + break; + case NC_UBYTE: + ll_val = *(unsigned char *)enum_member->value; + break; + case NC_SHORT: + ll_val = *(short *)enum_member->value; + break; + case NC_USHORT: + ll_val = *(unsigned short *)enum_member->value; + break; + case NC_INT: + ll_val = *(int *)enum_member->value; + break; + case NC_UINT: + ll_val = *(unsigned int *)enum_member->value; + break; + case NC_INT64: + case NC_UINT64: + ll_val = *(long long *)enum_member->value; + break; + default: + return NC_EINVAL; + } + LOG((4, "ll_val=%d", ll_val)); + if (ll_val == value) + { + if (identifier) + strcpy(identifier, enum_member->name); + break; + } + else + enum_member = enum_member->next; + } + + /* If we didn't find it, life sucks for us. :-( */ + if (i == type->num_enum_members) + return NC_EINVAL; + + return NC_NOERR; +} + +/* Get information about an enum member: an identifier and + * value. Identifier size will be <= NC_MAX_NAME. */ +int +NC4_inq_enum_member(int ncid, nc_type typeid, int idx, char *identifier, + void *value) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + NC_ENUM_MEMBER_INFO_T *enum_member; + int i; + int retval; + + LOG((2, "nc_inq_enum_member: ncid 0x%x typeid %d", ncid, typeid)); + + /* Find group metadata. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find this type. */ + if (!(type = nc4_rec_find_nc_type(grp->file->nc4_info->root_grp, typeid))) + return NC_EBADTYPE; + + /* Complain if they are confused about the type. */ + if (type->class != NC_ENUM) + return NC_EBADTYPE; + + /* Check index. */ + if (idx >= type->num_enum_members) + return NC_EINVAL; + + /* Move to the desired enum member in the list. */ + enum_member = type->enum_member; + for (i = 0; i < idx; i++) + enum_member = enum_member->next; + + /* Give the people what they want. */ + if (identifier) + strcpy(identifier, enum_member->name); + if (value) + memcpy(value, enum_member->value, type->size); + + return NC_NOERR; +} + +/* Insert a identifierd value into an enum type. The value must fit within + * the size of the enum type, the identifier size must be <= NC_MAX_NAME. */ +int +NC4_insert_enum(int ncid, nc_type typeid, const char *identifier, + const void *value) +{ + NC_GRP_INFO_T *grp; + NC_TYPE_INFO_T *type; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + LOG((2, "nc_insert_enum: ncid 0x%x, typeid %d identifier %s value %d", ncid, + typeid, identifier, value)); + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(identifier, norm_name))) + return retval; + + /* Find file metadata. */ + if ((retval = nc4_find_nc4_grp(ncid, &grp))) + return retval; + + /* Find type metadata. */ + if ((retval = nc4_find_type(grp->file->nc4_info, typeid, &type))) + return retval; + + /* Did the user give us a good enum typeid? */ + if (!type || type->class != NC_ENUM) + return NC_EBADTYPE; + + /* If this type has already been written to the file, you can't + * change it. */ + if (type->committed) + return NC_ETYPDEFINED; + + /* Insert new field into this type's list of fields. */ + if ((retval = nc4_enum_member_add(&type->enum_member, type->size, + norm_name, value))) + return retval; + + type->num_enum_members++; + + return NC_NOERR; +} + +/* Insert one element into an already allocated vlen array element. */ +int +NC4_put_vlen_element(int ncid, int typeid, void *vlen_element, + size_t len, const void *data) +{ + nc_vlen_t *tmp = vlen_element; + tmp->len = len; + tmp->p = (void *)data; + return NC_NOERR; +} + +/* Insert one element into an already allocated vlen array element. */ +int +NC4_get_vlen_element(int ncid, int typeid, const void *vlen_element, + size_t *len, void *data) +{ + const nc_vlen_t *tmp = vlen_element; + int type_size = 4; + + *len = tmp->len; + memcpy(data, tmp->p, tmp->len * type_size); + return NC_NOERR; +} + diff --git a/extern/src_netcdf4/nc4var.c b/extern/src_netcdf4/nc4var.c new file mode 100644 index 0000000..443e96b --- /dev/null +++ b/extern/src_netcdf4/nc4var.c @@ -0,0 +1,1485 @@ +/* +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file handles the nc4 variable functions. + +Copyright 2003-2006, University Corporation for Atmospheric +Research. See COPYRIGHT file for copying and redistribution +conditions. +*/ + +#include +#include "nc4dispatch.h" +#include + +#ifdef USE_PNETCDF +#include +#endif + +/* Min and max deflate levels tolerated by HDF5. */ +#define MIN_DEFLATE_LEVEL 0 +#define MAX_DEFLATE_LEVEL 9 + +/* This is to track opened HDF5 objects to make sure they are + * closed. */ +#ifdef EXTRA_TESTS +extern int num_plists; +#endif /* EXTRA_TESTS */ + +/* One meg is the minimum buffer size. */ +#define ONE_MEG 1048576 + +/* Szip options. */ +#define NC_SZIP_EC_OPTION_MASK 4 +#define NC_SZIP_NN_OPTION_MASK 32 +#define NC_SZIP_MAX_PIXELS_PER_BLOCK 32 + +int nc4_get_default_fill_value(NC_TYPE_INFO_T *type_info, void *fill_value); + + +/* If the HDF5 dataset for this variable is open, then close it and + * reopen it, with the perhaps new settings for chunk caching. */ +int +nc4_reopen_dataset(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var) +{ + hid_t access_pid; + + if (var->hdf_datasetid) + { + if ((access_pid = H5Pcreate(H5P_DATASET_ACCESS)) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_plists++; +#endif + if (H5Pset_chunk_cache(access_pid, var->chunk_cache_nelems, + var->chunk_cache_size, + var->chunk_cache_preemption) < 0) + return NC_EHDFERR; + if (H5Dclose(var->hdf_datasetid) < 0) + return NC_EHDFERR; + if ((var->hdf_datasetid = H5Dopen2(grp->hdf_grpid, var->name, + access_pid)) < 0) + return NC_EHDFERR; + if (H5Pclose(access_pid) < 0) + return NC_EHDFERR; +#ifdef EXTRA_TESTS + num_plists--; +#endif + + if (var->dimscale) + var->dim[0]->hdf_dimscaleid = var->hdf_datasetid; + } + + return NC_NOERR; +} + +/* Set chunk cache size for a variable. */ +int +NC4_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, + float preemption) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + int retval; + + /* Check input for validity. */ + if (preemption < 0 || preemption > 1) + return NC_EINVAL; + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + + /* An attempt to do any of these things on a netCDF-3 file is + * ignored with no error. */ + if (!h5) + return NC_NOERR; + + assert(nc && grp && h5); + + /* Find the var. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + if (!var) + return NC_ENOTVAR; + + /* Set the values. */ + var->chunk_cache_size = size; + var->chunk_cache_nelems = nelems; + var->chunk_cache_preemption = preemption; + + if ((retval = nc4_reopen_dataset(grp, var))) + return retval; + + return NC_NOERR; +} + +/* Need this version for fortran. Accept negative numbers to leave + * settings as they are. */ +int +nc_set_var_chunk_cache_ints(int ncid, int varid, int size, int nelems, + int preemption) +{ + size_t real_size = H5D_CHUNK_CACHE_NBYTES_DEFAULT; + size_t real_nelems = H5D_CHUNK_CACHE_NSLOTS_DEFAULT; + float real_preemption = H5D_CHUNK_CACHE_W0_DEFAULT; + + if (size >= 0) + real_size = size * MEGABYTE; + + if (nelems >= 0) + real_nelems = nelems; + + if (preemption >= 0) + real_preemption = preemption / 100.; + + return nc_set_var_chunk_cache(ncid, varid, real_size, real_nelems, + real_preemption); +} + +/* Get chunk cache size for a variable. */ +int +NC4_get_var_chunk_cache(int ncid, int varid, size_t *sizep, + size_t *nelemsp, float *preemptionp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + int retval; + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + + /* Attempting to do any of these things on a netCDF-3 file produces + * an error. */ + if (!h5) + return NC_ENOTNC4; + + assert(nc && grp && h5); + + /* Find the var. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + if (!var) + return NC_ENOTVAR; + + /* Give the user what they want. */ + if (sizep) + *sizep = var->chunk_cache_size; + if (nelemsp) + *nelemsp = var->chunk_cache_nelems; + if (preemptionp) + *preemptionp = var->chunk_cache_preemption; + + return NC_NOERR; +} + +/* Get chunk cache size for a variable. */ +int +nc_get_var_chunk_cache_ints(int ncid, int varid, int *sizep, + int *nelemsp, int *preemptionp) +{ + size_t real_size, real_nelems; + float real_preemption; + int ret; + + if ((ret = nc_get_var_chunk_cache(ncid, varid, &real_size, + &real_nelems, &real_preemption))) + return ret; + + if (sizep) + *sizep = real_size / MEGABYTE; + if (nelemsp) + *nelemsp = (int)real_nelems; + if(preemptionp) + *preemptionp = (int)(real_preemption * 100); + + return NC_NOERR; +} + +/* Check a set of chunksizes to see if they add up to a chunk that is too big. */ +static int +check_chunksizes(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var, const size_t *chunksizes) +{ + NC_TYPE_INFO_T *type_info; + float total; + size_t type_len; + int d; + int retval; + + if ((retval = nc4_get_typelen_mem(grp->file->nc4_info, var->xtype, 0, &type_len))) + return retval; + if ((retval = nc4_find_type(grp->file->nc4_info, var->xtype, &type_info))) + return retval; + if (type_info && type_info->class == NC_VLEN) + total = sizeof(hvl_t); + else + total = type_len; + for (d = 0; d < var->ndims; d++) + { + if (chunksizes[d] < 1) + return NC_EINVAL; + total *= chunksizes[d]; + } + + if (total > NC_MAX_UINT) + return NC_EBADCHUNK; + + return NC_NOERR; +} + +/* Find the default chunk nelems (i.e. length of chunk along each + * dimension). */ +static int +nc4_find_default_chunksizes2(NC_GRP_INFO_T *grp, NC_VAR_INFO_T *var) +{ + int d; + size_t type_size, max_len = 0; + float num_values = 1, num_set = 0; + int retval; +#ifdef LOGGING + int max_dim; + float total_chunk_size; +#endif + + if (var->type_info->nc_typeid == NC_STRING) + type_size = sizeof(char *); + else + type_size = var->type_info->size; + + /* Later this will become the total number of bytes in the default + * chunk. */ +#ifdef LOGGING + total_chunk_size = type_size; +#endif + + /* How many values in the variable (or one record, if there are + * unlimited dimensions); which is the largest dimension, and how + * long is it? */ + for (d = 0; d < var->ndims; d++) + { + assert(var->dim[d]); + if (var->dim[d]->len) + num_values *= (float)var->dim[d]->len; + else + num_set++; + + if (var->dim[d]->len > max_len) + { + max_len = var->dim[d]->len; +#ifdef LOGGING + max_dim = d; +#endif + } + LOG((4, "d = %d max_dim %d max_len %ld num_values %f", d, max_dim, max_len, + num_values)); + } + + /* If a dim is several orders of magnitude smaller than the max + * dimension, set it's chunk size to the full extent of the smaller + * dimension. */ +#define NC_DIM_MULTIPLIER 10000 + for (d = 0; d < var->ndims; d++) + if (var->dim[d]->unlimited) + var->chunksizes[d] = 1; + else if (!var->dim[d]->unlimited && var->dim[d]->len * NC_DIM_MULTIPLIER < max_len) + { + var->chunksizes[d] = var->dim[d]->len; + num_set++; + } + + /* Pick a chunk length for each dimension, if one has not already + * been picked above. */ + for (d = 0; d < var->ndims; d++) + if (!var->chunksizes[d]) + { + size_t suggested_size; + suggested_size = (pow((double)DEFAULT_CHUNK_SIZE/(num_values * type_size), + 1/(double)(var->ndims - num_set)) * var->dim[d]->len - .5); + if (suggested_size > var->dim[d]->len) + suggested_size = var->dim[d]->len; + var->chunksizes[d] = suggested_size ? suggested_size : 1; + LOG((4, "nc_def_var_nc4: name %s dim %d DEFAULT_CHUNK_SIZE %d num_values %f type_size %d " + "chunksize %ld", var->name, d, DEFAULT_CHUNK_SIZE, num_values, type_size, var->chunksizes[d])); + } + + /* Find total chunk size. */ +#ifdef LOGGING + for (d = 0; d < var->ndims; d++) + total_chunk_size *= var->chunksizes[d]; + LOG((4, "total_chunk_size %f", total_chunk_size)); +#endif + + /* But did this add up to a chunk that is too big? */ + retval = check_chunksizes(grp, var, var->chunksizes); + if (retval) + { + /* Other error? */ + if (retval != NC_EBADCHUNK) + return retval; + + /* Chunk is too big! Reduce each dimension by half and try again. */ + for ( ; retval == NC_EBADCHUNK; retval = check_chunksizes(grp, var, var->chunksizes)) + for (d = 0; d < var->ndims; d++) + var->chunksizes[d] = var->chunksizes[d]/2 ? var->chunksizes[d]/2 : 1; + } + + /* Do we have any big data overhangs? They can be dangerous to + * babies, the elderly, or confused campers who have had too much + * beer. */ + for (d = 0; d < var->ndims; d++) + { + int num_chunks; + size_t overhang; + assert(var->chunksizes[d] > 0); + num_chunks = (var->dim[d]->len + var->chunksizes[d] - 1) / var->chunksizes[d]; + if(num_chunks > 0) { + overhang = (num_chunks * var->chunksizes[d]) - var->dim[d]->len; + var->chunksizes[d] -= overhang / num_chunks; + } + } + + return NC_NOERR; +} + +/* This is called when a new netCDF-4 variable is defined. Break it + * down! */ +static int +nc_def_var_nc4(int ncid, const char *name, nc_type xtype, + int ndims, const int *dimidsp, int *varidp) +{ + NC_GRP_INFO_T *grp; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + NC_HDF5_FILE_INFO_T *h5; + NC_TYPE_INFO_T *type_info; + char norm_name[NC_MAX_NAME + 1]; + int new_varid = 0; + int num_unlim = 0; + int d; + size_t num_values = 1; + int retval; + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_grp_h5(ncid, &grp, &h5))) + return retval; + assert(grp && h5); + + /* If it's not in define mode, strict nc3 files error out, + * otherwise switch to define mode. */ + if (!(h5->flags & NC_INDEF)) + { + if (h5->cmode & NC_CLASSIC_MODEL) + return NC_ENOTINDEFINE; + if ((retval = NC4_redef(ncid))) + return retval; + } + + /* Check and normalize the name. */ + if ((retval = nc4_check_name(name, norm_name))) + return retval; + + /* Not a Type is, well, not a type.*/ + if (xtype == NC_NAT) + return NC_EBADTYPE; + + /* For classic files, only classic types are allowed. */ + if (h5->cmode & NC_CLASSIC_MODEL && xtype > NC_DOUBLE) + return NC_ESTRICTNC3; + + /* If this is a user defined type, find it. */ + if (xtype > NC_STRING) + if (nc4_find_type(grp->file->nc4_info, xtype, &type_info)) + return NC_EBADTYPE; + + /* cast needed for braindead systems with signed size_t */ + if((unsigned long) ndims > X_INT_MAX) /* Backward compat */ + return NC_EINVAL; + + /* Classic model files have a limit on number of vars. */ + if(h5->cmode & NC_CLASSIC_MODEL && h5->nvars >= NC_MAX_VARS) + return NC_EMAXVARS; + + /* Check that this name is not in use as a var, grp, or type. */ + if ((retval = nc4_check_dup_name(grp, norm_name))) + return retval; + + /* If the file is read-only, return an error. */ + if (h5->no_write) + return NC_EPERM; + + /* Get the new varid. */ + for (var = grp->var; var; var = var->next) + new_varid++; + + /* Check all the dimids to make sure they exist. */ + for (d = 0; d < ndims; d++) + { + if ((retval = nc4_find_dim(grp, dimidsp[d], &dim, NULL))) + return retval; + if (dim->unlimited) + num_unlim++; + else + num_values *= dim->len; + } + + /* These degrubbing messages sure are handy! */ + LOG((3, "nc_def_var_nc4: name %s type %d ndims %d", norm_name, xtype, ndims)); +#ifdef LOGGING + { + int dd; + for (dd = 0; dd < ndims; dd++) + LOG((4, "dimid[%d] %d", dd, dimidsp[dd])); + } +#endif + + /* Add the var to the end of the list. */ + if ((retval = nc4_var_list_add(&grp->var, &var))) + return retval; + + /* Now fill in the values in the var info structure. */ + if (!(var->name = malloc((strlen(norm_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(var->name, norm_name); + var->varid = grp->nvars++; + var->xtype = xtype; + var->ndims = ndims; + var->dirty++; + + /* If this is a user-defined type, there is a type_info stuct with + * all the type information. For atomic types, fake up a type_info + * struct. */ + if (xtype > NC_STRING) + var->type_info = type_info; + else + { + if (!(var->type_info = calloc(1, sizeof(NC_TYPE_INFO_T)))) + return NC_ENOMEM; + var->type_info->nc_typeid = xtype; + if ((retval = nc4_get_hdf_typeid(h5, var->xtype, &var->type_info->hdf_typeid, + var->type_info->endianness))) + return retval; + if ((var->type_info->native_typeid = H5Tget_native_type(var->type_info->hdf_typeid, + H5T_DIR_DEFAULT)) < 0) + return NC_EHDFERR; + if ((retval = nc4_get_typelen_mem(h5, var->type_info->nc_typeid, 0, + &var->type_info->size))) + return retval; + } + if (!num_unlim) + var->contiguous = 1; + + /* Allocate space for dimension information. */ + if (ndims) + { + if (!(var->dim = calloc(ndims, sizeof(NC_DIM_INFO_T *)))) + return NC_ENOMEM; + if (!(var->dimids = calloc(ndims, sizeof(int)))) + return NC_ENOMEM; + } + + /* At the same time, check to see if this is a coordinate + * variable. If so, it will have the same name as one of its + * dimensions. If it is a coordinate var, is it a coordinate var in + * the same group as the dim? */ + for (d = 0; d < ndims; d++) + { + NC_GRP_INFO_T *dim_grp; + if ((retval = nc4_find_dim(grp, dimidsp[d], &dim, &dim_grp))) + return retval; + if (strcmp(dim->name, norm_name) == 0 && dim_grp == grp && d == 0) + { + var->dimscale++; + dim->coord_var = var; + dim->coord_var_in_grp++; + } + var->dimids[d] = dimidsp[d]; + var->dim[d] = dim; + } + + /* Determine default chunksizes for this variable. (Even for + * variables which may be contiguous. */ + LOG((4, "allocating array of %d size_t to hold chunksizes for var %s", + var->ndims, var->name)); + if (var->ndims) + if (!(var->chunksizes = calloc(var->ndims, sizeof(size_t)))) + return NC_ENOMEM; + + if ((retval = nc4_find_default_chunksizes2(grp, var))) + return retval; + + /* Is this a variable with a chunksize greater than the current + * cache size? */ + if ((retval = nc4_adjust_var_cache(grp, var))) + return retval; + + /* If the user names this variable the same as a dimension, but + * doesn't use that dimension first in its list of dimension ids, + * is not a coordinate variable. I need to change its HDF5 name, + * because the dimension will cause a HDF5 dataset to be created, + * and this var has the same name. */ + for (dim = grp->dim; dim; dim = dim->next) + if (!strcmp(dim->name, norm_name) && + (!var->ndims || dimidsp[0] != dim->dimid)) + { + /* Set a different hdf5 name for this variable to avoid name + * clash. */ + if (strlen(norm_name) + strlen(NON_COORD_PREPEND) > NC_MAX_NAME) + return NC_EMAXNAME; + if (!(var->hdf5_name = malloc((strlen(NON_COORD_PREPEND) + + strlen(norm_name) + 1) * sizeof(char)))) + return NC_ENOMEM; + + sprintf(var->hdf5_name, "%s%s", NON_COORD_PREPEND, norm_name); + } + + /* If this is a coordinate var, it is marked as a HDF5 dimension + * scale. (We found dim above.) Otherwise, allocate space to + * remember whether dimension scales have been attached to each + * dimension. */ + if (!var->dimscale && ndims) + if (ndims && !(var->dimscale_attached = calloc(ndims, sizeof(int)))) + return NC_ENOMEM; + + /* Return the varid. */ + if (varidp) + *varidp = var->varid; + LOG((4, "new varid %d", var->varid)); + + return retval; +} + +/* Create a new variable to hold user data. This is what it's all + * about baby! */ +int +NC4_def_var(int ncid, const char *name, nc_type xtype, int ndims, + const int *dimidsp, int *varidp) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc_def_var: ncid 0x%x name %s xtype %d ndims %d", + ncid, name, xtype, ndims)); + + /* If there are dimensions, I need their ids. */ + if (ndims && !dimidsp) + return NC_EINVAL; + + /* Find metadata for this file. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + int ret; + + ret = ncmpi_def_var(nc->int_ncid, name, xtype, ndims, + dimidsp, varidp); + nc->pnetcdf_ndims[*varidp] = ndims; + return ret; + } +#endif /* USE_PNETCDF */ + + /* Netcdf-3 cases handled by dispatch layer. */ + assert(nc->nc4_info); + + /* Handle netcdf-4 cases. */ + return nc_def_var_nc4(ncid, name, xtype, ndims, dimidsp, varidp); +} + +/* Get all the information about a variable. Pass NULL for whatever + * you don't care about. This is an internal function, not exposed to + * the user. */ +int +NC4_inq_var_all(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp, + int *shufflep, int *deflatep, int *deflate_levelp, + int *fletcher32p, int *contiguousp, size_t *chunksizesp, + int *no_fill, void *fill_valuep, int *endiannessp, + int *options_maskp, int *pixels_per_blockp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_ATT_INFO_T *att; + int natts=0; + size_t type_size; + int d; + int retval; + + LOG((2, "nc_inq_var_all: ncid 0x%x varid %d", ncid, varid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + assert(nc && grp && h5); + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_inq_var(nc->int_ncid, varid, name, xtypep, ndimsp, + dimidsp, nattsp); +#endif /* USE_PNETCDF */ + + /* Walk through the list of vars, and return the info about the one + with a matching varid. If the varid is -1, find the global + atts and call it a day. */ + if (varid == NC_GLOBAL) + { + if (nattsp) + { + for (att = grp->att; att; att = att->next) + natts++; + *nattsp = natts; + } + return NC_NOERR; + } + + /* Find the var. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + + /* Oh no! Maybe we couldn't find it (*sob*)! */ + if (!var) + return NC_ENOTVAR; + + /* Copy the data to the user's data buffers. */ + if (name) + strcpy(name, var->name); + if (xtypep) + *xtypep = var->xtype; + if (ndimsp) + *ndimsp = var->ndims; + if (dimidsp) + for (d = 0; d < var->ndims; d++) + dimidsp[d] = var->dimids[d]; + if (nattsp) + { + for (att = var->att; att; att = att->next) + natts++; + *nattsp = natts; + } + + /* Chunking stuff. */ + if (!var->contiguous && chunksizesp) + for (d = 0; d < var->ndims; d++) + { + chunksizesp[d] = var->chunksizes[d]; + LOG((4, "chunksizesp[%d]=%d", d, chunksizesp[d])); + } + + if (contiguousp) + *contiguousp = var->contiguous ? NC_CONTIGUOUS : NC_CHUNKED; + + /* Filter stuff. */ + if (deflatep) + *deflatep = var->deflate; + if (deflate_levelp) + *deflate_levelp = var->deflate_level; + if (shufflep) + *shufflep = var->shuffle; + if (fletcher32p) + *fletcher32p = var->fletcher32; + if (options_maskp) + *options_maskp = var->options_mask; + if (pixels_per_blockp) + *pixels_per_blockp = var->pixels_per_block; + + /* Fill value stuff. */ + if (no_fill) + *no_fill = var->no_fill; + + /* Don't do a thing with fill_valuep if no_fill mode is set for + * this var, or if fill_valuep is NULL. */ + if (!var->no_fill && fill_valuep) + { + /* Do we have a fill value for this var? */ + if (var->fill_value) + { + if ((retval = nc4_get_typelen_mem(grp->file->nc4_info, var->xtype, 0, &type_size))) + return retval; + memcpy(fill_valuep, var->fill_value, type_size); + } + else + { + if ((retval = nc4_get_default_fill_value(var->type_info, fill_valuep))) + return retval; + } + } + + /* Does the user want the endianness of this variable? */ + if (endiannessp) + *endiannessp = var->type_info->endianness; + + return NC_NOERR; +} + +/* This functions sets extra stuff about a netCDF-4 variable which + must be set before the enddef but after the def_var. This is an + internal function, deliberately hidden from the user so that we can + change the prototype of this functions without changing the API. */ +static int +nc_def_var_extra(int ncid, int varid, int *shuffle, int *deflate, + int *deflate_level, int *fletcher32, int *contiguous, + const size_t *chunksizes, int *no_fill, + const void *fill_value, int *endianness, + int *options_mask, int *pixels_per_block) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + size_t type_size; + int d; + int retval; + + LOG((2, "nc_def_var_extra: ncid 0x%x varid %d", ncid, varid)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + + /* Attempting to do any of these things on a netCDF-3 file produces + * an error. */ + if (!h5) + return NC_ENOTNC4; + + assert(nc && grp && h5); + + /* Find the var. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + + /* Oh no! Maybe we couldn't find it (*sob*)! */ + if (!var) + return NC_ENOTVAR; + + /* Can't turn on contiguous and deflate/fletcher32/szip. */ + if (contiguous) + if ((*contiguous != NC_CHUNKED && deflate) || + (*contiguous != NC_CHUNKED && fletcher32) || + (*contiguous != NC_CHUNKED && options_mask)) + return NC_EINVAL; + + /* If the HDF5 dataset has already been created, then it is too + * late to set all the extra stuff. */ + if (var->created) + return NC_ELATEDEF; + + /* Check compression options. */ + if ((deflate && options_mask) || + (deflate && !deflate_level) || + (options_mask && !pixels_per_block)) + return NC_EINVAL; + + /* Valid deflate level? */ + if (deflate && deflate_level) + { + if (*deflate) + if (*deflate_level < MIN_DEFLATE_LEVEL || + *deflate_level > MAX_DEFLATE_LEVEL) + return NC_EINVAL; + if (var->options_mask) + return NC_EINVAL; + + /* For scalars, just ignore attempt to deflate. */ + if (!var->ndims) + return NC_NOERR; + + /* Well, if we couldn't find any errors, I guess we have to take + * the users settings. Darn! */ + var->contiguous = 0; + var->deflate = *deflate; + if (*deflate) + var->deflate_level = *deflate_level; + LOG((3, "nc_def_var_extra: *deflate_level %d", *deflate_level)); + } + + /* Szip in use? */ + if (options_mask) + { +#ifndef USE_SZIP + return NC_EINVAL; +#endif + if (var->deflate) + return NC_EINVAL; + if ((*options_mask != NC_SZIP_EC_OPTION_MASK) && + (*options_mask != NC_SZIP_NN_OPTION_MASK)) + return NC_EINVAL; + if ((*pixels_per_block > NC_SZIP_MAX_PIXELS_PER_BLOCK) || + (var->type_info->nc_typeid >= NC_STRING)) + return NC_EINVAL; + var->options_mask = *options_mask; + var->pixels_per_block = *pixels_per_block; + var->contiguous = 0; + } + + /* Shuffle filter? */ + if (shuffle) + { + var->shuffle = *shuffle; + var->contiguous = 0; + } + + /* Fltcher32 checksum error protection? */ + if (fletcher32) + { + var->fletcher32 = *fletcher32; + var->contiguous = 0; + } + + /* Does the user want a contiguous dataset? Not so fast! Make sure + * that there are no unlimited dimensions, and no filters in use + * for this data. */ + if (contiguous && *contiguous) + { + if (var->deflate || var->fletcher32 || var->shuffle || var->options_mask) + return NC_EINVAL; + + for (d = 0; d < var->ndims; d++) + { + if ((retval = nc4_find_dim(grp, var->dimids[d], &dim, NULL))) + return retval; + if (dim->unlimited) + return NC_EINVAL; + } + + var->contiguous = NC_CONTIGUOUS; + } + + /* Chunksizes anyone? */ + if (contiguous && *contiguous == NC_CHUNKED) + { + var->contiguous = 0; + + /* If the user provided chunksizes, check that they are not too + * big, and that their total size of chunk is less than 4 GB. */ + if (chunksizes) + { + + if ((retval = check_chunksizes(grp, var, chunksizes))) + return retval; + + /* Set the chunksizes for this variable. */ + for (d = 0; d < var->ndims; d++) + var->chunksizes[d] = chunksizes[d]; + } + } + + /* Is this a variable with a chunksize greater than the current + * cache size? */ + if (var->contiguous == NC_CHUNKED && (chunksizes || deflate || contiguous)) + { + /* Determine default chunksizes for this variable. */ + if (!var->chunksizes[0]) + if ((retval = nc4_find_default_chunksizes2(grp, var))) + return retval; + + /* Adjust the cache. */ + if ((retval = nc4_adjust_var_cache(grp, var))) + return retval; + } + + /* Are we setting a fill modes? */ + if (no_fill) + { + if (*no_fill) + var->no_fill = 1; + else + var->no_fill = 0; + } + + /* Are we setting a fill value? */ + if (fill_value && !var->no_fill) + { + /* If fill value hasn't been set, allocate space. */ + if ((retval = nc4_get_typelen_mem(h5, var->xtype, 0, &type_size))) + return retval; + if (!var->fill_value) + if (!(var->fill_value = malloc(type_size))) + return NC_ENOMEM; + + /* Copy the fill_value. */ + LOG((4, "Copying fill value into metadata for variable %s", + var->name)); + memcpy(var->fill_value, fill_value, type_size); + + /* If there's a _FillValue attribute, delete it. */ + retval = nc_del_att(ncid, varid, _FillValue); + if (retval && retval != NC_ENOTATT) + return retval; + + /* Create a _FillValue attribute. */ + if ((retval = nc_put_att(ncid, varid, _FillValue, var->xtype, 1, fill_value))) + return retval; + } + + /* Is the user setting the endianness? */ + if (endianness) + var->type_info->endianness = *endianness; + + return NC_NOERR; +} + +/* Set the deflate level for a var, lower is faster, higher is + * better. Must be called after nc_def_var and before nc_enddef or any + * functions which writes data to the file. */ +int +NC4_def_var_deflate(int ncid, int varid, int shuffle, int deflate, + int deflate_level) +{ + return nc_def_var_extra(ncid, varid, &shuffle, &deflate, + &deflate_level, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +} + +/* Set checksum for a var. This must be called after the nc_def_var + * but before the nc_enddef. */ +int +NC4_def_var_fletcher32(int ncid, int varid, int fletcher32) +{ + return nc_def_var_extra(ncid, varid, NULL, NULL, NULL, &fletcher32, + NULL, NULL, NULL, NULL, NULL, NULL, NULL); +} + +/* Define chunking stuff for a var. This must be done after nc_def_var + and before nc_enddef. + + Chunking is required in any dataset with one or more unlimited + dimension in HDF5, or any dataset using a filter. + + Where chunksize is a pointer to an array of size ndims, with the + chunksize in each dimension. +*/ +int +NC4_def_var_chunking(int ncid, int varid, int contiguous, const size_t *chunksizesp) +{ + return nc_def_var_extra(ncid, varid, NULL, NULL, NULL, NULL, + &contiguous, chunksizesp, NULL, NULL, NULL, NULL, NULL); +} + +/* Inquire about chunking stuff for a var. This is a private, + * undocumented function, used by the f77 API to avoid size_t + * problems. */ +int +nc_inq_var_chunking_ints(int ncid, int varid, int *contiguousp, int *chunksizesp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + size_t *cs = NULL; + int i, retval; + + /* Find this ncid's file info. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + assert(nc); + + /* Must be netcdf-4. */ + if (!h5) + return NC_ENOTNC4; + + /* Find var cause I need the number of dims. */ + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + + /* Allocate space for the size_t copy of the chunksizes array. */ + if (var->ndims) + if (!(cs = malloc(var->ndims * sizeof(size_t)))) + return NC_ENOMEM; + + retval = NC4_inq_var_all(ncid, varid, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, contiguousp, cs, NULL, + NULL, NULL, NULL, NULL); + + /* Copy to size_t array. */ + if (*contiguousp == NC_CHUNKED) + for (i = 0; i < var->ndims; i++) + { + chunksizesp[i] = cs[i]; + if (cs[i] > NC_MAX_INT) + retval = NC_ERANGE; + } + + if (var->ndims) + free(cs); + return retval; +} + +/* This function defines the chunking with ints, which works better + * with F77 portability. It is a secret function, which has been + * rendered unmappable, and it is impossible to apparate anywhere in + * this function. */ +int +nc_def_var_chunking_ints(int ncid, int varid, int contiguous, int *chunksizesp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + size_t *cs = NULL; + int i, retval; + + /* Find this ncid's file info. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + assert(nc); + + /* Must be netcdf-4. */ + if (!h5) + return NC_ENOTNC4; + + /* Find var cause I need the number of dims. */ + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + + /* Allocate space for the size_t copy of the chunksizes array. */ + if (var->ndims) + if (!(cs = malloc(var->ndims * sizeof(size_t)))) + return NC_ENOMEM; + + /* Copy to size_t array. */ + for (i = 0; i < var->ndims; i++) + cs[i] = chunksizesp[i]; + + retval = nc_def_var_extra(ncid, varid, NULL, NULL, NULL, NULL, + &contiguous, cs, NULL, NULL, NULL, NULL, NULL); + + if (var->ndims) + free(cs); + return retval; +} + +/* Define fill value behavior for a variable. This must be done after + nc_def_var and before nc_enddef. */ +int +NC4_def_var_fill(int ncid, int varid, int no_fill, const void *fill_value) +{ + return nc_def_var_extra(ncid, varid, NULL, NULL, NULL, NULL, NULL, + NULL, &no_fill, fill_value, NULL, NULL, NULL); +} + + +/* Define the endianness of a variable. */ +int +NC4_def_var_endian(int ncid, int varid, int endianness) +{ + return nc_def_var_extra(ncid, varid, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, &endianness, NULL, NULL); +} + +/* Get var id from name. */ +int +NC4_inq_varid(int ncid, const char *name, int *varidp) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + char norm_name[NC_MAX_NAME + 1]; + int retval; + + if (!name) + return NC_EINVAL; + if (!varidp) + return NC_NOERR; + + LOG((2, "nc_inq_varid: ncid 0x%x name %s", ncid, name)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + + /* Handle netcdf-3. */ + assert(h5); + + /* Normalize name. */ + if ((retval = nc4_normalize_name(name, norm_name))) + return retval; + + /* Find var of this name. */ + for (var = grp->var; var; var = var->next) + if (!(strcmp(var->name, norm_name))) + { + *varidp = var->varid; + return NC_NOERR; + } + + return NC_ENOTVAR; +} + +/* Rename a var to "bubba," for example. + + According to the netcdf-3.5 docs: If the new name is longer than + the old name, the netCDF dataset must be in define mode. */ +int +NC4_rename_var(int ncid, int varid, const char *name) +{ + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + int retval = NC_NOERR; + + LOG((2, "nc_rename_var: ncid 0x%x varid %d name %s", + ncid, varid, name)); + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Take care of files created/opened with parallel-netcdf library. */ + if (nc->pnetcdf_file) + return ncmpi_rename_var(nc->int_ncid, varid, name); +#endif /* USE_PNETCDF */ + + /* Take care of netcdf-3 files. */ + assert(h5); + + /* Is the new name too long? */ + if (strlen(name) > NC_MAX_NAME) + return NC_EMAXNAME; + + /* Trying to write to a read-only file? No way, Jose! */ + if (h5->no_write) + return NC_EPERM; + + /* Check name validity, if strict nc3 rules are in effect for this + * file. */ + if ((retval = NC_check_name(name))) + return retval; + + /* Is name in use? */ + for (var = grp->var; var; var = var->next) + if (!strncmp(var->name, name, NC_MAX_NAME)) + return NC_ENAMEINUSE; + + /* Find the var. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + if (!var) + return NC_ENOTVAR; + + /* If we're not in define mode, new name must be of equal or + less size, if strict nc3 rules are in effect for this . */ + if (!(h5->flags & NC_INDEF) && strlen(name) > strlen(var->name) && + (h5->cmode & NC_CLASSIC_MODEL)) + return NC_ENOTINDEFINE; + + /* Change the HDF5 file, if this var has already been created + there. */ + if (var->created) + { + if (H5Gmove(grp->hdf_grpid, var->name, name) < 0) + BAIL(NC_EHDFERR); + } + + /* Now change the name in our metadata. */ + free(var->name); + if (!(var->name = malloc((strlen(name) + 1) * sizeof(char)))) + return NC_ENOMEM; + strcpy(var->name, name); + + exit: + return retval; +} + + +int +NC4_var_par_access(int ncid, int varid, int par_access) +{ +#ifndef USE_PARALLEL + return NC_ENOPAR; +#else + NC_FILE_INFO_T *nc; + NC_GRP_INFO_T *grp; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + int retval; + + LOG((1, "nc_var_par_access: ncid 0x%x varid %d par_access %d", ncid, + varid, par_access)); + + if (par_access != NC_INDEPENDENT && par_access != NC_COLLECTIVE) + return NC_EINVAL; + + /* Find info for this file and group, and set pointer to each. */ + if ((retval = nc4_find_nc_grp_h5(ncid, &nc, &grp, &h5))) + return retval; + +#ifdef USE_PNETCDF + /* Handle files opened/created with parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + if (par_access == nc->pnetcdf_access_mode) + return NC_NOERR; + + nc->pnetcdf_access_mode = par_access; + if (par_access == NC_INDEPENDENT) + return ncmpi_begin_indep_data(nc->int_ncid); + else + return ncmpi_end_indep_data(nc->int_ncid); + } +#endif /* USE_PNETCDF */ + + /* This function only for files opened with nc_open_par or nc_create_par. */ + if (!h5->parallel) + return NC_ENOPAR; + + /* Find the var, and set its preference. */ + for (var = grp->var; var; var = var->next) + if (var->varid == varid) + break; + if (!var) + return NC_ENOTVAR; + + if (par_access) + var->parallel_access = NC_COLLECTIVE; + else + var->parallel_access = NC_INDEPENDENT; + return NC_NOERR; +#endif /* USE_PARALLEL */ +} + +static int +nc4_put_vara_tc(int ncid, int varid, nc_type mem_type, int mem_type_is_long, + const size_t *startp, const size_t *countp, const void *op) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc4_put_vara_tc: ncid 0x%x varid %d mem_type %d mem_type_is_long %d", + ncid, varid, mem_type, mem_type_is_long)); + + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Handle files opened/created with the parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + MPI_Offset mpi_start[NC_MAX_DIMS], mpi_count[NC_MAX_DIMS]; + int d; + + /* No NC_LONGs for parallel-netcdf library! */ + if (mem_type_is_long) + return NC_EINVAL; + + /* We must convert the start, count, and stride arrays to + * MPI_Offset type. */ + for (d = 0; d < nc->pnetcdf_ndims[varid]; d++) + { + mpi_start[d] = startp[d]; + mpi_count[d] = countp[d]; + } + + if (nc->pnetcdf_access_mode == NC_INDEPENDENT) + { + switch(mem_type) + { + case NC_BYTE: + return ncmpi_put_vara_schar(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_UBYTE: + return ncmpi_put_vara_uchar(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_CHAR: + return ncmpi_put_vara_text(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_SHORT: + return ncmpi_put_vara_short(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_INT: + return ncmpi_put_vara_int(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_FLOAT: + return ncmpi_put_vara_float(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_DOUBLE: + return ncmpi_put_vara_double(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_NAT: + default: + return NC_EBADTYPE; + } + } + else + { + switch(mem_type) + { + case NC_BYTE: + return ncmpi_put_vara_schar_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_UBYTE: + return ncmpi_put_vara_uchar_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_CHAR: + return ncmpi_put_vara_text_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_SHORT: + return ncmpi_put_vara_short_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_INT: + return ncmpi_put_vara_int_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_FLOAT: + return ncmpi_put_vara_float_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_DOUBLE: + return ncmpi_put_vara_double_all(nc->int_ncid, varid, mpi_start, mpi_count, op); + case NC_NAT: + default: + return NC_EBADTYPE; + } + } + } +#endif /* USE_PNETCDF */ + + /* NetCDF-3 cases handled by dispatch layer. */ + assert(nc->nc4_info); + + return nc4_put_vara(nc, ncid, varid, startp, countp, mem_type, + mem_type_is_long, (void *)op); +} + +int +nc4_get_hdf4_vara(NC_FILE_INFO_T *nc, int ncid, int varid, const size_t *startp, + const size_t *countp, nc_type mem_nc_type, int is_long, void *data) +{ +#ifdef USE_HDF4 + NC_GRP_INFO_T *grp, *g; + NC_HDF5_FILE_INFO_T *h5; + NC_VAR_INFO_T *var; + NC_DIM_INFO_T *dim; + int32 start32[NC_MAX_VAR_DIMS], edge32[NC_MAX_VAR_DIMS]; + int retval, d; + + /* Find our metadata for this file, group, and var. */ + assert(nc); + if ((retval = nc4_find_g_var_nc(nc, ncid, varid, &grp, &var))) + return retval; + h5 = nc->nc4_info; + assert(grp && h5 && var && var->name); + + for (d = 0; d < var->ndims; d++) + { + start32[d] = startp[d]; + edge32[d] = countp[d]; + } + + if (SDreaddata(var->sdsid, start32, NULL, edge32, data)) + return NC_EHDFERR; + +#endif /* USE_HDF4 */ + return NC_NOERR; +} + +/* Get an array. */ +static int +nc4_get_vara_tc(int ncid, int varid, nc_type mem_type, int mem_type_is_long, + const size_t *startp, const size_t *countp, void *ip) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc4_get_vara_tc: ncid 0x%x varid %d mem_type %d mem_type_is_long %d", + ncid, varid, mem_type, mem_type_is_long)); + + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + +#ifdef USE_PNETCDF + /* Handle files opened/created with the parallel-netcdf library. */ + if (nc->pnetcdf_file) + { + MPI_Offset mpi_start[NC_MAX_VAR_DIMS], mpi_count[NC_MAX_VAR_DIMS]; + int d; + + /* No NC_LONGs for parallel-netcdf library! */ + if (mem_type_is_long) + return NC_EINVAL; + + /* We must convert the start, count, and stride arrays to + * MPI_Offset type. */ + for (d = 0; d < nc->pnetcdf_ndims[varid]; d++) + { + mpi_start[d] = startp[d]; + mpi_count[d] = countp[d]; + } + + if (nc->pnetcdf_access_mode == NC_INDEPENDENT) + { + switch(mem_type) + { + case NC_BYTE: + return ncmpi_get_vara_schar(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_UBYTE: + return ncmpi_get_vara_uchar(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_CHAR: + return ncmpi_get_vara_text(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_SHORT: + return ncmpi_get_vara_short(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_INT: + return ncmpi_get_vara_int(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_FLOAT: + return ncmpi_get_vara_float(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_DOUBLE: + return ncmpi_get_vara_double(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_NAT: + default: + return NC_EBADTYPE; + } + } + else + { + switch(mem_type) + { + case NC_BYTE: + return ncmpi_get_vara_schar_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_UBYTE: + return ncmpi_get_vara_uchar_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_CHAR: + return ncmpi_get_vara_text_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_SHORT: + return ncmpi_get_vara_short_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_INT: + return ncmpi_get_vara_int_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_FLOAT: + return ncmpi_get_vara_float_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_DOUBLE: + return ncmpi_get_vara_double_all(nc->int_ncid, varid, mpi_start, mpi_count, ip); + case NC_NAT: + default: + return NC_EBADTYPE; + } + } + } +#endif /* USE_PNETCDF */ + + /* Handle netCDF-3 cases. */ + assert(nc->nc4_info); + + /* Handle HDF4 cases. */ + if (nc->nc4_info->hdf4) + return nc4_get_hdf4_vara(nc, ncid, varid, startp, countp, mem_type, + mem_type_is_long, (void *)ip); + + /* Handle HDF5 cases. */ + return nc4_get_vara(nc, ncid, varid, startp, countp, mem_type, + mem_type_is_long, (void *)ip); +} + +int +NC4_put_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, const void *op, int memtype) +{ + return nc4_put_vara_tc(ncid, varid, memtype, 0, startp, countp, op); +} + + +/* Read an array of values. */ +int +NC4_get_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, void *ip, int memtype) +{ + return nc4_get_vara_tc(ncid, varid, memtype, 0, startp, countp, ip); +} diff --git a/extern/src_netcdf4/nc_logging.h b/extern/src_netcdf4/nc_logging.h new file mode 100644 index 0000000..36471ce --- /dev/null +++ b/extern/src_netcdf4/nc_logging.h @@ -0,0 +1,62 @@ +/* Copyright 2010, University Corporation for Atmospheric Research. See + COPYRIGHT file for copying and redistribution conditions. + + This file is part of netcdf-4, a netCDF-like interface for HDF5, or + a HDF5 backend for netCDF, depending on your point of view. + + This file contains macros and prototyes relating to logging. + + $Id: nc_logging.h,v 1.1 2010/06/01 15:34:49 ed Exp $ +*/ + +#ifndef _NCLOGGING_ +#define _NCLOGGING_ + +#include +#include + +#ifdef LOGGING + +/* To log something... */ +void nc_log(int severity, const char *fmt, ...); +void nc_log_hdf5(void); + +#define LOG(e) nc_log e + +/* To log based on error code, and set retval. */ +#define BAIL2(e) do { \ +retval = e; \ +LOG((0, "file %s, line %d.\n%s", __FILE__, __LINE__, nc_strerror(e))); \ +nc_log_hdf5(); \ +} while (0) + +/* To log an error message, set retval, and jump to exit. */ +#define BAIL(e) do { \ +BAIL2(e); \ +goto exit; \ +} while (0) + +/* To set retval and jump to exit, without logging error message. */ +#define BAIL_QUIET(e) do { \ +retval = e; \ +goto exit; \ +} while (0) + +#else + +/* These definitions will be used unless LOGGING is defined. */ +#define LOG(e) +#define BAIL(e) do { \ +retval = e; \ +goto exit; \ +} while (0) +#define BAIL_QUIET BAIL +#define BAIL2(e) do { \ +goto exit; \ +} while (0) +#define nc_set_log_level(e) +#endif + +#endif /* _NCLOGGING_ */ + + diff --git a/extern/src_netcdf4/nc_tests.h b/extern/src_netcdf4/nc_tests.h new file mode 100644 index 0000000..3904564 --- /dev/null +++ b/extern/src_netcdf4/nc_tests.h @@ -0,0 +1,37 @@ +/** \internal +\file +Common includes, defines, etc., for test code in the libsrc4 and +nc_test4 directories. + +This is part of the netCDF package. Copyright 2005 University +Corporation for Atmospheric Research/Unidata. See \ref copyright file +for conditions of use. +*/ + +#ifndef _NC_TESTS_H +#define _NC_TESTS_H + +#include +#include +#include +#include +#include +#ifdef USE_PARALLEL +#include "netcdf_par.h" +#endif +#include "netcdf.h" +#include "err_macros.h" + +/** Useful define for tests. */ +/** \{ */ +#define MEGABYTE 1048576 +#define HALF_MEG (MEGABYTE/2) +#define MILLION 1000000 +#define SIXTEEN_MEG 16777216 +#define FOUR_MEG (SIXTEEN_MEG/4) +#define THIRTY_TWO_MEG (SIXTEEN_MEG * 2) +#define SIXTY_FOUR_MEG (SIXTEEN_MEG * 4) +#define ONE_TWENTY_EIGHT_MEG (SIXTEEN_MEG * 8) +/** \} */ + +#endif /* _NC_TESTS_H */ diff --git a/extern/src_netcdf4/nc_uri.c b/extern/src_netcdf4/nc_uri.c new file mode 100644 index 0000000..aadf941 --- /dev/null +++ b/extern/src_netcdf4/nc_uri.c @@ -0,0 +1,466 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header$ + *********************************************************************/ + +#include "config.h" + +#include +#include +#include + +#include "nc_uri.h" + +#define NC_URIDEBUG + +#define LBRACKET '[' +#define RBRACKET ']' + +#ifndef FIX +#define FIX(s) ((s)==NULL?"":(s)) +#endif + +#ifndef NILLEN +#define NILLEN(s) ((s)==NULL?0:strlen(s)) +#endif + + +static char* legalprotocols[] = { +"file:", +"http:", +"https:", +"ftp:", +NULL /* NULL terminate*/ +}; + +static void nc_paramfree(char** params); +static int nc_find(char** params, const char* key); + +/* Do a simple uri parse: return 0 if fail, 1 otherwise*/ +int +nc_uriparse(const char* uri0, NC_URI** nc_urip) +{ + NC_URI* nc_uri = NULL; + char* uri; + char** pp; + char* p; + char* p1; + int c; + + /* accumulate parse points*/ + char* protocol = NULL; + char* params = NULL; + char* host = NULL; + char* port = NULL; + char* constraint = NULL; + char* user = NULL; + char* pwd = NULL; + char* file = NULL; + + nc_uri = (NC_URI*)calloc(1,sizeof(NC_URI)); + if(nc_uri == NULL) return 0; + + /* Temporary hack to remove escape characters inserted by Windows or MinGW */ + if(strchr(uri0,'\\') != NULL) { + char* u = strdup(uri0); + if(u == NULL) return 0; + p = u; + p1 = u; + while((c=*p1++)) {if(c != '\\') *p++ = c;} + uri0 = (const char*)u; + } + + /* make local copy of uri */ + uri = strdup(uri0); + + /* remove all whitespace*/ + p = uri; + p1 = uri; + while((c=*p1++)) {if(c != ' ' && c != '\t') *p++ = c;} + + p = uri; + + /* break up the uri string into pieces*/ + + /* 1. leading bracketed parameters */ + if(*p == LBRACKET) { + params = p+1; + /* find end of the clientparams*/ + for(;*p;p++) {if(p[0] == RBRACKET && p[1] != LBRACKET) break;} + if(*p == 0) goto fail; /* malformed client params*/ + *p = '\0'; /* leave off the trailing rbracket for now */ + p++; /* move past the params*/ + } + + /* verify that the uri starts with an acceptable protocol*/ + for(pp=legalprotocols;*pp;pp++) { + if(strncmp(p,*pp,strlen(*pp))==0) break; + } + if(*pp == NULL) goto fail; /* illegal protocol*/ + /* save the protocol */ + protocol = *pp; + + /* 4. skip protocol */ + p += strlen(protocol); + + /* 5. skip // */ + if(*p != '/' && *(p+1) != '/') + goto fail; + p += 2; + + /* 6. Mark the end of the host section */ + file = strchr(p,'/'); + if(file) { + *file++ = '\0'; /* warning: we just overwrote the leading / */ + } else + goto fail; /* url only has host part, no path */ + + /* 7. extract any user:pwd */ + p1 = strchr(p,'@'); + if(p1) {/* Assume we have user:pwd@ */ + *p1 = '\0'; + user = p; + pwd = strchr(p,':'); + if(!pwd) goto fail; /* malformed */ + *pwd++ = '\0'; + p = pwd+strlen(pwd)+1; + } + + /* 8. extract host and port */ + host = p; + port = strchr(p,':'); + if(port) { + *port++ = '\0'; + } + + /* 9. Look for '?' */ + constraint = strchr(file,'?'); + if(constraint) { + *constraint++ = '\0'; + } + + /* assemble the component pieces*/ + if(uri0 && strlen(uri0) > 0) + nc_uri->uri = strdup(uri0); + if(protocol && strlen(protocol) > 0) { + nc_uri->protocol = strdup(protocol); + /* remove trailing ':' */ + nc_uri->protocol[strlen(protocol)-1] = '\0'; + } + if(user && strlen(user) > 0) + nc_uri->user = strdup(user); + if(pwd && strlen(pwd) > 0) + nc_uri->password = strdup(pwd); + if(host && strlen(host) > 0) + nc_uri->host = strdup(host); + if(port && strlen(port) > 0) + nc_uri->port = strdup(port); + if(file && strlen(file) > 0) { + /* Add back the leading / */ + nc_uri->file = malloc(strlen(file)+2); + strcpy(nc_uri->file,"/"); + strcat(nc_uri->file,file); + } + if(constraint && strlen(constraint) > 0) + nc_uri->constraint = strdup(constraint); + nc_urisetconstraints(nc_uri,constraint); + if(params != NULL && strlen(params) > 0) { + nc_uri->params = (char*)malloc(1+2+strlen(params)); + strcpy(nc_uri->params,"["); + strcat(nc_uri->params,params); + strcat(nc_uri->params,"]"); + } + +#ifdef NC_XDEBUG + { + fprintf(stderr,"nc_uri:"); + fprintf(stderr," params=|%s|",FIX(nc_uri->params)); + fprintf(stderr," protocol=|%s|",FIX(nc_uri->protocol)); + fprintf(stderr," host=|%s|",FIX(nc_uri->host)); + fprintf(stderr," port=|%s|",FIX(nc_uri->port)); + fprintf(stderr," file=|%s|",FIX(nc_uri->file)); + fprintf(stderr," constraint=|%s|",FIX(nc_uri->constraint)); + fprintf(stderr,"\n"); + } +#endif + free(uri); + if(nc_urip != NULL) *nc_urip = nc_uri; + return 1; + +fail: + if(nc_uri) nc_urifree(nc_uri); + if(uri != NULL) free(uri); + return 0; +} + +void +nc_urifree(NC_URI* nc_uri) +{ + if(nc_uri == NULL) return; + if(nc_uri->uri != NULL) {free(nc_uri->uri);} + if(nc_uri->protocol != NULL) {free(nc_uri->protocol);} + if(nc_uri->user != NULL) {free(nc_uri->user);} + if(nc_uri->password != NULL) {free(nc_uri->password);} + if(nc_uri->host != NULL) {free(nc_uri->host);} + if(nc_uri->port != NULL) {free(nc_uri->port);} + if(nc_uri->file != NULL) {free(nc_uri->file);} + if(nc_uri->constraint != NULL) {free(nc_uri->constraint);} + if(nc_uri->projection != NULL) {free(nc_uri->projection);} + if(nc_uri->selection != NULL) {free(nc_uri->selection);} + if(nc_uri->params != NULL) {free(nc_uri->params);} + if(nc_uri->paramlist != NULL) nc_paramfree(nc_uri->paramlist); + free(nc_uri); +} + +/* Replace the constraints */ +void +nc_urisetconstraints(NC_URI* duri,const char* constraints) +{ + char* proj = NULL; + char* select = NULL; + const char* p; + + if(duri->constraint == NULL) free(duri->constraint); + if(duri->projection != NULL) free(duri->projection); + if(duri->selection != NULL) free(duri->selection); + duri->constraint = NULL; + duri->projection = NULL; + duri->selection = NULL; + + if(constraints == NULL || strlen(constraints)==0) return; + + duri->constraint = strdup(constraints); + if(*duri->constraint == '?') + strcpy(duri->constraint,duri->constraint+1); + + p = duri->constraint; + proj = (char*) p; + select = strchr(proj,'&'); + if(select != NULL) { + size_t plen = (select - proj); + if(plen == 0) { + proj = NULL; + } else { + proj = (char*)malloc(plen+1); + memcpy((void*)proj,p,plen); + proj[plen] = '\0'; + } + select = nulldup(select); + } else { + proj = nulldup(proj); + select = NULL; + } + duri->projection = proj; + duri->selection = select; +} + + +/* Construct a complete NC_ URI without the client params + and optionally with the constraints; + caller frees returned string +*/ + +char* +nc_uribuild(NC_URI* duri, const char* prefix, const char* suffix, int pieces) +{ + size_t len = 0; + char* newuri; + int withparams = ((pieces&NC_URIPARAMS) + && duri->params != NULL); + int withuserpwd = ((pieces&NC_URIUSERPWD) + && duri->user != NULL && duri->password != NULL); + int withconstraints = ((pieces&NC_URICONSTRAINTS) + && duri->constraint != NULL); + + if(prefix != NULL) len += NILLEN(prefix); + if(withparams) { + len += NILLEN(duri->params); + } + len += (NILLEN(duri->protocol)+NILLEN("://")); + if(withuserpwd) { + len += (NILLEN(duri->user)+NILLEN(duri->password)+NILLEN(":@")); + } + len += (NILLEN(duri->host)); + if(duri->port != NULL) { + len += (NILLEN(":")+NILLEN(duri->port)); + } + len += (NILLEN(duri->file)); + if(suffix != NULL) len += NILLEN(suffix); + if(withconstraints) { + len += (NILLEN("?")+NILLEN(duri->constraint)); + } + len += 1; /* null terminator */ + + newuri = (char*)malloc(len); + if(!newuri) return NULL; + + newuri[0] = '\0'; + if(prefix != NULL) strcat(newuri,prefix); + if(withparams) { + strcat(newuri,duri->params); + } + strcat(newuri,duri->protocol); + strcat(newuri,"://"); + if(withuserpwd) { + strcat(newuri,duri->user); + strcat(newuri,":"); + strcat(newuri,duri->password); + strcat(newuri,"@"); + } + if(duri->host != NULL) { /* may be null if using file: protocol */ + strcat(newuri,duri->host); + } + if(duri->port != NULL) { + strcat(newuri,":"); + strcat(newuri,duri->port); + } + strcat(newuri,duri->file); + if(suffix != NULL) strcat(newuri,suffix); + if(withconstraints) { + strcat(newuri,"?"); + strcat(newuri,duri->constraint); + } + return newuri; +} + +/**************************************************/ +/* Parameter support */ + +/* +Client parameters are assumed to be +one or more instances of bracketed pairs: +e.g "[...][...]...". +The bracket content in turn is assumed to be a +comma separated list of = pairs. +e.g. x=y,z=,a=b. +If the same parameter is specifed more than once, +then the first occurrence is used; this is so that +is possible to forcibly override user specified +parameters by prefixing. +IMPORTANT: client parameter string is assumed to +have blanks compress out. +Returns 1 if parse suceeded, 0 otherwise; +*/ + +int +nc_uridecodeparams(NC_URI* nc_uri) +{ + char* cp; + char* cq; + int c; + int i; + int nparams; + char* params0; + char* params; + char* params1; + char** plist; + + if(nc_uri == NULL) return 0; + if(nc_uri->params == NULL) return 1; + + params0 = nc_uri->params; + + /* Pass 1 to replace beginning '[' and ending ']' */ + if(params0[0] == '[') + params = strdup(params0+1); + else + params = strdup(params0); + + if(params[strlen(params)-1] == ']') + params[strlen(params)-1] = '\0'; + + /* Pass 2 to replace "][" pairs with ','*/ + params1 = strdup(params); + cp=params; cq = params1; + while((c=*cp++)) { + if(c == RBRACKET && *cp == LBRACKET) {cp++; c = ',';} + *cq++ = c; + } + *cq = '\0'; + free(params); + params = params1; + + /* Pass 3 to break string into pieces and count # of pairs */ + nparams=0; + for(cp=params;(c=*cp);cp++) { + if(c == ',') {*cp = '\0'; nparams++;} + } + nparams++; /* for last one */ + + /* plist is an env style list */ + plist = (char**)calloc(1,sizeof(char*)*(2*nparams+1)); /* +1 for null termination */ + + /* Pass 4 to break up each pass into a (name,value) pair*/ + /* and insert into the param list */ + /* parameters of the form name name= are converted to name=""*/ + cp = params; + for(i=0;iparamlist != NULL) + nc_paramfree(nc_uri->paramlist); + nc_uri->paramlist = plist; + return 1; +} + +int +nc_urilookup(NC_URI* uri, const char* key, const char** resultp) +{ + int i; + char* value = NULL; + if(uri == NULL || key == NULL || uri->params == NULL) return 0; + if(uri->paramlist == NULL) { + i = nc_uridecodeparams(uri); + if(!i) return 0; + } + i = nc_find(uri->paramlist,key); + if(i < 0) return 0; + value = uri->paramlist[(2*i)+1]; + if(resultp) *resultp = value; + return 1; +} + +int +nc_urisetparams(NC_URI* uri, const char* newparams) +{ + if(uri == NULL) return 0; + if(uri->paramlist != NULL) nc_paramfree(uri->paramlist); + uri->paramlist = NULL; + if(uri->params != NULL) free(uri->params); + uri->params = nulldup(newparams); + return 1; +} + +/* Internal version of lookup; returns the paired index of the key */ +static int +nc_find(char** params, const char* key) +{ + int i; + char** p; + for(i=0,p=params;*p;p+=2,i++) { + if(strcmp(key,*p)==0) return i; + } + return -1; +} + +static void +nc_paramfree(char** params) +{ + char** p; + if(params == NULL) return; + for(p=params;*p;p+=2) { + free(*p); + if(p[1] != NULL) free(p[1]); + } + free(params); +} diff --git a/extern/src_netcdf4/nc_uri.h b/extern/src_netcdf4/nc_uri.h new file mode 100644 index 0000000..6fbdeaf --- /dev/null +++ b/extern/src_netcdf4/nc_uri.h @@ -0,0 +1,50 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef NC_URI_H +#define NC_URI_H + +/*! This is an open structure meaning + it is ok to directly access its fields*/ +typedef struct NC_URI { + char* uri; /* as passed by the caller */ + char* protocol; + char* user; /* from user:password@ */ + char* password; /* from user:password@ */ + char* host; /*!< host*/ + char* port; /*!< host */ + char* file; /*!< file */ + char* constraint; /*!< projection+selection */ + char* projection; /*!< without leading '?'*/ + char* selection; /*!< with leading '&'*/ + char* params; /* all params */ + char** paramlist; /*! entry not found; 1=>found; result holds value (may be null). + In any case, the result is imutable and should not be free'd. +*/ +extern int nc_urilookup(NC_URI*, const char* param, const char** result); + +#endif /*NC_URI_H*/ diff --git a/extern/src_netcdf4/ncaux.c b/extern/src_netcdf4/ncaux.c new file mode 100644 index 0000000..9c0c2f3 --- /dev/null +++ b/extern/src_netcdf4/ncaux.c @@ -0,0 +1,390 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* +This code is a variant of the H5detect.c code from HDF5. +Author: D. Heimbigner 10/7/2008 +*/ + +#include +#include +#include +#include + +#include "ncaux.h" + +struct NCAUX_FIELD { + char* name; + nc_type fieldtype; + int ndims; + int dimsizes[NC_MAX_VAR_DIMS]; + size_t size; + size_t offset; + size_t alignment; +}; + +struct NCAUX_CMPD { + int ncid; + int mode; + char* name; + int nfields; + struct NCAUX_FIELD* fields; + size_t size; + size_t offset; /* cumulative as fields are added */ + size_t alignment; +}; + +static int ncaux_initialized = 0; + +static void compute_alignments(void); +static int computefieldinfo(struct NCAUX_CMPD* cmpd); + +int +ncaux_begin_compound(int ncid, const char *name, int alignmode, void** tagp) +{ + int status = NC_NOERR; + struct NCAUX_CMPD* cmpd = NULL; + + if(!ncaux_initialized) { + compute_alignments(); + ncaux_initialized = 1; + } + + if(tagp) *tagp = NULL; + + cmpd = (struct NCAUX_CMPD*)calloc(1,sizeof(struct NCAUX_CMPD)); + if(cmpd == NULL) {status = NC_ENOMEM; goto fail;} + cmpd->ncid = ncid; + cmpd->mode = alignmode; + cmpd->nfields = 0; + cmpd->name = strdup(name); + if(cmpd->name == NULL) {status = NC_ENOMEM; goto fail;} + + if(tagp) *tagp = (void*)cmpd; + + return status; + +fail: + ncaux_abort_compound((void*)cmpd); + return status; +} + +int +ncaux_abort_compound(void* tag) +{ + int i; + struct NCAUX_CMPD* cmpd = (struct NCAUX_CMPD*)tag; + if(cmpd == NULL) goto done; + if(cmpd->name) free(cmpd->name); + for(i=0;infields;i++) { + struct NCAUX_FIELD* field = &cmpd->fields[i]; + if(field->name) free(field->name); + } + if(cmpd->fields) free(cmpd->fields); + free(cmpd); + +done: + return NC_NOERR; +} + +int +ncaux_add_field(void* tag, const char *name, nc_type field_type, + int ndims, const int* dimsizes) +{ + int i; + int status = NC_NOERR; + struct NCAUX_CMPD* cmpd = (struct NCAUX_CMPD*)tag; + struct NCAUX_FIELD* newfields = NULL; + struct NCAUX_FIELD* field = NULL; + + if(cmpd == NULL) goto done; + if(ndims < 0) {status = NC_EINVAL; goto done;} + for(i=0;ifields == NULL) { + newfields = (struct NCAUX_FIELD*)calloc(1,sizeof(struct NCAUX_FIELD)); + } else { + newfields = (struct NCAUX_FIELD*)realloc(cmpd->fields,cmpd->nfields+1*sizeof(struct NCAUX_FIELD)); + } + if(cmpd->fields == NULL) {status = NC_ENOMEM; goto done;} + cmpd->fields = newfields; + field = &cmpd->fields[cmpd->nfields+1]; + field->name = strdup(name); + field->fieldtype = field_type; + if(field->name == NULL) {status = NC_ENOMEM; goto done;} + field->ndims = ndims; + memcpy(field->dimsizes,dimsizes,sizeof(int)*ndims); + cmpd->nfields++; + +done: + return status; +} + +static size_t +dimproduct(int ndims, int* dimsizes) +{ + int i; + size_t product = 1; + for(i=0;incid, cmpd->size, cmpd->name, idp); + if(status != NC_NOERR) goto done; + + for(i=0;infields;i++) { + struct NCAUX_FIELD* field = &cmpd->fields[i]; + if(field->ndims > 0) { + status = nc_insert_compound(cmpd->ncid, *idp, field->name, + field->offset, field->fieldtype); + } else { + status = nc_insert_array_compound(cmpd->ncid, *idp, field->name, + field->offset, field->fieldtype, + field->ndims,field->dimsizes); + } + if(status != NC_NOERR) goto done; + } + +done: + return status; +} + +/**************************************************/ + +/* +The heart of this is the following macro, +which computes the offset of a field x +when preceded by a char field. +The assumptions appear to be as follows: +1. the offset produced in this situation indicates + the alignment for x relative in such a way that it + depends only on the types that precede it in the struct. +2. the compiler does not reorder fields. +3. arrays are tightly packed. +4. nested structs are alignd according to their first member + (this actually follows from C language requirement that + a struct can legally be cast to an instance of its first member). +Given the alignments for the various common primitive types, +it is assumed that one can use them anywhere to construct +the layout of a struct of such types. +It seems to work for HDF5 for a wide variety of machines. +*/ + +#define COMP_ALIGNMENT(DST,TYPE) {\ + struct {char f1; TYPE x;} tmp; \ + DST.typename = #TYPE ; \ + DST.alignment = (size_t)((char*)(&(tmp.x)) - (char*)(&tmp));} + +/* Define indices for every primitive C type */ +/* NAT => NOT-A-TYPE*/ +#define NATINDEX 0 +#define CHARINDEX 1 +#define UCHARINDEX 2 +#define SHORTINDEX 3 +#define USHORTINDEX 4 +#define INTINDEX 5 +#define UINTINDEX 6 +#define LONGINDEX 7 +#define ULONGINDEX 8 +#define LONGLONGINDEX 9 +#define ULONGLONGINDEX 10 +#define FLOATINDEX 11 +#define DOUBLEINDEX 12 +#define PTRINDEX 13 +#define NCVLENINDEX 14 + +#define NCTYPES 15 + +typedef struct Alignment { + char* typename; + int alignment; +} Alignment; + +typedef Alignment Typealignvec; + +/* Capture in struct and in a vector*/ +typedef struct Typealignset { + Alignment charalign; /* char*/ + Alignment ucharalign; /* unsigned char*/ + Alignment shortalign; /* short*/ + Alignment ushortalign; /* unsigned short*/ + Alignment intalign; /* int*/ + Alignment uintalign; /* unsigned int*/ + Alignment longalign; /* long*/ + Alignment ulongalign; /* unsigned long*/ + Alignment longlongalign; /* long long*/ + Alignment ulonglongalign; /* unsigned long long*/ + Alignment floatalign; /* float*/ + Alignment doublealign; /* double*/ + Alignment ptralign; /* void**/ + Alignment ncvlenalign; /* nc_vlen_t*/ +} Typealignset; + +static Typealignvec vec[NCTYPES]; +static Typealignset set; + +static void +compute_alignments(void) +{ + /* Compute the alignments for all the common C data types*/ + /* First for the struct*/ + /* initialize*/ + memset((void*)&set,0,sizeof(set)); + memset((void*)vec,0,sizeof(vec)); + + COMP_ALIGNMENT(set.charalign,char); + COMP_ALIGNMENT(set.ucharalign,unsigned char); + COMP_ALIGNMENT(set.shortalign,short); + COMP_ALIGNMENT(set.ushortalign,unsigned short); + COMP_ALIGNMENT(set.intalign,int); + COMP_ALIGNMENT(set.uintalign,unsigned int); + COMP_ALIGNMENT(set.longalign,long); + COMP_ALIGNMENT(set.ulongalign,unsigned long); + COMP_ALIGNMENT(set.longlongalign,long long); + COMP_ALIGNMENT(set.ulonglongalign,unsigned long long); + COMP_ALIGNMENT(set.floatalign,float); + COMP_ALIGNMENT(set.doublealign,double); + COMP_ALIGNMENT(set.ptralign,void*); + COMP_ALIGNMENT(set.ncvlenalign,nc_vlen_t); + + /* Then the vector*/ + COMP_ALIGNMENT(vec[CHARINDEX],char); + COMP_ALIGNMENT(vec[UCHARINDEX],unsigned char); + COMP_ALIGNMENT(vec[SHORTINDEX],short); + COMP_ALIGNMENT(vec[USHORTINDEX],unsigned short); + COMP_ALIGNMENT(vec[INTINDEX],int); + COMP_ALIGNMENT(vec[UINTINDEX],unsigned int); + COMP_ALIGNMENT(vec[LONGINDEX],long); + COMP_ALIGNMENT(vec[ULONGINDEX],unsigned long); + COMP_ALIGNMENT(vec[LONGLONGINDEX],long long); + COMP_ALIGNMENT(vec[ULONGLONGINDEX],unsigned long long); + COMP_ALIGNMENT(vec[FLOATINDEX],float); + COMP_ALIGNMENT(vec[DOUBLEINDEX],double); + COMP_ALIGNMENT(vec[PTRINDEX],void*); + COMP_ALIGNMENT(vec[NCVLENINDEX],nc_vlen_t); +} + +static size_t +nctypealignment(nc_type nctype) +{ + Alignment* align = NULL; + int index = 0; + switch (nctype) { + case NC_BYTE: index = UCHARINDEX; break; + case NC_CHAR: index = CHARINDEX; break; + case NC_SHORT: index = SHORTINDEX; break; + case NC_INT: index = INTINDEX; break; + case NC_FLOAT: index = FLOATINDEX; break; + case NC_DOUBLE: index = DOUBLEINDEX; break; + case NC_UBYTE: index = UCHARINDEX; break; + case NC_USHORT: index = USHORTINDEX; break; + case NC_UINT: index = UINTINDEX; break; + case NC_INT64: index = LONGLONGINDEX; break; + case NC_UINT64: index = ULONGLONGINDEX; break; + case NC_STRING: index = PTRINDEX; break; + case NC_VLEN: index = NCVLENINDEX; break; + case NC_OPAQUE: index = UCHARINDEX; break; + default: assert(0); + } + align = &vec[index]; + return align->alignment; +} + +static int +getpadding(int offset, int alignment) +{ + int rem = (alignment==0?0:(offset % alignment)); + int pad = (rem==0?0:(alignment - rem)); + return pad; +} + +/* Find first primitive field of a possibly nested sequence of compounds */ +static nc_type +findfirstfield(int ncid, nc_type xtype) +{ + int status = NC_NOERR; + nc_type fieldtype = xtype; + if(xtype <= NC_MAX_ATOMIC_TYPE) goto done; + + status = nc_inq_compound_fieldtype(ncid, xtype, 0, &fieldtype); + if(status != NC_NOERR) goto done; + fieldtype = findfirstfield(ncid,fieldtype); + +done: + return (status == NC_NOERR?fieldtype:NC_NAT); +} + +static int +computefieldinfo(struct NCAUX_CMPD* cmpd) +{ + int i; + int status = NC_NOERR; + size_t offset = 0; + size_t totaldimsize; + + /* Assign the sizes for the fields */ + for(i=0;infields;i++) { + struct NCAUX_FIELD* field = &cmpd->fields[i]; + status = nc_inq_type(cmpd->ncid,field->fieldtype,NULL,&field->size); + if(status != NC_NOERR) goto done; + totaldimsize = dimproduct(field->ndims,field->dimsizes); + field->size *= totaldimsize; + } + + for(offset=0,i=0;infields;i++) { + struct NCAUX_FIELD* field = &cmpd->fields[i]; + int alignment = 0; + nc_type firsttype = findfirstfield(cmpd->ncid,field->fieldtype); + + /* only support 'c' alignment for now*/ + switch (field->fieldtype) { + case NC_OPAQUE: + field->alignment = 1; + break; + case NC_ENUM: + field->alignment = nctypealignment(firsttype); + break; + case NC_VLEN: /*fall thru*/ + case NC_COMPOUND: + field->alignment = nctypealignment(firsttype); + break; + default: + field->alignment = nctypealignment(field->fieldtype); + break; + } + offset += getpadding(offset,alignment); + field->offset = offset; + offset += field->size; + } + cmpd->size = offset; + cmpd->alignment = cmpd->fields[0].alignment; + +done: + return status; +} diff --git a/extern/src_netcdf4/ncaux.h b/extern/src_netcdf4/ncaux.h new file mode 100644 index 0000000..876647a --- /dev/null +++ b/extern/src_netcdf4/ncaux.h @@ -0,0 +1,25 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Id$ + * $Header$ + *********************************************************************/ + +#ifndef NCAUX_H +#define NCAUX_H + +#define NCAUX_ALIGN_C 0 +#define NCAUX_ALIGN_UNIFORM 1 + +extern int ncaux_begin_compound(int ncid, const char *name, int alignmode, + void** tag); + +extern int ncaux_end_compound(void* tag, nc_type* typeid); + +extern int ncaux_abort_compound(void* tag); + +extern int ncaux_add_field(void* tag, const char *name, nc_type field_type, + int ndims, const int* dimsizes); + +#endif /*NCAUX_H*/ + diff --git a/extern/src_netcdf4/ncbytes.c b/extern/src_netcdf4/ncbytes.c new file mode 100644 index 0000000..6770077 --- /dev/null +++ b/extern/src_netcdf4/ncbytes.c @@ -0,0 +1,191 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include +#include +#include + +#include "ncbytes.h" + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define DEFAULTALLOC 1024 +#define ALLOCINCR 1024 + +static int ncbytesdebug = 1; + +static long +ncbytesfail(void) +{ + fflush(stdout); + fprintf(stderr,"bytebuffer failure\n"); + fflush(stderr); + if(ncbytesdebug) abort(); + return FALSE; +} + +NCbytes* +ncbytesnew(void) +{ + NCbytes* bb = (NCbytes*)malloc(sizeof(NCbytes)); + if(bb == NULL) return (NCbytes*)ncbytesfail(); + bb->alloc=0; + bb->length=0; + bb->content=NULL; + bb->nonextendible = 0; + return bb; +} + +int +ncbytessetalloc(NCbytes* bb, unsigned int sz) +{ + char* newcontent; + if(bb == NULL) return ncbytesfail(); + if(sz <= 0) {sz = (bb->alloc?2*bb->alloc:DEFAULTALLOC);} + if(bb->alloc >= sz) return TRUE; + if(bb->nonextendible) return ncbytesfail(); + newcontent=(char*)calloc(sz,sizeof(char)); + if(bb->alloc > 0 && bb->length > 0 && bb->content != NULL) { + memcpy((void*)newcontent,(void*)bb->content,sizeof(char)*bb->length); + } + if(bb->content != NULL) free(bb->content); + bb->content=newcontent; + bb->alloc=sz; + return TRUE; +} + +void +ncbytesfree(NCbytes* bb) +{ + if(bb == NULL) return; + if(!bb->nonextendible && bb->content != NULL) free(bb->content); + free(bb); +} + +int +ncbytessetlength(NCbytes* bb, unsigned int sz) +{ + if(bb == NULL) return ncbytesfail(); + if(sz > bb->alloc) {if(!ncbytessetalloc(bb,sz)) return ncbytesfail();} + bb->length = sz; + return TRUE; +} + +int +ncbytesfill(NCbytes* bb, char fill) +{ + unsigned int i; + if(bb == NULL) return ncbytesfail(); + for(i=0;ilength;i++) bb->content[i] = fill; + return TRUE; +} + +int +ncbytesget(NCbytes* bb, unsigned int index) +{ + if(bb == NULL) return -1; + if(index >= bb->length) return -1; + return bb->content[index]; +} + +int +ncbytesset(NCbytes* bb, unsigned int index, char elem) +{ + if(bb == NULL) return ncbytesfail(); + if(index >= bb->length) return ncbytesfail(); + bb->content[index] = elem; + return TRUE; +} + +int +ncbytesappend(NCbytes* bb, char elem) +{ + if(bb == NULL) return ncbytesfail(); + if(bb->length >= bb->alloc) if(!ncbytessetalloc(bb,0)) return ncbytesfail(); + bb->content[bb->length] = elem; + bb->length++; + return TRUE; +} + +/* This assumes s is a null terminated string*/ +int +ncbytescat(NCbytes* bb, char* s) +{ + ncbytesappendn(bb,(void*)s,strlen(s)+1); /* include trailing null*/ + /* back up over the trailing null*/ + if(bb->length == 0) return ncbytesfail(); + bb->length--; + return 1; +} + +int +ncbytesappendn(NCbytes* bb, void* elem, unsigned int n) +{ + if(bb == NULL || elem == NULL) return ncbytesfail(); + if(n == 0) {n = strlen((char*)elem);} + while(!ncbytesavail(bb,n)) {if(!ncbytessetalloc(bb,0)) return ncbytesfail();} + memcpy((void*)&bb->content[bb->length],(void*)elem,n); + bb->length += n; + return TRUE; +} + +int +ncbytesprepend(NCbytes* bb, char elem) +{ + int i; /* do not make unsigned */ + if(bb == NULL) return ncbytesfail(); + if(bb->length >= bb->alloc) if(!ncbytessetalloc(bb,0)) return ncbytesfail(); + /* could we trust memcpy? instead */ + for(i=bb->alloc;i>=1;i--) {bb->content[i]=bb->content[i-1];} + bb->content[0] = elem; + bb->length++; + return TRUE; +} + +char* +ncbytesdup(NCbytes* bb) +{ + char* result = (char*)malloc(bb->length+1); + memcpy((void*)result,(const void*)bb->content,bb->length); + result[bb->length] = '\0'; /* just in case it is a string*/ + return result; +} + +char* +ncbytesextract(NCbytes* bb) +{ + char* result = bb->content; + bb->alloc = 0; + bb->length = 0; + bb->content = NULL; + return result; +} + +int +ncbytessetcontents(NCbytes* bb, char* contents, unsigned int alloc) +{ + if(bb == NULL) return ncbytesfail(); + ncbytesclear(bb); + if(!bb->nonextendible && bb->content != NULL) free(bb->content); + bb->content = contents; + bb->length = 0; + bb->alloc = alloc; + bb->nonextendible = 1; + return 1; +} + +/* Null terminate the byte string without extending its length */ +/* For debugging */ +int +ncbytesnull(NCbytes* bb) +{ + ncbytesappend(bb,'\0'); + bb->length--; + return 1; +} + diff --git a/extern/src_netcdf4/ncbytes.h b/extern/src_netcdf4/ncbytes.h new file mode 100644 index 0000000..09700af --- /dev/null +++ b/extern/src_netcdf4/ncbytes.h @@ -0,0 +1,58 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef NCBYTES_H +#define NCBYTES_H 1 + +typedef struct NCbytes { + int nonextendible; /* 1 => fail if an attempt is made to extend this buffer*/ + unsigned int alloc; + unsigned int length; + char* content; +} NCbytes; + +#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS) +#define EXTERNC extern "C" +#else +#define EXTERNC extern +#endif + +EXTERNC NCbytes* ncbytesnew(void); +EXTERNC void ncbytesfree(NCbytes*); +EXTERNC int ncbytessetalloc(NCbytes*,unsigned int); +EXTERNC int ncbytessetlength(NCbytes*,unsigned int); +EXTERNC int ncbytesfill(NCbytes*, char fill); + +/* Produce a duplicate of the contents*/ +EXTERNC char* ncbytesdup(NCbytes*); +/* Extract the contents and leave buffer empty */ +EXTERNC char* ncbytesextract(NCbytes*); + +/* Return the ith byte; -1 if no such index */ +EXTERNC int ncbytesget(NCbytes*,unsigned int); +/* Set the ith byte */ +EXTERNC int ncbytesset(NCbytes*,unsigned int,char); + +/* Append one byte */ +EXTERNC int ncbytesappend(NCbytes*,char); /* Add at Tail */ +/* Append n bytes */ +EXTERNC int ncbytesappendn(NCbytes*,void*,unsigned int); /* Add at Tail */ + +/* Null terminate the byte string without extending its length (for debugging) */ +EXTERNC int ncbytesnull(NCbytes*); + +/* Concatenate a null-terminated string to the end of the buffer */ +EXTERNC int ncbytescat(NCbytes*,char*); + +/* Set the contents of the buffer; mark the buffer as non-extendible */ +EXTERNC int ncbytessetcontents(NCbytes*, char*, unsigned int); + +/* Following are always "in-lined"*/ +#define ncbyteslength(bb) ((bb)?(bb)->length:0U) +#define ncbytesalloc(bb) ((bb)?(bb)->alloc:0U) +#define ncbytescontents(bb) ((bb && bb->content)?(bb)->content:(char*)"") +#define ncbytesextend(bb,len) ncbytessetalloc((bb),(len)+(bb->alloc)) +#define ncbytesclear(bb) ((bb)?(bb)->length=0:0U) +#define ncbytesavail(bb,n) ((bb)?((bb)->alloc - (bb)->length) >= (n):0U) + +#endif /*NCBYTES_H*/ diff --git a/extern/src_netcdf4/nccommon.h b/extern/src_netcdf4/nccommon.h new file mode 100644 index 0000000..30ea32f --- /dev/null +++ b/extern/src_netcdf4/nccommon.h @@ -0,0 +1,333 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libnccommon/nccommon.h,v 1.40 2010/05/30 19:45:52 dmh Exp $ + *********************************************************************/ +#ifndef NCCOMMON_H +#define NCCOMMON_H 1 + +/* Mnemonics */ +#ifndef BOOL +#define BOOL int +#endif +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#ifndef nullfree +#define nullfree(m) {if((m)!=NULL) {free(m);} else {}} +#endif + + +#define FILLCONSTRAINT TRUE + + +/* Use an extended version of the netCDF-4 type system */ +#define NC_URL 50 +#define NC_SET 51 +/* Merge relevant translations of OC types */ +#define NC_Dataset 52 +#define NC_Sequence 53 +#define NC_Structure 54 +#define NC_Grid 55 +#define NC_Dimension 56 +#define NC_Primitive 57 + +#undef OCCOMPILEBYDEFAULT + +#define DEFAULTSTRINGLENGTH 64 +/* The sequence limit default is zero because + most servers do not implement projections + on sequences. +*/ +#define DEFAULTSEQLIMIT 0 + +/**************************************************/ +/* sigh, do the forwards */ +struct NCDAPCOMMON; +struct NCprojection; +struct NCselection; +struct Getvara; +struct NCcachenode; +struct NCcache; +struct NCslice; +struct NCsegment; +struct OClist; +/**************************************************/ +/* +Collect single bit flags that +affect the operation of the system. +*/ + +typedef unsigned int NCFLAGS; +# define SETFLAG(controls,flag) ((controls.flags) |= (flag)) +# define CLRFLAG(controls,flag) ((controls.flags) &= ~(flag)) +# define FLAGSET(controls,flag) (((controls.flags) & (flag)) != 0) + +/* Defined flags */ +#define NCF_NC3 (0x0001) /* DAP->netcdf-3 */ +#define NCF_NC4 (0x0002) /* DAP->netcdf-4 */ +#define NCF_NCDAP (0x0004) /* Do libnc-dap mimic */ +#define NCF_CACHE (0x0008) /* Cache enabled/disabled */ +#define NCF_PREFETCH (0x0010) /* Cache prefetch enabled/disabled */ +#define NCF_UPGRADE (0x0020) /* Do proper type upgrades */ +#define NCF_UNCONSTRAINABLE (0x0040) /* Not a constrainable URL */ +#define NCF_SHOWFETCH (0x0080) /* show fetch calls */ +#define NCF_ONDISK (0x0100) /* cause oc to store data on disk */ +#define NCF_WHOLEVAR (0x0200) /* retrieve only whole variables (as opposed to partial variable) + into cache */ + +/* Define all the default on flags */ +#define DFALT_ON_FLAGS (NCF_PREFETCH) + +typedef struct NCCONTROLS { + NCFLAGS flags; +} NCCONTROLS; + +struct NCTMODEL { + int translation; + char* model; + unsigned int flags; +}; + +/* Detail information about each cache item */ +typedef struct NCcachenode { + int wholevariable; /* does this node only have wholevariables? */ + int prefetch; /* is this the prefetch cache entry? */ + size_t xdrsize; + DCEconstraint* constraint; /* as used to create this node */ + NClist* vars; /* vars potentially covered by this cache node */ + struct CDFnode* datadds; + OCobject ocroot; + OCdata content; +} NCcachenode; + +/* All cache info */ +typedef struct NCcache { + size_t cachelimit; /* max total size for all cached entries */ + size_t cachesize; /* current size */ + size_t cachecount; /* max # nodes in cache */ + NCcachenode* prefetch; + NClist* nodes; /* cache nodes other than prefetch */ +} NCcache; + +/**************************************************/ +/* The DAP packet info from OC */ +typedef struct NCOC { + OCconnection conn; + char* rawurltext; /* as given to nc3d_open */ + char* urltext; /* as modified by nc3d_open */ + NC_URI* url; /* parse of rawuritext */ + OCobject ocdasroot; + DCEconstraint* dapconstraint; /* from url */ + int inmemory; /* store fetched data in memory? */ +} NCOC; + +typedef struct NCCDF { + struct CDFnode* ddsroot; /* constrained dds */ + struct CDFnode* fullddsroot; /* unconstrained dds */ + /* Collected sets of useful nodes (in ddsroot tree space) */ + NClist* varnodes; /* nodes which can represent netcdf variables */ + NClist* seqnodes; /* sequence nodes; */ + NClist* gridnodes; /* grid nodes */ + NClist* dimnodes; /* (base) dimension nodes */ + unsigned int defaultstringlength; + unsigned int defaultsequencelimit; /* global sequence limit;0=>no limit */ + struct NCcache* cache; + size_t fetchlimit; + size_t smallsizelimit; /* what constitutes a small object? */ + size_t totalestimatedsize; + const char* separator; /* constant; do not free */ + /* global string dimension */ + struct CDFnode* globalstringdim; + char* recorddimname; /* From DODS_EXTRA */ + struct CDFnode* recorddim; + /* libncdap4 only */ + NClist* usertypes; /* nodes which will represent netcdf types */ +} NCCDF; + +/* Define a structure holding common info for NCDAP{3,4} */ + +typedef struct NCDAPCOMMON { + NC* controller; /* Parent instance of NCDAPCOMMON */ + NCCDF cdf; + NCOC oc; + NCCONTROLS controls; /* Control flags and parameters */ +} NCDAPCOMMON; + +/**************************************************/ +/* Create our own node tree to mimic ocnode trees*/ + +/* Each root CDFnode contains info about the whole tree */ +typedef struct CDFtree { + OCobject ocroot; + OCdxd occlass; + NClist* nodes; /* all nodes in tree*/ + struct CDFnode* root; /* cross link */ + struct NCDAPCOMMON* owner; + /* Classification flags */ + int regridded; /* Was this tree passed thru regrid3? */ +} CDFtree; + +/* Track the kinds of dimensions */ +typedef int CDFdimflags; +#define CDFDIMNORMAL 0x0 +#define CDFDIMSEQ 0x1 +#define CDFDIMSTRING 0x2 +#define CDFDIMCLONE 0x4 +#define CDFDIMRECORD 0x20 + +#define DIMFLAG(d,flag) ((d)->dim.dimflags & (flag)) +#define DIMFLAGSET(d,flag) ((d)->dim.dimflags |= (flag)) +#define DIMFLAGCLR(d,flag) ((d)->dim.dimflags &= ~(flag)) + +typedef struct CDFdim { + CDFdimflags dimflags; + struct CDFnode* basedim; /* for duplicate dimensions*/ + struct CDFnode* array; /* parent array node */ + size_t declsize; /* from constrained DDS*/ + size_t declsize0; /* from unconstrained DDS*/ + int index1; /* dimension name index +1; 0=>no index */ +} CDFdim; + +typedef struct CDFarray { + NClist* dimsetall; /* inherited+originals+pseudo */ + NClist* dimsetplus; /* originals+pseudo */ + NClist* dimset0; /* original dims from the dds */ + struct CDFnode* stringdim; + /* Track sequence related information */ + struct CDFnode* seqdim; /* if this node is a sequence */ + /* note: unlike string dim; seqdim is also stored in dimensions vector */ + struct CDFnode* sequence; /* containing usable sequence, if any */ + struct CDFnode* basevar; /* for duplicate grid variables*/ +} CDFarray; + +typedef struct NCattribute { + char* name; + nc_type etype; /* dap type of the attribute */ + NClist* values; /* strings come from the oc values */ + int invisible; /* Do not materialize to the user */ +} NCattribute; + +/* Extend as additional DODS attribute values are defined */ +typedef struct NCDODS { + size_t maxstrlen; + char* dimname; +} NCDODS; + +typedef struct NCalignment { + unsigned long size; /* size of single instance of this type*/ + unsigned long alignment; /* alignment of this field */ + unsigned long offset; /* offset of this field in parent */ +} NCalignment; + +typedef struct NCtypesize { + BOOL aligned; /* have instance and field been defined? */ + NCalignment instance; /* Alignment, etc for instance data */ + NCalignment field; /* Alignment, etc WRT to parent */ +} NCtypesize; + +/* Closely mimics struct OCnode*/ +typedef struct CDFnode { + nc_type nctype; /* e.g. var, dimension */ + nc_type etype; /* e.g. NC_INT, NC_FLOAT if applicable,*/ + char* ocname; /* oc base name */ + char* ncbasename; /* generally cdflegalname(ocname) */ + char* ncfullname; /* complete path name from root to this node*/ + OCobject ocnode; /* oc mirror node*/ + struct CDFnode* group; /* null => in root group */ + struct CDFnode* container; /* e.g. struct or sequence, but not group */ + struct CDFnode* root; + CDFtree* tree; /* root level metadata;only defined if root*/ + CDFdim dim; /* nctype == dimension */ + CDFarray array; /* nctype == grid,var,etc. with dimensions */ + NClist* subnodes; /* if nctype == grid, sequence, etc. */ + NClist* attributes; /*NClist*/ + NCDODS dodsspecial; /* special attributes like maxStrlen */ + nc_type externaltype; /* the type as represented to nc_inq*/ + int ncid; /* relevant NC id for this object*/ + unsigned long maxstringlength; + unsigned long sequencelimit; /* 0=>unlimited */ + BOOL usesequence; /* If this sequence is usable */ + BOOL elided; /* 1 => node does not partipate in naming*/ + struct CDFnode* basenode; /* derived tree map to template tree */ + BOOL visible; /* 1 => node is present in derived tree; independent of elided flag */ + BOOL zerodim; /* 1 => node has a zero dimension */ + /* These two flags track the effects on grids of constraints */ + BOOL virtual; /* node added by regrid */ +#ifdef PROJECTED + BOOL projected; /* node referenced by projection */ +#endif + struct CDFnode* attachment; /* DDS<->DATADDS cross link*/ + struct CDFnode* template; /* temporary field for regridding */ + /* Fields for use by libncdap4 */ + NCtypesize typesize; + int typeid; /* when treating field as type */ + int basetypeid; /* when typeid is vlen */ + char* typename; + char* vlenname; /* for sequence types */ + int singleton; /* for singleton sequences */ + unsigned long estimatedsize; /* > 0 Only for var nodes */ +} CDFnode; + +/**************************************************/ +/* Shared procedures */ + +/* From ncdap3.c*/ +extern NCerror freeNCDAPCOMMON(struct NCDAPCOMMON*); +extern NCerror fetchtemplatemetadata3(NCDAPCOMMON*); + +/* From error.c*/ +extern NCerror ocerrtoncerr(OCerror); + +/* From: common34.c */ +extern NCerror fixgrid34(struct NCDAPCOMMON* drno, CDFnode* grid); +extern NCerror computecdfinfo34(struct NCDAPCOMMON*, NClist*); +extern char* cdfname34(char* basename); +extern NCerror augmentddstree34(struct NCDAPCOMMON*, NClist*); +extern NCerror computecdfdimnames34(struct NCDAPCOMMON*); +extern NCerror buildcdftree34(struct NCDAPCOMMON*, OCobject, OCdxd, CDFnode**); +extern CDFnode* makecdfnode34(struct NCDAPCOMMON*, char* nm, OCtype, + /*optional*/ OCobject ocnode, CDFnode* container); +extern void freecdfroot34(CDFnode*); + +extern NCerror findnodedds34(struct NCDAPCOMMON* drno, CDFnode* ddssrc); +extern NCerror makegetvar34(struct NCDAPCOMMON*, struct CDFnode*, void*, nc_type, struct Getvara**); +extern NCerror applyclientparams34(struct NCDAPCOMMON* drno); +extern NCerror attach34(CDFnode* xroot, CDFnode* ddstarget); +extern NCerror attachall34(CDFnode* xroot, CDFnode* ddsroot); +extern NCerror attachsubset34(CDFnode*, CDFnode*); +extern void unattach34(CDFnode*); +extern int nodematch34(CDFnode* node1, CDFnode* node2); +extern int simplenodematch34(CDFnode* node1, CDFnode* node2); +extern CDFnode* findxnode34(CDFnode* target, CDFnode* xroot); +extern int constrainable34(NC_URI*); +extern char* makeconstraintstring34(DCEconstraint*); +extern size_t estimatedataddssize34(CDFnode* datadds); +extern void canonicalprojection34(NClist*, NClist*); +extern NClist* getalldims34(NCDAPCOMMON* nccomm, int visibleonly); + +/* From cdf3.c */ +extern NCerror dimimprint3(NCDAPCOMMON*); +extern NCerror definedimsets3(struct NCDAPCOMMON*); + +/* From cache.c */ +extern int iscached(NCDAPCOMMON*, CDFnode* target, NCcachenode** cachenodep); +extern NCerror prefetchdata3(NCDAPCOMMON*); +extern NCerror buildcachenode34(NCDAPCOMMON*, + DCEconstraint* constraint, + NClist* varlist, + NCcachenode** cachep, + int isprefetch); +extern NCcachenode* createnccachenode(void); +extern void freenccachenode(NCDAPCOMMON*, NCcachenode* node); +extern NCcache* createnccache(void); +extern void freenccache(NCDAPCOMMON*, NCcache* cache); + +/* Add an extra function whose sole purpose is to allow + configure(.ac) to test for the presence of thiscode. +*/ +extern int nc__opendap(void); + +#endif /*NCCOMMON_H*/ diff --git a/extern/src_netcdf4/ncconfigure.h b/extern/src_netcdf4/ncconfigure.h new file mode 100644 index 0000000..6a554d7 --- /dev/null +++ b/extern/src_netcdf4/ncconfigure.h @@ -0,0 +1,58 @@ +/* + * Copyright 2010 University Corporation for Atmospheric + * Research/Unidata. See COPYRIGHT file for more info. + * + * This header file is for the parallel I/O functions of netCDF. + * + */ +/* "$Id: netcdf_par.h,v 1.1 2010/06/01 15:46:49 ed Exp $" */ + +#ifndef NCCONFIGURE_H +#define NCCONFIGURE_H 1 + +/* +This is included in bottom +of config.h. It is where, +typically, alternatives to +missing functions should be +defined. +*/ + +#ifndef HAVE_STRDUP +extern char* strdup(const char*); +#endif + +/* handle null arguments */ +#ifndef nulldup +#ifdef HAVE_STRDUP +#define nulldup(s) ((s)==NULL?NULL:strdup(s)) +#else +char *nulldup(const char* s); +#endif +#endif + + +#ifndef nulldup +#define nulldup(s) ((s)==NULL?NULL:strdup(s)) +#endif +#ifndef nulllen +#define nulllen(s) ((s)==NULL?0:strlen(s)) +#endif +#ifndef nullfree +#define nullfree(s) {if((s)!=NULL) {free(s);} else {}} +#endif + +#ifndef HAVE_UCHAR +typedef unsigned char uchar; +#endif + +#ifndef HAVE_LONGLONG +typedef long long longlong; +typedef unsigned long long ulonglong; +#endif + +#ifndef HAVE_UINT +typedef unsigned int uint; +#endif + +#endif /* NCCONFIGURE_H */ diff --git a/extern/src_netcdf4/ncd3dispatch.c b/extern/src_netcdf4/ncd3dispatch.c new file mode 100644 index 0000000..1d0d994 --- /dev/null +++ b/extern/src_netcdf4/ncd3dispatch.c @@ -0,0 +1,218 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/ncd3dispatch.c,v 1.7 2010/05/27 21:34:09 dmh Exp $ + *********************************************************************/ + +#include "config.h" +#include +#include + +#include "nc.h" +#include "ncdap3.h" +#include "ncdispatch.h" +#include "ncd3dispatch.h" + +static int +NCD3_create(const char *path, int cmode, + size_t initialsz, int basepe, size_t *chunksizehintp, + int use_parallel, void* mpidata, + NC_Dispatch*,NC** ncp); + +static int NCD3_redef(int ncid); +static int NCD3__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, size_t r_align); +static int NCD3_sync(int ncid); +static int NCD3_abort(int ncid); + +static int NCD3_put_vara(int ncid, int varid, + const size_t *start, const size_t *edges0, + const void *value0, + nc_type memtype); + +static int NCD3_get_vara(int ncid, int varid, + const size_t *start, const size_t *edges, + void *value, + nc_type memtype); + +static int NCD3_put_vars(int ncid, int varid, + const size_t *start, const size_t *edges, const ptrdiff_t* stride, + const void *value0, nc_type memtype); + +static int NCD3_get_vars(int ncid, int varid, + const size_t *start, const size_t *edges, const ptrdiff_t* stride, + void *value, nc_type memtype); + +NC_Dispatch NCD3_dispatch_base = { + +NC_DISPATCH_NC3 | NC_DISPATCH_NCD, + +/* Note: we are using the standard substrate struct NC creator */ +NULL, + +NCD3_create, +NCD3_open, + +NCD3_redef, +NCD3__enddef, +NCD3_sync, +NCD3_abort, +NCD3_close, +NULL, /*set_fill*/ +NULL, /*inq_base_pe*/ +NULL, /*set_base_pe*/ +NULL, /*inq_format*/ + +NULL, /*inq*/ +NULL, /*inq_type*/ + +NULL, /*def_dim*/ +NULL, /*inq_dimid*/ +NULL, /*inq_dim*/ +NULL, /*inq_unlimdim*/ +NULL, /*rename_dim*/ + +NULL, /*inq_att*/ +NULL, /*inq_attid*/ +NULL, /*inq_attname*/ +NULL, /*rename_att*/ +NULL, /*del_att*/ +NULL, /*get_att*/ +NULL, /*put_att*/ + +NULL, /*def_var*/ +NULL, /*inq_varid*/ +NULL, /*rename_var*/ +NCD3_get_vara, +NCD3_put_vara, +NCD3_get_vars, +NCD3_put_vars, +NCDEFAULT_get_varm, +NCDEFAULT_put_varm, + +NULL, /*inq_var_all*/ + +#ifdef USE_NETCDF4 +NULL, /*show_metadata*/ +NULL, /*inq_unlimdims*/ +NULL, /*var_par_access*/ +NULL, /*inq_ncid*/ +NULL, /*inq_grps*/ +NULL, /*inq_grpname*/ +NULL, /*inq_grpname_full*/ +NULL, /*inq_grp_parent*/ +NULL, /*inq_grp_full_ncid*/ +NULL, /*inq_varids*/ +NULL, /*inq_dimids*/ +NULL, /*inq_typeids*/ +NULL, /*inq_type_equal*/ +NULL, /*def_grp*/ +NULL, /*inq_user_type*/ +NULL, /*inq_typeid*/ + +NULL, /*def_compound*/ +NULL, /*insert_compound*/ +NULL, /*insert_array_compound*/ +NULL, /*inq_compound_field*/ +NULL, /*inq_compound_fieldindex*/ +NULL, /*def_vlen*/ +NULL, /*put_vlen_element*/ +NULL, /*get_vlen_element*/ +NULL, /*def_enum*/ +NULL, /*insert_enum*/ +NULL, /*inq_enum_member*/ +NULL, /*inq_enum_ident*/ +NULL, /*def_opaque*/ +NULL, /*def_var_deflate*/ +NULL, /*def_var_fletcher32*/ +NULL, /*def_var_chunking*/ +NULL, /*def_var_fill*/ +NULL, /*def_var_endian*/ +NULL, /*set_var_chunk_cache*/ +NULL, /*get_var_chunk_cache*/ + +#endif /*USE_NETCDF4*/ + +}; + +NC_Dispatch* NCD3_dispatch_table = NULL; /* moved here from ddispatch.c */ + +NC_Dispatch NCD3_dispatcher; /* overlay result */ + +int +NCD3_initialize(void) +{ + /* Create our dispatch table as the merge of NCD3 table and NCSUBSTRATE */ + /* watch the order because we want NCD3 to overwrite NCSUBSTRATE */ + NC_dispatch_overlay(&NCD3_dispatch_base, NCSUBSTRATE_dispatch_table, &NCD3_dispatcher); + NCD3_dispatch_table = &NCD3_dispatcher; + return NC_NOERR; +} + +static int +NCD3_redef(int ncid) +{ + return (NC_EPERM); +} + +static int +NCD3__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, size_t r_align) +{ + return (NC_EPERM); +} + +static int +NCD3_sync(int ncid) +{ + return (NC_EINVAL); +} + +static int +NCD3_abort(int ncid) +{ + return NCD3_close(ncid); +} + +static int +NCD3_create(const char *path, int cmode, + size_t initialsz, int basepe, size_t *chunksizehintp, + int use_parallel, void* mpidata, + NC_Dispatch* dispatch, NC** ncp) +{ + return NC_EPERM; +} + +static int +NCD3_put_vara(int ncid, int varid, + const size_t *start, const size_t *edges, + const void *value, + nc_type memtype) +{ + return NC_EPERM; +} + +static int +NCD3_get_vara(int ncid, int varid, + const size_t *start, const size_t *edges, + void *value, + nc_type memtype) +{ + int stat = nc3d_getvarx(ncid, varid, start, edges, nc_ptrdiffvector1, value,memtype); + return stat; +} + +static int +NCD3_put_vars(int ncid, int varid, + const size_t *start, const size_t *edges, const ptrdiff_t* stride, + const void *value0, nc_type memtype) +{ + return NC_EPERM; +} + +static int +NCD3_get_vars(int ncid, int varid, + const size_t *start, const size_t *edges, const ptrdiff_t* stride, + void *value, nc_type memtype) +{ + int stat = nc3d_getvarx(ncid, varid, start, edges, stride, value, memtype); + return stat; +} diff --git a/extern/src_netcdf4/ncd3dispatch.h b/extern/src_netcdf4/ncd3dispatch.h new file mode 100644 index 0000000..d1d6765 --- /dev/null +++ b/extern/src_netcdf4/ncd3dispatch.h @@ -0,0 +1,67 @@ +/* + * Copyright 1993-1996 University Corporation for Atmospheric Research/Unidata + * + * Portions of this software were developed by the Unidata Program at the + * University Corporation for Atmospheric Research. + * + * Access and use of this software shall impose the following obligations + * and understandings on the user. The user is granted the right, without + * any fee or cost, to use, copy, modify, alter, enhance and distribute + * this software, and any derivative works thereof, and its supporting + * documentation for any purpose whatsoever, provided that this entire + * notice appears in all copies of the software, derivative works and + * supporting documentation. Further, UCAR requests that the user credit + * UCAR/Unidata in any publications that result from the use of this + * software or in any product that includes this software. The names UCAR + * and/or Unidata, however, may not be used in any advertising or publicity + * to endorse or promote any products or commercial entity unless specific + * written permission is obtained from UCAR/Unidata. The user also + * understands that UCAR/Unidata is not obligated to provide the user with + * any support, consulting, training or assistance of any kind with regard + * to the use, operation and performance of this software nor to provide + * the user with any updates, revisions, new versions or "bug fixes." + * + * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* "$Id: ncd3dispatch.h,v 1.3 2010/05/27 21:34:09 dmh Exp $" */ + +#ifndef _NCD3DISPATCH_H +#define _NCD3DISPATCH_H + +#include /* size_t, ptrdiff_t */ +#include "netcdf.h" +#include "ncdispatch.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +EXTERNL int +NCD3_new_nc(struct NC**); + +/* WARNING: this signature differs from external nc_open API*/ +EXTERNL int +NCD3_open(const char *path, int mode, + int basepe, size_t *chunksizehintp, + int use_parallel, void* mpidata, + struct NC_Dispatch* dispatch, NC** ncp); + +EXTERNL int +NCD3_close(int ncid); + +/* End _var */ + +extern int NCD3_initialize(void); + +#if defined(__cplusplus) +} +#endif + +#endif /*_NCD3DISPATCH_H*/ diff --git a/extern/src_netcdf4/ncdap3.c b/extern/src_netcdf4/ncdap3.c new file mode 100644 index 0000000..597aa14 --- /dev/null +++ b/extern/src_netcdf4/ncdap3.c @@ -0,0 +1,692 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/ncdap3.c,v 1.94 2010/05/28 01:05:34 dmh Exp $ + *********************************************************************/ + +#include "ncdap3.h" + +#ifdef HAVE_GETRLIMIT +# ifdef HAVE_SYS_RESOURCE_H +# include +# endif +# ifdef HAVE_SYS_RESOURCE_H +# include +# endif +#endif + +#include "nc3dispatch.h" +#include "ncd3dispatch.h" +#include "dapalign.h" +#include "dapdump.h" + +static NCerror buildncstructures3(NCDAPCOMMON*); +static NCerror builddims(NCDAPCOMMON*); +static NCerror buildvars(NCDAPCOMMON*); +static NCerror buildglobalattrs3(NCDAPCOMMON*,CDFnode* root); +static NCerror buildattribute3a(NCDAPCOMMON*, NCattribute*, nc_type, int); + + +static char* getdefinename(CDFnode* node); + +extern CDFnode* v4node; +int nc3dinitialized = 0; + +/**************************************************/ +/* Add an extra function whose sole purpose is to allow + configure(.ac) to test for the presence of thiscode. +*/ +int nc__opendap(void) {return 0;} + +/**************************************************/ +/* Do local initialization */ + +int +nc3dinitialize(void) +{ + compute_nccalignments(); + nc3dinitialized = 1; + return NC_NOERR; +} + +/**************************************************/ + +/* See ncd3dispatch.c for other version */ +int +NCD3_open(const char * path, int mode, + int basepe, size_t *chunksizehintp, + int useparallel, void* mpidata, + NC_Dispatch* dispatch, NC** ncpp) +{ + NCerror ncstat = NC_NOERR; + OCerror ocstat = OC_NOERR; + NC* drno = NULL; + NCDAPCOMMON* dapcomm = NULL; + const char* value; + /* We will use a fake file descriptor as our internal in-memory filename */ + char tmpname[32]; + + if(!nc3dinitialized) nc3dinitialize(); + + if(path == NULL) + return NC_EDAPURL; + if(dispatch == NULL) PANIC("NC3D_open: no dispatch table"); + + /* Setup our NC and NCDAPCOMMON state*/ + drno = (NC*)calloc(1,sizeof(NC)); + if(drno == NULL) {ncstat = NC_ENOMEM; goto done;} + + /* compute an ncid */ + ncstat = add_to_NCList(drno); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + dapcomm = (NCDAPCOMMON*)calloc(1,sizeof(NCDAPCOMMON)); + if(dapcomm == NULL) {ncstat = NC_ENOMEM; goto done;} + + drno->dispatch = dispatch; + drno->dispatchdata = dapcomm; + drno->int_ncid = nc__pseudofd(); /* create a unique id */ + dapcomm->controller = (NC*)drno; + + dapcomm->cdf.separator = "."; + dapcomm->cdf.smallsizelimit = DFALTSMALLLIMIT; + dapcomm->cdf.cache = createnccache(); + +#ifdef HAVE_GETRLIMIT + { struct rlimit rl; + if(getrlimit(RLIMIT_NOFILE, &rl) >= 0) { + dapcomm->cdf.cache->cachecount = (size_t)(rl.rlim_cur / 2); + } + } +#endif + +#ifdef OCCOMPILEBYDEFAULT + /* set the compile flag by default */ + dapcomm->oc.rawurltext = (char*)emalloc(strlen(path)+strlen("[compile]")+1); + strcpy(dapcomm->oc.rawurltext,"[compile]"); + strcat(dapcomm->oc.rawurltext, path); +#else + dapcomm->oc.rawurltext = strdup(path); +#endif + + nc_uriparse(dapcomm->oc.rawurltext,&dapcomm->oc.url); + + /* parse the client parameters */ + nc_uridecodeparams(dapcomm->oc.url); + + if(!constrainable34(dapcomm->oc.url)) + SETFLAG(dapcomm->controls,NCF_UNCONSTRAINABLE); + + /* Use libsrc code for storing metadata */ + + snprintf(tmpname,sizeof(tmpname),"%d",drno->int_ncid); + /* Now, use the file to create the netcdf file */ + if(sizeof(size_t) == sizeof(unsigned int)) + ncstat = nc_create(tmpname,NC_DISKLESS,&drno->substrate); + else + ncstat = nc_create(tmpname,NC_DISKLESS|NC_64BIT_OFFSET,&drno->substrate); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + /* Avoid fill */ + nc_set_fill(drno->substrate,NC_NOFILL,NULL); + + dapcomm->oc.dapconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); + dapcomm->oc.dapconstraint->projections = nclistnew(); + dapcomm->oc.dapconstraint->selections = nclistnew(); + + /* Parse constraints to make sure they are syntactically correct */ + ncstat = parsedapconstraints(dapcomm,dapcomm->oc.url->constraint,dapcomm->oc.dapconstraint); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + /* Complain if we are unconstrainable but have constraints */ + if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { + if(dapcomm->oc.url->constraint != NULL + && strlen(dapcomm->oc.url->constraint) > 0) { + nclog(NCLOGWARN,"Attempt to constrain an unconstrainable data source: %s", + dapcomm->oc.url->constraint); + } + } + + /* Construct a url for oc minus any parameters */ + dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL, + (NC_URIALL ^ NC_URICONSTRAINTS)); + + /* Pass to OC */ + ocstat = oc_open(dapcomm->oc.urltext,&dapcomm->oc.conn); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} + + nullfree(dapcomm->oc.urltext); /* clean up */ + dapcomm->oc.urltext = NULL; + + /* process control client parameters */ + applyclientparamcontrols3(dapcomm); + + /* Turn on logging; only do this after oc_open*/ + if((value = paramvalue34(dapcomm,"log")) != NULL) { + ncloginit(); + ncsetlogging(1); + nclogopen(value); + oc_loginit(); + oc_setlogging(1); + oc_logopen(value); + } + + /* fetch and build the (almost) unconstrained DDS for use as + template */ + ncstat = fetchtemplatemetadata3(dapcomm); + if(ncstat != NC_NOERR) goto done; + + /* fetch and build the constrained DDS */ + ncstat = fetchconstrainedmetadata3(dapcomm); + if(ncstat != NC_NOERR) goto done; + +#ifdef DEBUG2 +fprintf(stderr,"constrained dds: %s\n",dumptree(dapcomm->cdf.ddsroot)); +#endif + + + /* The following actions are (mostly) WRT to the constrained tree */ + + /* Accumulate useful nodes sets */ + ncstat = computecdfnodesets3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Fix grids */ + ncstat = fixgrids3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Locate and mark usable sequences */ + ncstat = sequencecheck3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* suppress variables not in usable sequences */ + ncstat = suppressunusablevars3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* apply client parameters */ + ncstat = applyclientparams34(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Add (as needed) string dimensions*/ + ncstat = addstringdims(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + if(nclistlength(dapcomm->cdf.seqnodes) > 0) { + /* Build the sequence related dimensions */ + ncstat = defseqdims(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + } + + /* Define the dimsetplus and dimsetall lists */ + ncstat = definedimsets3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Re-compute the dimension names*/ + ncstat = computecdfdimnames34(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Deal with zero size dimensions */ + ncstat = fixzerodims3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Attempt to use the DODS_EXTRA info to turn + one of the dimensions into unlimited. + Assume computecdfdimnames34 has already been called. + */ + ncstat = defrecorddim3(dapcomm); + if(ncstat) {THROWCHK(ncstat); goto done;} + if(dapcomm->cdf.recorddimname != NULL + && nclistlength(dapcomm->cdf.seqnodes) > 0) { + /*nclog(NCLOGWARN,"unlimited dimension specified, but sequences exist in DDS");*/ + PANIC("unlimited dimension specified, but sequences exist in DDS"); + } + + /* Re-compute the var names*/ + ncstat = computecdfvarnames3(dapcomm,dapcomm->cdf.ddsroot,dapcomm->cdf.varnodes); + if(ncstat) {THROWCHK(ncstat); goto done;} + + /* Transfer data from the unconstrained DDS data to the unconstrained DDS */ + ncstat = dimimprint3(dapcomm); + if(ncstat) goto done; + + /* Process the constraints to map to the constrained CDF tree */ + /* (must follow fixgrids3 */ + ncstat = mapconstraints3(dapcomm->oc.dapconstraint,dapcomm->cdf.ddsroot); + if(ncstat != NC_NOERR) goto done; + + /* Canonicalize the constraint */ + ncstat = fixprojections(dapcomm->oc.dapconstraint->projections); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + /* Fill in segment information */ + ncstat = qualifyconstraints3(dapcomm->oc.dapconstraint); + if(ncstat != NC_NOERR) goto done; + + /* using the modified constraint, rebuild the constraint string */ + if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { + /* ignore all constraints */ + dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL,0); + } else { + char* constraintstring = buildconstraintstring3(dapcomm->oc.dapconstraint); + nc_urisetconstraints(dapcomm->oc.url,constraintstring); + nullfree(constraintstring); + dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL,NC_URICONSTRAINTS); + } + +#ifdef DEBUG +fprintf(stderr,"ncdap3: final constraint: %s\n",dapcomm->oc.url->constraint); +#endif + + /* Estimate the variable sizes */ + estimatevarsizes3(dapcomm); + + /* Build the meta data */ + ncstat = buildncstructures3(dapcomm); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + /* Do any necessary data prefetch */ + if(FLAGSET(dapcomm->controls,NCF_PREFETCH)) { + ncstat = prefetchdata3(dapcomm); + if(ncstat != NC_NOERR) { + del_from_NCList((NC*)drno); /* undefine here */ + {THROWCHK(ncstat); goto done;} + } + } + +#ifdef BUG + /* The libsrc code (NC_begins) assumes that + a created files is new and hence must have an + unlimited dimension of 0 initially, which will + wipe out the effect of the NC_set_numrecs in builddims. + There is no easy workaround, so we suppress the call + to nc_enddef + */ + ncstat = nc_enddef(drno->substrate); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} +#endif + + if(ncpp) *ncpp = (NC*)drno; + + return ncstat; + +done: + if(drno != NULL) NCD3_close(drno->ext_ncid); + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return THROW(ncstat); +} + +int +NCD3_close(int ncid) +{ + NC* drno; + NCDAPCOMMON* dapcomm; + int ncstatus = NC_NOERR; + + ncstatus = NC_check_id(ncid, (NC**)&drno); + if(ncstatus != NC_NOERR) return THROW(ncstatus); + + dapcomm = (NCDAPCOMMON*)drno->dispatchdata; + ncstatus = nc_abort(drno->substrate); + + /* remove ourselves from NClist */ + del_from_NCList(drno); + /* clean NC* */ + freeNCDAPCOMMON(dapcomm); + if(drno->path != NULL) free(drno->path); + free(drno); + return THROW(ncstatus); +} + +/**************************************************/ +static NCerror +buildncstructures3(NCDAPCOMMON* dapcomm) +{ + NCerror ncstat = NC_NOERR; + CDFnode* dds = dapcomm->cdf.ddsroot; + NC* ncsub; + NC_check_id(dapcomm->controller->substrate,&ncsub); + + ncstat = buildglobalattrs3(dapcomm,dds); + if(ncstat != NC_NOERR) goto done; + + ncstat = builddims(dapcomm); + if(ncstat != NC_NOERR) goto done; + + ncstat = buildvars(dapcomm); + if(ncstat != NC_NOERR) goto done; + +done: + return THROW(ncstat); +} + +static NCerror +builddims(NCDAPCOMMON* dapcomm) +{ + int i; + NCerror ncstat = NC_NOERR; + int dimid; + NClist* dimset = NULL; + NC* drno = dapcomm->controller; + NC* ncsub; + char* definename; + + /* collect all dimensions from variables */ + dimset = dapcomm->cdf.dimnodes; + + /* Sort by fullname just for the fun of it */ + for(;;) { + int last = nclistlength(dimset) - 1; + int swap = 0; + for(i=0;incfullname,dim2->ncfullname) > 0) { + nclistset(dimset,i,(ncelem)dim2); + nclistset(dimset,i+1,(ncelem)dim1); + swap = 1; + break; + } + } + if(!swap) break; + } + + /* Define unlimited only if needed */ + if(dapcomm->cdf.recorddim != NULL) { + CDFnode* unlimited = dapcomm->cdf.recorddim; + definename = getdefinename(unlimited); + ncstat = nc_def_dim(drno->substrate, + definename, + NC_UNLIMITED, + &unlimited->ncid); + nullfree(definename); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + /* get the id for the substrate */ + ncstat = NC_check_id(drno->substrate,&ncsub); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + + /* Set the effective size of UNLIMITED; + note that this cannot easily be done thru the normal API.*/ + NC_set_numrecs(ncsub,unlimited->dim.declsize); + } + + for(i=0;idim.basedim != NULL) continue; /* handle below */ + if(DIMFLAG(dim,CDFDIMRECORD)) continue; /* defined above */ +#ifdef DEBUG1 +fprintf(stderr,"define: dim: %s=%ld\n",dim->ncfullname,(long)dim->dim.declsize); +#endif + definename = getdefinename(dim); + ncstat = nc_def_dim(drno->substrate,definename,dim->dim.declsize,&dimid); + if(ncstat != NC_NOERR) { + THROWCHK(ncstat); goto done; + } + nullfree(definename); + dim->ncid = dimid; + } + + /* Make all duplicate dims have same dimid as basedim*/ + /* (see computecdfdimnames)*/ + for(i=0;idim.basedim != NULL) { + dim->ncid = dim->dim.basedim->ncid; + } + } +done: + nclistfree(dimset); + return THROW(ncstat); +} + +/* Simultaneously build any associated attributes*/ +/* and any necessary pseudo-dimensions for string types*/ +static NCerror +buildvars(NCDAPCOMMON* dapcomm) +{ + int i,j; + NCerror ncstat = NC_NOERR; + int varid; + NClist* varnodes = dapcomm->cdf.varnodes; + NC* drno = dapcomm->controller; + char* definename; + + ASSERT((varnodes != NULL)); + for(i=0;ivisible) continue; + if(var->array.basevar != NULL) continue; + +#ifdef DEBUG1 +fprintf(stderr,"buildvars.candidate=|%s|\n",var->ncfullname); +#endif + + vardims = var->array.dimsetall; + ncrank = nclistlength(vardims); + if(ncrank > 0) { + for(j=0;jncid; + } + } + + + + definename = getdefinename(var); + +#ifdef DEBUG1 +fprintf(stderr,"define: var: %s/%s", + definename,var->ocname); +if(ncrank > 0) { +int k; +for(k=0;kdim.declsize); + } + } +fprintf(stderr,"\n"); +#endif + ncstat = nc_def_var(drno->substrate, + definename, + var->externaltype, + ncrank, + (ncrank==0?NULL:dimids), + &varid); + nullfree(definename); + if(ncstat != NC_NOERR) { + THROWCHK(ncstat); + goto done; + } + var->ncid = varid; + if(var->attributes != NULL) { + for(j=0;jattributes);j++) { + NCattribute* att = (NCattribute*)nclistget(var->attributes,j); + ncstat = buildattribute3a(dapcomm,att,var->etype,varid); + if(ncstat != NC_NOERR) goto done; + } + } + /* Tag the variable with its DAP path */ + if(paramcheck34(dapcomm,"show","projection")) + showprojection3(dapcomm,var); + } +done: + return THROW(ncstat); +} + +static NCerror +buildglobalattrs3(NCDAPCOMMON* dapcomm, CDFnode* root) +{ + int i; + NCerror ncstat = NC_NOERR; + const char* txt; + char *nltxt, *p; + NCbytes* buf = NULL; + NClist* cdfnodes; + NC* drno = dapcomm->controller; + + if(root->attributes != NULL) { + for(i=0;iattributes);i++) { + NCattribute* att = (NCattribute*)nclistget(root->attributes,i); + ncstat = buildattribute3a(dapcomm,att,NC_NAT,NC_GLOBAL); + if(ncstat != NC_NOERR) goto done; + } + } + + /* Add global attribute identifying the sequence dimensions */ + if(paramcheck34(dapcomm,"show","seqdims")) { + buf = ncbytesnew(); + cdfnodes = dapcomm->cdf.ddsroot->tree->nodes; + for(i=0;inctype != NC_Dimension) continue; + if(DIMFLAG(dim,CDFDIMSEQ)) { + char* cname = cdflegalname3(dim->ocname); + if(ncbyteslength(buf) > 0) ncbytescat(buf,", "); + ncbytescat(buf,cname); + nullfree(cname); + } + } + if(ncbyteslength(buf) > 0) { + ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_sequence_dimensions", + ncbyteslength(buf),ncbytescontents(buf)); + } + } + + /* Define some additional system global attributes + depending on show= clientparams*/ + /* Ignore failures*/ + + if(paramcheck34(dapcomm,"show","translate")) { + /* Add a global attribute to show the translation */ + ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_translate", + strlen("netcdf-3"),"netcdf-3"); + } + if(paramcheck34(dapcomm,"show","url")) { + if(dapcomm->oc.rawurltext != NULL) + ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_url", + strlen(dapcomm->oc.rawurltext),dapcomm->oc.rawurltext); + } + if(paramcheck34(dapcomm,"show","dds")) { + txt = NULL; + if(dapcomm->cdf.ddsroot != NULL) + txt = oc_inq_text(dapcomm->oc.conn,dapcomm->cdf.ddsroot->ocnode); + if(txt != NULL) { + /* replace newlines with spaces*/ + nltxt = nulldup(txt); + for(p=nltxt;*p;p++) {if(*p == '\n' || *p == '\r' || *p == '\t') {*p = ' ';}}; + ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_dds",strlen(nltxt),nltxt); + nullfree(nltxt); + } + } + if(paramcheck34(dapcomm,"show","das")) { + txt = NULL; + if(dapcomm->oc.ocdasroot != OCNULL) + txt = oc_inq_text(dapcomm->oc.conn,dapcomm->oc.ocdasroot); + if(txt != NULL) { + nltxt = nulldup(txt); + for(p=nltxt;*p;p++) {if(*p == '\n' || *p == '\r' || *p == '\t') {*p = ' ';}}; + ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_das",strlen(nltxt),nltxt); + nullfree(nltxt); + } + } + +done: + ncbytesfree(buf); + return THROW(ncstat); +} + +static NCerror +buildattribute3a(NCDAPCOMMON* dapcomm, NCattribute* att, nc_type vartype, int varid) +{ + int i; + NCerror ncstat = NC_NOERR; + unsigned int nvalues = nclistlength(att->values); + NC* drno = dapcomm->controller; + + /* If the type of the attribute is string, then we need*/ + /* to convert to a single character string by concatenation. + modified: 10/23/09 to insert newlines. + modified: 10/28/09 to interpret escapes + */ + if(att->etype == NC_STRING || att->etype == NC_URL) { + char* newstring; + size_t newlen = 0; + for(i=0;ivalues,i); + newlen += (1+strlen(s)); + } + newstring = (char*)malloc(newlen); + MEMCHECK(newstring,NC_ENOMEM); + newstring[0] = '\0'; + for(i=0;ivalues,i); + if(i > 0) strcat(newstring,"\n"); + strcat(newstring,s); + } + dapexpandescapes(newstring); + if(newstring[0]=='\0') + ncstat = nc_put_att_text(drno->substrate,varid,att->name,1,newstring); + else + ncstat = nc_put_att_text(drno->substrate,varid,att->name,strlen(newstring),newstring); + free(newstring); + } else { + nc_type atype; + unsigned int typesize; + void* mem; + /* It turns out that some servers upgrade the type + of _FillValue in order to correctly preserve the + original value. However, since the type of the + underlying variable is not changes, we get a type + mismatch. So, make sure the type of the fillvalue + is the same as that of the controlling variable. + */ + if(varid != NC_GLOBAL && strcmp(att->name,"_FillValue")==0) + atype = nctypeconvert(dapcomm,vartype); + else + atype = nctypeconvert(dapcomm,att->etype); + typesize = nctypesizeof(atype); + mem = malloc(typesize * nvalues); + ncstat = dapcvtattrval3(atype,mem,att->values); + ncstat = nc_put_att(drno->substrate,varid,att->name,atype,nvalues,mem); + nullfree(mem); + } + return THROW(ncstat); +} + +static char* +getdefinename(CDFnode* node) +{ + char* spath = NULL; + NClist* path = NULL; + + switch (node->nctype) { + case NC_Primitive: + /* The define name is same as the fullname with elided nodes */ + path = nclistnew(); + collectnodepath3(node,path,!WITHDATASET); + spath = makepathstring3(path,".",PATHNC|PATHELIDE); + nclistfree(path); + break; + + case NC_Dimension: + /* Return just the node's ncname */ + spath = nulldup(node->ncbasename); + break; + + default: + PANIC("unexpected nctype"); + } + return spath; +} + +int +NCDAP_ping(const char* url) +{ + OCerror ocstat = OC_NOERR; + ocstat = oc_ping(url); + return ocerrtoncerr(ocstat); +} diff --git a/extern/src_netcdf4/ncdap3.h b/extern/src_netcdf4/ncdap3.h new file mode 100644 index 0000000..668df4d --- /dev/null +++ b/extern/src_netcdf4/ncdap3.h @@ -0,0 +1,149 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/ncdap3.h,v 1.40 2010/05/30 19:45:52 dmh Exp $ + *********************************************************************/ +#ifndef NCDAP3_H +#define NCDAP3_H 1 + +#include "config.h" +#include +#include +#include +#include +#include +#include + +#include "ncbytes.h" +#include "nclist.h" +#include "nchashmap.h" +#include "nclog.h" +#include "nc_uri.h" +#include "fbits.h" +#include "dceconstraints.h" + +#include "oc.h" + +#include "nc.h" +#include "netcdf.h" +#include "ncdispatch.h" + /* netcdf overrides*/ +#include "dapnc.h" + +#include "dapdebug.h" +#include "daputil.h" + +/**************************************************/ +/* sigh, do the forwards */ +struct NCprojection; +struct NCselection; +struct Getvara; +struct NCcachenode; +struct NCcache; +struct NCslice; +struct NCsegment; + +/**************************************************/ + +#include "nccommon.h" +#include "getvara.h" +#include "constraints3.h" + +/**************************************************/ + +#ifndef USE_NETCDF4 +#define NC_UBYTE 7 /* unsigned 1 byte int */ +#define NC_USHORT 8 /* unsigned 2-byte int */ +#define NC_UINT 9 /* unsigned 4-byte int */ +#define NC_INT64 10 /* signed 8-byte int */ +#define NC_UINT64 11 /* unsigned 8-byte int */ +#define NC_STRING 12 /* string */ + +#define NC_MAX_BYTE 127 +#define NC_MIN_BYTE (-NC_MAX_BYTE-1) +#define NC_MAX_CHAR 255 +#define NC_MAX_SHORT 32767 +#define NC_MIN_SHORT (-NC_MAX_SHORT - 1) +#define NC_MAX_INT 2147483647 +#define NC_MIN_INT (-NC_MAX_INT - 1) +#define NC_MAX_FLOAT 3.402823466e+38f +#define NC_MIN_FLOAT (-NC_MAX_FLOAT) +#define NC_MAX_DOUBLE 1.7976931348623157e+308 +#define NC_MIN_DOUBLE (-NC_MAX_DOUBLE) +#define NC_MAX_UBYTE NC_MAX_CHAR +#define NC_MAX_USHORT 65535U +#define NC_MAX_UINT 4294967295U +#define NC_MAX_INT64 (9223372036854775807LL) +#define NC_MIN_INT64 (-9223372036854775807LL-1) +#define NC_MAX_UINT64 (18446744073709551615ULL) +#define X_INT64_MAX (9223372036854775807LL) +#define X_INT64_MIN (-X_INT64_MAX - 1) +#define X_UINT64_MAX (18446744073709551615ULL) +#endif /*USE_NETCDF4*/ + + +/**************************************************/ + +extern struct NCTMODEL nctmodels[]; + +/**************************************************/ +/* Import some internal procedures from libsrc*/ + +/* Internal, but non-static procedures */ +extern NCerror computecdfvarnames3(NCDAPCOMMON*,CDFnode*,NClist*); +extern NCerror computecdfnodesets3(NCDAPCOMMON* drno); +extern NCerror computevarnodes3(NCDAPCOMMON*, NClist*, NClist*); +extern NCerror collectvardefdims(NCDAPCOMMON* drno, CDFnode* var, NClist* dimset); +extern NCerror fixgrids3(NCDAPCOMMON* drno); +extern NCerror dapmerge3(NCDAPCOMMON* drno, CDFnode* node, OCobject dasroot); +extern NCerror sequencecheck3(NCDAPCOMMON* drno); +extern NCerror computecdfdimnames3(NCDAPCOMMON*); +extern NCerror attachdatadds3(struct NCDAPCOMMON*); +extern NCerror detachdatadds3(struct NCDAPCOMMON*); +extern void dapdispatch3init(void); + +/* +extern void dereference3(NCconstraint* constraint); +extern NCerror rereference3(NCconstraint*, NClist*); +*/ + +extern NCerror buildvaraprojection3(struct Getvara*, + const size_t* startp, const size_t* countp, const ptrdiff_t* stridep, + struct DCEprojection** projectionlist); + +extern NCerror nc3d_getvarx(int ncid, int varid, + const size_t *startp, + const size_t *countp, + const ptrdiff_t *stridep, + void *data, + nc_type dsttype0); + +/**************************************************/ + +/* From: ncdap3.c*/ +extern NCerror nc3d_open(const char* path, int mode, int* ncidp); +extern int nc3d_close(int ncid); +extern int nc3dinitialize(void); +extern NCerror regrid3(CDFnode* ddsroot, CDFnode* template, NClist*); +extern void setvisible(CDFnode* root, int visible); +extern NCerror mapnodes3(CDFnode* dstroot, CDFnode* srcroot); +extern void unmap3(CDFnode* root); + +/* From: ncdap3a.c*/ +extern NCerror fetchtemplatemetadata3(NCDAPCOMMON* nccomm); +extern NCerror fetchconstrainedmetadata3(NCDAPCOMMON* nccomm); +extern void applyclientparamcontrols3(NCDAPCOMMON*); +extern NCerror suppressunusablevars3(NCDAPCOMMON*); +extern NCerror addstringdims(NCDAPCOMMON* drno); +extern NCerror defseqdims(NCDAPCOMMON* drno); +extern NCerror fixzerodims3(NCDAPCOMMON*); +extern void estimatevarsizes3(NCDAPCOMMON*); +extern NCerror defrecorddim3(NCDAPCOMMON*); +extern NCerror showprojection3(NCDAPCOMMON*, CDFnode* var); + + +/* From: dapcvt.c*/ +extern NCerror dapconvert3(nc_type, nc_type, char*, char*, size_t); +extern int dapcvtattrval3(nc_type, void*, NClist*); + +#endif /*NCDAP3_H*/ diff --git a/extern/src_netcdf4/ncdap3a.c b/extern/src_netcdf4/ncdap3a.c new file mode 100644 index 0000000..f30d7a7 --- /dev/null +++ b/extern/src_netcdf4/ncdap3a.c @@ -0,0 +1,800 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + *********************************************************************/ + +#include "ncdap3.h" +#include "nc3dispatch.h" +#include "ncd3dispatch.h" +#include "dapalign.h" +#include "dapdump.h" +#include "oc.h" + +#define getncid(drno) (((NC*)drno)->ext_ncid) + +/*Forward*/ +static NCerror getseqdimsize(NCDAPCOMMON*, CDFnode* seq, size_t* sizep); +static int fieldindex(CDFnode* parent, CDFnode* child); +static NCerror countsequence(NCDAPCOMMON*, CDFnode* node, size_t*); +static NCerror makeseqdim(NCDAPCOMMON*, CDFnode* node, size_t, CDFnode**); +static NCerror computeseqcountconstraints3(NCDAPCOMMON*,CDFnode*,NCbytes*); +static void computeseqcountconstraints3r(NCDAPCOMMON*, CDFnode*, CDFnode**); + +void +freegetvara(Getvara* vara) +{ + if(vara == NULL) return; + dcefree((DCEnode*)vara->varaprojection); + nullfree(vara); +} + +NCerror +freeNCDAPCOMMON(NCDAPCOMMON* dapcomm) +{ + /* abort the metadata file */ + (void)nc_abort(getncid(dapcomm)); + freenccache(dapcomm,dapcomm->cdf.cache); + nclistfree(dapcomm->cdf.varnodes); + nclistfree(dapcomm->cdf.seqnodes); + nclistfree(dapcomm->cdf.gridnodes); + nclistfree(dapcomm->cdf.usertypes); + nullfree(dapcomm->cdf.recorddimname); + + /* free the trees */ + freecdfroot34(dapcomm->cdf.ddsroot); + dapcomm->cdf.ddsroot = NULL; + freecdfroot34(dapcomm->cdf.fullddsroot); + dapcomm->cdf.fullddsroot = NULL; + if(dapcomm->oc.ocdasroot != NULL) + oc_root_free(dapcomm->oc.conn,dapcomm->oc.ocdasroot); + dapcomm->oc.ocdasroot = NULL; + oc_close(dapcomm->oc.conn); /* also reclaims remaining OC trees */ + nc_urifree(dapcomm->oc.url); + nullfree(dapcomm->oc.urltext); + nullfree(dapcomm->oc.rawurltext); + + dcefree((DCEnode*)dapcomm->oc.dapconstraint); + dapcomm->oc.dapconstraint = NULL; + + free(dapcomm); + + return NC_NOERR; +} + +NCerror +addstringdims(NCDAPCOMMON* dapcomm) +{ + /* for all variables of string type, we will need another dimension + to represent the string; Accumulate the needed sizes and create + the dimensions with a specific name: either as specified + in DODS{...} attribute set or defaulting to the variable name. + All such dimensions are global. + */ + int i; + NClist* varnodes = dapcomm->cdf.varnodes; + CDFnode* globalsdim = NULL; + char dimname[4096]; + size_t dimsize; + + /* Start by creating the global string dimension */ + snprintf(dimname,sizeof(dimname),"maxStrlen%lu", + (unsigned long)dapcomm->cdf.defaultstringlength); + globalsdim = makecdfnode34(dapcomm, dimname, OC_Dimension, OCNULL, + dapcomm->cdf.ddsroot); + nclistpush(dapcomm->cdf.ddsroot->tree->nodes,(ncelem)globalsdim); + DIMFLAGSET(globalsdim,CDFDIMSTRING); + globalsdim->dim.declsize = dapcomm->cdf.defaultstringlength; + globalsdim->dim.declsize0 = globalsdim->dim.declsize; + globalsdim->dim.array = dapcomm->cdf.ddsroot; + globalsdim->ncbasename = cdflegalname3(dimname); + globalsdim->ncfullname = nulldup(globalsdim->ncbasename); + dapcomm->cdf.globalstringdim = globalsdim; + + for(i=0;ietype != NC_STRING && var->etype != NC_URL) continue; + + dimsize = 0; + if(var->dodsspecial.maxstrlen > 0) + dimsize = var->dodsspecial.maxstrlen; + else + dimsize = var->maxstringlength; + + /* check is a variable-specific string length was specified */ + if(dimsize == 0) + sdim = dapcomm->cdf.globalstringdim; /* use default */ + else { + /* create a psuedo dimension for the charification of the string*/ + if(var->dodsspecial.dimname != NULL) + strncpy(dimname,var->dodsspecial.dimname,sizeof(dimname)); + else + snprintf(dimname,sizeof(dimname),"maxStrlen%lu", + (unsigned long)dimsize); + sdim = makecdfnode34(dapcomm, dimname, OC_Dimension, OCNULL, + dapcomm->cdf.ddsroot); + if(sdim == NULL) return THROW(NC_ENOMEM); + nclistpush(dapcomm->cdf.ddsroot->tree->nodes,(ncelem)sdim); + DIMFLAGSET(sdim,CDFDIMSTRING); + sdim->dim.declsize = dimsize; + sdim->dim.declsize0 = dimsize; + sdim->dim.array = var; + sdim->ncbasename = cdflegalname3(sdim->ocname); + sdim->ncfullname = nulldup(sdim->ncbasename); + } + /* tag the variable with its string dimension*/ + var->array.stringdim = sdim; + } + return NC_NOERR; +} + +NCerror +defrecorddim3(NCDAPCOMMON* dapcomm) +{ + unsigned int i; + NCerror ncstat = NC_NOERR; + NClist* basedims; + + if(dapcomm->cdf.recorddimname == NULL) return NC_NOERR; /* ignore */ + /* Locate the base dimension matching the record dim */ + basedims = dapcomm->cdf.dimnodes; + for(i=0;iocname,dapcomm->cdf.recorddimname) != 0) continue; + DIMFLAGSET(dim,CDFDIMRECORD); + dapcomm->cdf.recorddim = dim; + break; + } + + return ncstat; +} + +NCerror +defseqdims(NCDAPCOMMON* dapcomm) +{ + unsigned int i; + NCerror ncstat = NC_NOERR; + int seqdims = 1; /* default is to compute seq dims counts */ + + /* Does the user want to compute actual sequence sizes? */ + if(paramvalue34(dapcomm,"noseqdims")) seqdims = 0; + + /* + Compute and define pseudo dimensions for sequences + meeting the following qualifications: + 1. all parents (transitively) of the sequence must + be either a dataset or a scalar structure. + 2. it must be possible to find a usable sequence constraint. + All other sequences will be ignored. + */ + + for(i=0;icdf.seqnodes);i++) { + CDFnode* seq = (CDFnode*)nclistget(dapcomm->cdf.seqnodes,i); + size_t seqsize; + CDFnode* sqdim = NULL; + CDFnode* container; + /* Does this sequence match the requirements for use ? */ + seq->usesequence = 1; /* assume */ + for(container=seq->container;container != NULL;container=container->container) { + if(container->nctype == NC_Dataset) break; + if(container->nctype != NC_Structure + || nclistlength(container->array.dimset0) > 0) + {seq->usesequence = 0; break;}/* no good */ + } + /* Does the user want us to compute the actual sequence dim size? */ + if(seq->usesequence && seqdims) { + ncstat = getseqdimsize(dapcomm,seq,&seqsize); + if(ncstat != NC_NOERR) { + /* Cannot read sequence; mark as unusable */ + seq->usesequence = 0; + } + } else { /* !seqdims default to size = 1 */ + seqsize = 1; + } + if(seq->usesequence) { + /* Note: we are making the dimension in the dds root tree */ + ncstat = makeseqdim(dapcomm,seq,seqsize,&sqdim); + if(ncstat) goto fail; + seq->array.seqdim = sqdim; + } else + seq->array.seqdim = NULL; + } + +fail: + return ncstat; +} + +static NCerror +getseqdimsize(NCDAPCOMMON* dapcomm, CDFnode* seq, size_t* sizep) +{ + NCerror ncstat = NC_NOERR; + OCerror ocstat = OC_NOERR; + OCconnection conn = dapcomm->oc.conn; + OCdata rootcontent = OCNULL; + OCobject ocroot; + CDFnode* dxdroot; + CDFnode* xseq; + NCbytes* seqcountconstraints = ncbytesnew(); + size_t seqsize; + + /* Read the minimal amount of data in order to get the count */ + /* If the url is unconstrainable, then get the whole thing */ + computeseqcountconstraints3(dapcomm,seq,seqcountconstraints); +#ifdef DEBUG +fprintf(stderr,"seqcountconstraints: %s\n",ncbytescontents(seqcountconstraints)); +#endif + + /* Fetch the minimal data */ + if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) + ocstat = dap_fetch(dapcomm,conn,NULL,OCDATADDS,&ocroot); + else + ocstat = dap_fetch(dapcomm,conn,ncbytescontents(seqcountconstraints),OCDATADDS,&ocroot); + if(ocstat) goto fail; + + ncstat = buildcdftree34(dapcomm,ocroot,OCDATA,&dxdroot); + if(ncstat) goto fail; + /* attach DATADDS to DDS */ + ncstat = attach34(dxdroot,seq); + if(ncstat) goto fail; + + /* WARNING: we are now switching to datadds tree */ + xseq = seq->attachment; + ncstat = countsequence(dapcomm,xseq,&seqsize); + if(ncstat) goto fail; + +#ifdef DEBUG +fprintf(stderr,"sequencesize: %s = %lu\n",seq->ocname,(unsigned long)seqsize); +#endif + + /* throw away the fetch'd trees */ + unattach34(dapcomm->cdf.ddsroot); + freecdfroot34(dxdroot); + if(ncstat != NC_NOERR) { + /* Cannot get DATADDDS*/ + char* code; + char* msg; + long httperr; + oc_svcerrordata(dapcomm->oc.conn,&code,&msg,&httperr); + if(code != NULL) { + nclog(NCLOGERR,"oc_fetch_datadds failed: %s %s %l", + code,msg,httperr); + } + ocstat = OC_NOERR; + } + if(sizep) *sizep = seqsize; + +fail: + ncbytesfree(seqcountconstraints); + oc_data_free(conn,rootcontent); + if(ocstat) ncstat = ocerrtoncerr(ocstat); + return ncstat; +} + +static NCerror +makeseqdim(NCDAPCOMMON* dapcomm, CDFnode* seq, size_t count, CDFnode** sqdimp) +{ + CDFnode* sqdim; + CDFnode* root = seq->root; + CDFtree* tree = root->tree; + + /* build the dimension with given size; keep the dimension anonymous */ + sqdim = makecdfnode34(dapcomm,seq->ocname,OC_Dimension,OCNULL,root); + if(sqdim == NULL) return THROW(NC_ENOMEM); + nclistpush(tree->nodes,(ncelem)sqdim); + /* Assign a name to the sequence node */ + sqdim->ncbasename = cdflegalname3(seq->ocname); + sqdim->ncfullname = nulldup(sqdim->ncbasename); + DIMFLAGSET(sqdim,CDFDIMSEQ); + sqdim->dim.declsize = count; + sqdim->dim.declsize0 = count; + sqdim->dim.array = seq; + if(sqdimp) *sqdimp = sqdim; + return NC_NOERR; +} + +static NCerror +countsequence(NCDAPCOMMON* dapcomm, CDFnode* xseq, size_t* sizep) +{ + unsigned int i; + NClist* path = nclistnew(); + int index; + OCerror ocstat = OC_NOERR; + NCerror ncstat = NC_NOERR; + OCconnection conn = dapcomm->oc.conn; + size_t recordcount; + CDFnode* xroot; + CDFnode* current; + OCdata datacontainer = OCNULL; + OCmode mode; + + ASSERT((xseq->nctype == NC_Sequence)); + + /* collect the path to the sequence node */ + collectnodepath3(xseq,path,WITHDATASET); + + /* Get tree root */ + xroot = xseq->root; + datacontainer = oc_data_new(conn); + ocstat = oc_data_root(conn,xroot->tree->ocroot,datacontainer); + if(ocstat) goto fail; + + /* walk to the sequence object; control the movement to the next node + based on mode */ + current = (CDFnode*)nclistget(path,0); + for(i=0;;) { + OCdata child = OCNULL; + CDFnode* next = NULL; + ocstat = oc_data_mode(conn,datacontainer,&mode); + if(ocstat != OC_NOERR) goto fail; + switch (mode) { + case OCFIELDMODE: + i++; + next = (CDFnode*)nclistget(path,i); + index = fieldindex(current,next); + break; + case OCARRAYMODE: + index = 0; + break; + case OCSEQUENCEMODE: + goto exitloop; + default: + PANIC("unexpected mode"); + return NC_EINVAL; + } + child = oc_data_new(conn); + ocstat = oc_data_ith(conn,datacontainer,index,child); + if(ocstat) goto fail; + /* move to the next node only if it is defined */ + if(next != NULL) + current = next; + oc_data_free(conn,datacontainer); + datacontainer = child; + } +exitloop: + ASSERT(current == xseq && mode == OCSEQUENCEMODE); + oc_data_count(conn,datacontainer,&recordcount); + if(sizep) *sizep = recordcount; + +fail: + oc_data_free(conn,datacontainer); + nclistfree(path); + if(ocstat) ncstat = ocerrtoncerr(ocstat); + return THROW(ncstat); +} + +static int +fieldindex(CDFnode* parent, CDFnode* child) +{ + unsigned int i; + for(i=0;isubnodes);i++) { + CDFnode* node = (CDFnode*)nclistget(parent->subnodes,i); + if(node == child) return i; + } + return -1; +} + +NCerror +showprojection3(NCDAPCOMMON* dapcomm, CDFnode* var) +{ + int i,rank; + NCerror ncstat = NC_NOERR; + NCbytes* projection = ncbytesnew(); + NClist* path = nclistnew(); + NC* drno = dapcomm->controller; + + /* Collect the set of DDS node name forming the xpath */ + collectnodepath3(var,path,WITHOUTDATASET); + for(i=0;i 0) ncbytescat(projection,"."); + ncbytescat(projection,node->ocname); + } + /* Now, add the dimension info */ + rank = nclistlength(var->array.dimset0); + for(i=0;iarray.dimset0,i); + char tmp[32]; + ncbytescat(projection,"["); + snprintf(tmp,sizeof(tmp),"%lu",(unsigned long)dim->dim.declsize); + ncbytescat(projection,tmp); + ncbytescat(projection,"]"); + } + /* Define the attribute */ + ncstat = nc_put_att_text(getncid(drno),var->ncid, + "_projection", + ncbyteslength(projection), + ncbytescontents(projection)); + return ncstat; +} + +/* +This is more complex than one might think. We want to find +a path to a variable inside the given node so that we can +ask for a single instance of that variable to minimize the +amount of data we retrieve. However, we want to avoid passing +through any nested sequence. This is possible because of the way +that sequencecheck() works. +TODO: some servers will not accept an unconstrained fetch, so +make sure we always have a constraint. +*/ + +static NCerror +computeseqcountconstraints3(NCDAPCOMMON* dapcomm, CDFnode* seq, NCbytes* seqcountconstraints) +{ + int i,j; + NClist* path = NULL; + CDFnode* var = NULL; + + ASSERT(seq->nctype == NC_Sequence); + computeseqcountconstraints3r(dapcomm,seq,&var); + + ASSERT((var != NULL)); + + /* Compute var path */ + path = nclistnew(); + collectnodepath3(var,path,WITHOUTDATASET); + + /* construct the projection path using minimal index values */ + for(i=0;i 0) ncbytescat(seqcountconstraints,"."); + ncbytescat(seqcountconstraints,node->ocname); + if(node == seq) { + /* Use the limit */ + if(node->sequencelimit > 0) { + char tmp[64]; + snprintf(tmp,sizeof(tmp),"[0:%lu]", + (unsigned long)(node->sequencelimit - 1)); + ncbytescat(seqcountconstraints,tmp); + } + } else if(nclistlength(node->array.dimset0) > 0) { + int ndims = nclistlength(node->array.dimset0); + for(j=0;jarray.dimset0,j); + if(DIMFLAG(dim,CDFDIMSTRING)) { + ASSERT((j == (ndims - 1))); + break; + } + ncbytescat(seqcountconstraints,"[0]"); + } + } + } + /* Finally, add in any selection from the original URL */ + if(dapcomm->oc.url->selection != NULL) + ncbytescat(seqcountconstraints,dapcomm->oc.url->selection); + nclistfree(path); + return NC_NOERR; +} + + +/* Given an existing candidate, see if we prefer newchoice */ +static CDFnode* +prefer(CDFnode* candidate, CDFnode* newchoice) +{ + nc_type newtyp; + nc_type cantyp; + int newisstring; + int canisstring; + int newisscalar; + int canisscalar; + + /* always choose !null over null */ + if(newchoice == NULL) + return candidate; + if(candidate == NULL) + return newchoice; + + newtyp = newchoice->etype; + cantyp = candidate->etype; + newisstring = (newtyp == NC_STRING || newtyp == NC_URL); + canisstring = (cantyp == NC_STRING || cantyp == NC_URL); + newisscalar = (nclistlength(newchoice->array.dimset0) == 0); + canisscalar = (nclistlength(candidate->array.dimset0) == 0); + + ASSERT(candidate->nctype == NC_Primitive && newchoice->nctype == NC_Primitive); + + /* choose non-string over string */ + if(canisstring && !newisstring) + return newchoice; + if(!canisstring && newisstring) + return candidate; + + /* choose scalar over array */ + if(canisscalar && !newisscalar) + return candidate; + if(!canisscalar && newisscalar) + return candidate; + + /* otherwise choose existing candidate */ + return candidate; +} + +/* computeseqcountconstraints3 recursive helper function */ +static void +computeseqcountconstraints3r(NCDAPCOMMON* dapcomm, CDFnode* node, CDFnode** candidatep) +{ + CDFnode* candidate; + CDFnode* compound; + unsigned int i; + + candidate = NULL; + compound = NULL; + + for(i=0;isubnodes);i++){ + CDFnode* subnode = (CDFnode*)nclistget(node->subnodes,i); + if(subnode->nctype == NC_Structure || subnode->nctype == NC_Grid) + compound = subnode; /* save for later recursion */ + else if(subnode->nctype == NC_Primitive) { + candidate = prefer(candidate,subnode); + } + } + if(candidate == NULL && compound == NULL) { + PANIC("cannot find candidate for seqcountconstraints for a sequence"); + } else if(candidate != NULL && candidatep != NULL) { + *candidatep = candidate; + } else { /* compound != NULL by construction */ + /* recurse on a nested grids or strucures */ + computeseqcountconstraints3r(dapcomm,compound,candidatep); + } +} + + +static unsigned long +cdftotalsize3(NClist* dimensions) +{ + unsigned int i; + unsigned long total = 1; + if(dimensions != NULL) { + for(i=0;idim.declsize; + } + } + return total; +} + +/* Estimate variables sizes and then resort the variable list + by that size +*/ +void +estimatevarsizes3(NCDAPCOMMON* dapcomm) +{ + int ivar; + unsigned int rank; + size_t totalsize = 0; + + for(ivar=0;ivarcdf.varnodes);ivar++) { + CDFnode* var = (CDFnode*)nclistget(dapcomm->cdf.varnodes,ivar); + NClist* ncdims = var->array.dimset0; + rank = nclistlength(ncdims); + if(rank == 0) { /* use instance size of the type */ + var->estimatedsize = nctypesizeof(var->etype); +#ifdef DEBUG1 +fprintf(stderr,"scalar %s.estimatedsize = %lu\n", + makecdfpathstring3(var,"."),var->estimatedsize); +#endif + } else { + unsigned long size = cdftotalsize3(ncdims); + size *= nctypesizeof(var->etype); +#ifdef DEBUG1 +fprintf(stderr,"array %s(%u).estimatedsize = %lu\n", + makecdfpathstring3(var,"."),rank,size); +#endif + var->estimatedsize = size; + } + totalsize += var->estimatedsize; + } +#ifdef DEBUG1 +fprintf(stderr,"total estimatedsize = %lu\n",totalsize); +#endif + dapcomm->cdf.totalestimatedsize = totalsize; +} + +NCerror +fetchtemplatemetadata3(NCDAPCOMMON* dapcomm) +{ + NCerror ncstat = NC_NOERR; + OCerror ocstat = OC_NOERR; + OCobject ocroot = OCNULL; + CDFnode* ddsroot = NULL; + char* ce = NULL; + + /* Temporary hack: we need to get the selection string + from the url + */ + /* Get (almost) unconstrained DDS; In order to handle functions + correctly, those selections must always be included + */ + if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) + ce = NULL; + else + ce = nulldup(dapcomm->oc.url->selection); + + /* Get selection constrained DDS */ + ocstat = dap_fetch(dapcomm,dapcomm->oc.conn,ce,OCDDS,&ocroot); + if(ocstat != OC_NOERR) { + /* Special Hack. If the protocol is file, then see if + we can get the dds from the .dods file + */ + if(strcmp(dapcomm->oc.url->protocol,"file") != 0) { + THROWCHK(ocstat); goto done; + } + /* Fetch the data dds */ + ocstat = dap_fetch(dapcomm,dapcomm->oc.conn,ce,OCDATADDS,&ocroot); + if(ocstat != OC_NOERR) { + THROWCHK(ocstat); goto done; + } + /* Note what we did */ + nclog(NCLOGWARN,"Cannot locate .dds file, using .dods file"); + } + + /* Get selection constrained DAS */ + ocstat = dap_fetch(dapcomm,dapcomm->oc.conn,ce,OCDAS,&dapcomm->oc.ocdasroot); + if(ocstat != OC_NOERR) { + /* Ignore but complain */ + nclog(NCLOGWARN,"Could not read DAS; ignored"); + dapcomm->oc.ocdasroot = OCNULL; + ocstat = OC_NOERR; + } + + /* Construct our parallel dds tree */ + ncstat = buildcdftree34(dapcomm,ocroot,OCDDS,&ddsroot); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} + dapcomm->cdf.fullddsroot = ddsroot; + +done: + nullfree(ce); + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return ncstat; +} + +NCerror +fetchconstrainedmetadata3(NCDAPCOMMON* dapcomm) +{ + NCerror ncstat = NC_NOERR; + OCerror ocstat = OC_NOERR; + OCobject ocroot; + CDFnode* ddsroot; /* constrained */ + char* ce = NULL; + + if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) + ce = NULL; + else + ce = buildconstraintstring3(dapcomm->oc.dapconstraint); + + { + ocstat = dap_fetch(dapcomm,dapcomm->oc.conn,ce,OCDDS,&ocroot); + if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto fail;} + + /* Construct our parallel dds tree; including attributes*/ + ncstat = buildcdftree34(dapcomm,ocroot,OCDDS,&ddsroot); + if(ncstat) goto fail; + + dapcomm->cdf.ddsroot = ddsroot; + + if(!FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { + /* fix DAP server problem by adding back any missing grid structure nodes */ + ncstat = regrid3(ddsroot,dapcomm->cdf.fullddsroot,dapcomm->oc.dapconstraint->projections); + if(ncstat) goto fail; + } + +#ifdef DEBUG +fprintf(stderr,"constrained:\n%s",dumptree(ddsroot)); +#endif + + /* Combine DDS and DAS */ + if(dapcomm->oc.ocdasroot != NULL) { + ncstat = dapmerge3(dapcomm,ddsroot,dapcomm->oc.ocdasroot); + if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto fail;} + } + + /* map the constrained DDS to the unconstrained DDS */ + ncstat = mapnodes3(ddsroot,dapcomm->cdf.fullddsroot); + if(ncstat) goto fail; + + } + +fail: + nullfree(ce); + if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); + return ncstat; +} + +/* Suppress variables not in usable sequences*/ +NCerror +suppressunusablevars3(NCDAPCOMMON* dapcomm) +{ + int i,j; + int found = 1; + NClist* path = nclistnew(); + + while(found) { + found = 0; + /* Walk backwards to aid removal semantics */ + for(i=nclistlength(dapcomm->cdf.varnodes)-1;i>=0;i--) { + CDFnode* var = (CDFnode*)nclistget(dapcomm->cdf.varnodes,i); + /* See if this var is under an unusable sequence */ + nclistclear(path); + collectnodepath3(var,path,WITHOUTDATASET); + for(j=0;jnctype == NC_Sequence + && !node->usesequence) { +#ifdef DEBUG +fprintf(stderr,"suppressing var in unusable sequence: %s.%s\n",node->ncfullname,var->ncbasename); +#endif + found = 1; + break; + } + } + if(found) break; + } + if(found) nclistremove(dapcomm->cdf.varnodes,i); + } + nclistfree(path); + return NC_NOERR; +} + + +/* +For variables which have a zero size dimension, +make them invisible. +*/ +NCerror +fixzerodims3(NCDAPCOMMON* dapcomm) +{ + int i,j; + for(i=0;icdf.varnodes);i++) { + CDFnode* var = (CDFnode*)nclistget(dapcomm->cdf.varnodes,i); + NClist* ncdims = var->array.dimsetplus; + if(nclistlength(ncdims) == 0) continue; + for(j=0;jdim.declsize == 0) { + /* make node invisible */ + var->visible = 0; + var->zerodim = 1; + } + } + } + return NC_NOERR; +} + +void +applyclientparamcontrols3(NCDAPCOMMON* dapcomm) +{ + /* clear the flags */ + CLRFLAG(dapcomm->controls,NCF_CACHE); + CLRFLAG(dapcomm->controls,NCF_PREFETCH); + CLRFLAG(dapcomm->controls,NCF_SHOWFETCH); + CLRFLAG(dapcomm->controls,NCF_NC3); + CLRFLAG(dapcomm->controls,NCF_NCDAP); + + /* Turn on any default on flags */ + SETFLAG(dapcomm->controls,DFALT_ON_FLAGS); + SETFLAG(dapcomm->controls,(NCF_NC3|NCF_NCDAP)); + + /* enable/disable caching */ + if(paramcheck34(dapcomm,"cache",NULL)) + SETFLAG(dapcomm->controls,NCF_CACHE); + else if(paramcheck34(dapcomm,"nocache",NULL)) + CLRFLAG(dapcomm->controls,NCF_CACHE); + + /* enable/disable cache prefetch */ + if(paramcheck34(dapcomm,"prefetch",NULL)) + SETFLAG(dapcomm->controls,NCF_PREFETCH); + else if(paramcheck34(dapcomm,"noprefetch",NULL)) + CLRFLAG(dapcomm->controls,NCF_PREFETCH); + + + if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) + SETFLAG(dapcomm->controls,NCF_CACHE); + + if(paramcheck34(dapcomm,"show","fetch")) + SETFLAG(dapcomm->controls,NCF_SHOWFETCH); + + nclog(NCLOGNOTE,"Caching=%d",FLAGSET(dapcomm->controls,NCF_CACHE)); + +} diff --git a/extern/src_netcdf4/ncdaperr.c b/extern/src_netcdf4/ncdaperr.c new file mode 100644 index 0000000..f031c27 --- /dev/null +++ b/extern/src_netcdf4/ncdaperr.c @@ -0,0 +1,43 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/ncdaperr.c,v 1.10 2009/09/23 22:26:08 dmh Exp $ + *********************************************************************/ + +#include "ncdap3.h" + +NCerror +ocerrtoncerr(OCerror ocerr) +{ + if(ocerr >= 0) return ocerr; /* really a system error*/ + switch (ocerr) { + case OC_NOERR: return NC_NOERR; + case OC_EBADID: return NC_EBADID; + case OC_ECHAR: return NC_ECHAR; + case OC_EDIMSIZE: return NC_EDIMSIZE; + case OC_EEDGE: return NC_EEDGE; + case OC_EINVAL: return NC_EINVAL; + case OC_EINVALCOORDS: return NC_EINVALCOORDS; + case OC_ENOMEM: return NC_ENOMEM; + case OC_ENOTVAR: return NC_ENOTVAR; + case OC_EPERM: return NC_EPERM; + case OC_ESTRIDE: return NC_ESTRIDE; + case OC_EDAP: return NC_EDAP; + case OC_EXDR: return NC_EDAP; + case OC_ECURL: return NC_EIO; + case OC_EBADURL: return NC_EDAPURL; + case OC_EBADVAR: return NC_EDAP; + case OC_EOPEN: return NC_EIO; + case OC_EIO: return NC_EIO; + case OC_ENODATA: return NC_ENODATA; + case OC_EDAPSVC: return NC_EDAPSVC; + case OC_ENAMEINUSE: return NC_ENAMEINUSE; + case OC_EDAS: return NC_EDAS; + case OC_EDDS: return NC_EDDS; + case OC_EDATADDS: return NC_EDATADDS; + case OC_ERCFILE: return NC_EDAP; + case OC_ENOFILE: return NC_ECANTREAD; + default: break; + } + return NC_EDAP; /* default;*/ +} diff --git a/extern/src_netcdf4/ncdimscale.h b/extern/src_netcdf4/ncdimscale.h new file mode 100644 index 0000000..d0b1224 --- /dev/null +++ b/extern/src_netcdf4/ncdimscale.h @@ -0,0 +1,12 @@ +/* This is part of the netCDF package. + Copyright 2011 University Corporation for Atmospheric Research/Unidata + See COPYRIGHT file for conditions of use. + + Includes for some HDF5 stuff needed by tests. +*/ + +typedef struct hdf5_objid +{ + unsigned long fileno[2]; /* file number */ + haddr_t objno[2]; /* object number */ +} HDF5_OBJID_T; diff --git a/extern/src_netcdf4/ncdispatch.h b/extern/src_netcdf4/ncdispatch.h new file mode 100644 index 0000000..4842aae --- /dev/null +++ b/extern/src_netcdf4/ncdispatch.h @@ -0,0 +1,386 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + *********************************************************************/ + +/* $Id: ncdispatch.h,v 1.18 2010/06/01 20:11:59 dmh Exp $ */ +/* $Header: /upc/share/CVS/netcdf-3/libdispatch/ncdispatch.h,v 1.18 2010/06/01 20:11:59 dmh Exp $ */ + +#ifndef _DISPATCH_H +#define _DISPATCH_H + +#include "config.h" +#include +#include +#include +#include +#ifdef USE_PARALLEL +#include "netcdf_par.h" +#endif +#include "netcdf.h" +#include "nc.h" +#include "nc_uri.h" + +#define longtype ((sizeof(long) == sizeof(int) ? NC_INT : NC_INT64)) + +extern int nc_get_vara_ubyte(int ncid, int varid, + const size_t* start, const size_t* count, + unsigned char* value); +extern int nc_get_vara_ushort(int ncid, int varid, + const size_t* start, const size_t* count, + unsigned short* value); +extern int nc_get_vara_uint(int ncid, int varid, + const size_t* start, const size_t* count, + unsigned int* value); +extern int nc_get_vara_ulonglong(int ncid, int varid, + const size_t* start, const size_t* count, + unsigned long long* value); + +extern int nc_put_vara_ushort(int ncid, int varid, + const size_t* start, const size_t* count, + const unsigned short* value); +extern int nc_put_vara_uint(int ncid, int varid, + const size_t* start, const size_t* count, + const unsigned int* value); +extern int nc_put_vara_ulonglong(int ncid, int varid, + const size_t* start, const size_t* count, + const unsigned long long* value); + +#define X_INT_MAX 2147483647 + +/* Given a filename, check its magic number */ +#define MAGIC_NUMBER_LEN 4 +#define MAGIC_HDF5_FILE 1 +#define MAGIC_HDF4_FILE 2 +#define MAGIC_CDF1_FILE 1 /* std classic format */ +#define MAGIC_CDF2_FILE 2 /* classic 64 bit */ + +/* Define the mappings from fcn name types + to corresponding NC types. */ +#define T_text NC_CHAR +#define T_schar NC_BYTE +#define T_char NC_CHAR +#define T_short NC_SHORT +#define T_int NC_INT +#define T_float NC_FLOAT +#define T_double NC_DOUBLE +#define T_ubyte NC_UBYTE +#define T_ushort NC_USHORT +#define T_uint NC_UINT +#define T_longlong NC_INT64 +#define T_ulonglong NC_UINT64 +#ifdef USE_NETCDF4 +#define T_string NC_STRING +#endif + +/* Synthetic type to handle special memtypes */ +#define T_uchar NC_UBYTE +#define T_long longtype +#define T_ulong ulongtype + +/**************************************************/ +/* Define the known classes of dispatchers */ +/* Flags may be or'd => powers of 2*/ +#define NC_DISPATCH_NC3 1 +#define NC_DISPATCH_NC4 2 +#define NC_DISPATCH_NCD 4 +#define NC_DISPATCH_NCR 8 + +/* Define a type for use when doing e.g. nc_get_vara_long, etc. */ +/* Should matche values in libsrc4/netcdf.h */ +#ifndef NC_UINT64 +#define NC_UBYTE 7 /* unsigned 1 byte int */ +#define NC_USHORT 8 /* unsigned 2-byte int */ +#define NC_UINT 9 /* unsigned 4-byte int */ +#define NC_INT64 10 /* signed 8-byte int */ +#define NC_UINT64 11 /* unsigned 8-byte int */ +#define NC_STRING 12 /* char* */ +#endif + +/* Define the range of Atomic types */ +#ifdef USE_NETCDF4 +#define ATOMICTYPEMAX NC_STRING +#else +#define ATOMICTYPEMAX NC_DOUBLE +#endif + +/* Define an alias for int to indicate an error return */ +typedef int NCerror; + +/* Define a struct to hold the MPI info so it can be passed down the + * call stack. This is used internally by the netCDF library. It + * should not be used by netcdf users. */ +#ifdef USE_PARALLEL +typedef struct NC_MPI_INFO { + MPI_Comm comm; + MPI_Info info; +} NC_MPI_INFO; +#endif + +/* Define known dispatch tables and initializers */ + +/*Forward*/ +typedef struct NC_Dispatch NC_Dispatch; + +extern NC_Dispatch* NCSUBSTRATE_dispatch_table; +extern int NCDISPATCH_initialize(void); + +extern NC_Dispatch* NC3_dispatch_table; +extern int NC3_initialize(void); + +#ifdef USE_DAP +extern NC_Dispatch* NCD3_dispatch_table; +extern int NCD3_initialize(void); +#endif + +#ifdef USE_NETCDF4 + +extern NC_Dispatch* NC4_dispatch_table; +extern int NC4_initialize(void); + +#ifdef USE_DAP +extern NC_Dispatch* NCD4_dispatch_table; +extern int NCD4_initialize(void); +#endif + +#ifdef USE_CDMREMOTE +extern NC_Dispatch* NCCR_dispatch_table; +extern int NCCR_initialize(void); +#endif + +#ifdef BUILD_RPC +extern NC_Dispatch* NCRPC_dispatch_table; +extern int NCRPC_initialize(void); +#endif + +#endif /*USE_NETCDF4*/ + +/* Vectors of ones and zeros */ +extern size_t nc_sizevector0[NC_MAX_DIMS]; +extern size_t nc_sizevector1[NC_MAX_DIMS]; +extern ptrdiff_t nc_ptrdiffvector1[NC_MAX_DIMS]; + +/**************************************************/ +/* Forward */ +#ifndef USE_NETCDF4 +/* Taken from libsrc4/netcdf.h */ +struct nc_vlen_t; +#define NC_NETCDF4 0x1000 +#define NC_CLASSIC_MODEL 0x0100 +#define NC_ENOPAR (-114) +#endif /*USE_NETCDF4*/ + +struct NC; + +/* WARNING: this must match libsrc4/netcdf.h */ +#ifndef USE_PARALLEL +#ifndef MPI_Comm +#define MPI_Comm int +#define MPI_Info int +#define MPI_COMM_WORLD 0 +#ifndef MPI_INFO_NULL +#define MPI_INFO_NULL 0 +#endif +#endif +#endif + +int NC_create(const char *path, int cmode, + size_t initialsz, int basepe, size_t *chunksizehintp, + int useparallel,void* mpi_info, + int *ncidp); +int NC_open(const char *path, int cmode, + int basepe, size_t *chunksizehintp, + int useparallel, void* mpi_info, + int *ncidp); + +/* Expose the default vars and varm dispatch entries */ +extern int NCDEFAULT_get_vars(int, int, const size_t*, + const size_t*, const ptrdiff_t*, void*, nc_type); +extern int NCDEFAULT_put_vars(int, int, const size_t*, + const size_t*, const ptrdiff_t*, const void*, nc_type); +extern int NCDEFAULT_get_varm(int, int, const size_t*, + const size_t*, const ptrdiff_t*, const ptrdiff_t*, + void*, nc_type); +extern int NCDEFAULT_put_varm(int, int, const size_t*, + const size_t*, const ptrdiff_t*, const ptrdiff_t*, + const void*, nc_type); + +/**************************************************/ +/* Forward */ +struct NCHDR; + +struct NC_Dispatch { + +int model; /* one of the NC_DISPATCH #'s above */ + +int (*new_nc)(struct NC**); /* Create an nc instance;free is not needed, + because it can be done by close and abort*/ + +/* Warning: these two will create appropriate NC instances + using new_nc dispatch function +*/ +int (*create)(const char *path, int cmode, + size_t initialsz, int basepe, size_t *chunksizehintp, + int use_parallel, void* parameters, + struct NC_Dispatch* table, NC** ncp); +int (*open)(const char *path, int mode, + int basepe, size_t *chunksizehintp, + int use_parallel, void* parameters, + struct NC_Dispatch* table, NC** ncp); + +int (*redef)(int); +int (*_enddef)(int,size_t,size_t,size_t,size_t); +int (*sync)(int); +int (*abort)(int); +int (*close)(int); +int (*set_fill)(int,int,int*); +int (*inq_base_pe)(int,int*); +int (*set_base_pe)(int,int); +int (*inq_format)(int,int*); + +int (*inq)(int,int*,int*,int*,int*); +int (*inq_type)(int, nc_type, char*, size_t*); + +int (*def_dim)(int, const char*, size_t, int*); +int (*inq_dimid)(int, const char*, int*); +int (*inq_dim)(int, int, char*, size_t*); +int (*inq_unlimdim)(int ncid, int *unlimdimidp); +int (*rename_dim)(int, int, const char*); + +int (*inq_att)(int, int, const char*, nc_type*, size_t*); +int (*inq_attid)(int, int, const char*, int*); +int (*inq_attname)(int, int, int, char*); +int (*rename_att)(int, int, const char*, const char*); +int (*del_att)(int, int, const char*); +int (*get_att)(int, int, const char*, void*, nc_type); +int (*put_att)(int, int, const char*, nc_type, size_t, const void*, nc_type); + +int (*def_var)(int, const char*, nc_type, int, const int*, int*); +int (*inq_varid)(int, const char*, int*); +int (*rename_var)(int, int, const char*); + +int (*get_vara)(int, int, const size_t*, const size_t*, void*, nc_type); +int (*put_vara)(int, int, const size_t*, const size_t*, const void*, nc_type); + +/* Added to solve Ferret performance problem with Opendap */ +int (*get_vars)(int, int, const size_t*, const size_t*, const ptrdiff_t*, void*, nc_type); +int (*put_vars)(int, int, const size_t*, const size_t*, const ptrdiff_t*, const void*, nc_type); + +int (*get_varm)(int, int, const size_t*, const size_t*, const ptrdiff_t*, const ptrdiff_t*, void*, nc_type); +int (*put_varm)(int, int, const size_t*, const size_t*, const ptrdiff_t*, const ptrdiff_t*, const void*, nc_type); + + +int (*inq_var_all)(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp, + int *shufflep, int *deflatep, int *deflate_levelp, + int *fletcher32p, int *contiguousp, size_t *chunksizesp, + int *no_fill, void *fill_valuep, int *endiannessp, + int *options_maskp, int *pixels_per_blockp); + +/* Note the following may still be invoked by netcdf client code + even when the file is a classic file +*/ +#ifdef USE_NETCDF4 +int (*show_metadata)(int); +int (*inq_unlimdims)(int, int*, int*); +int (*var_par_access)(int, int, int); +int (*inq_ncid)(int, const char*, int*); +int (*inq_grps)(int, int*, int*); +int (*inq_grpname)(int, char*); +int (*inq_grpname_full)(int, size_t*, char*); +int (*inq_grp_parent)(int, int*); +int (*inq_grp_full_ncid)(int, const char*, int*); +int (*inq_varids)(int, int* nvars, int*); +int (*inq_dimids)(int, int* ndims, int*, int); +int (*inq_typeids)(int, int* ntypes, int*); +int (*inq_type_equal)(int, nc_type, int, nc_type, int*); +int (*def_grp)(int, const char*, int*); +int (*inq_user_type)(int, nc_type, char*, size_t*, nc_type*, size_t*, int*); +int (*inq_typeid)(int, const char*, nc_type*); + +int (*def_compound)(int, size_t, const char*, nc_type*); +int (*insert_compound)(int, nc_type, const char*, size_t, nc_type); +int (*insert_array_compound)(int, nc_type, const char*, size_t, nc_type, int, const int*); +int (*inq_compound_field)(int, nc_type, int, char*, size_t*, nc_type*, int*, int*); +int (*inq_compound_fieldindex)(int, nc_type, const char*, int*); +int (*def_vlen)(int, const char*, nc_type base_typeid, nc_type*); +int (*put_vlen_element)(int, int, void*, size_t, const void*); +int (*get_vlen_element)(int, int, const void*, size_t*, void*); +int (*def_enum)(int, nc_type, const char*, nc_type*); +int (*insert_enum)(int, nc_type, const char*, const void*); +int (*inq_enum_member)(int, nc_type, int, char*, void*); +int (*inq_enum_ident)(int, nc_type, long long, char*); +int (*def_opaque)(int, size_t, const char*, nc_type*); +int (*def_var_deflate)(int, int, int, int, int); +int (*def_var_fletcher32)(int, int, int); +int (*def_var_chunking)(int, int, int, const size_t*); +int (*def_var_fill)(int, int, int, const void*); +int (*def_var_endian)(int, int, int); +int (*set_var_chunk_cache)(int, int, size_t, size_t, float); +int (*get_var_chunk_cache)(int ncid, int varid, size_t *sizep, size_t *nelemsp, float *preemptionp); +#endif /*USE_NETCDF4*/ + +}; + +/* Following functions must be handled as non-dispatch */ +#ifdef NONDISPATCH +void(*nc_advise)(const char*cdf_routine_name,interr,const char*fmt,...); +void(*nc_set_log_level)(int); +const char* (*nc_inq_libvers)(void); +const char* (*nc_strerror)(int); +int(*nc_delete)(const char*path); +int(*nc_delete_mp)(const char*path,intbasepe); +#endif /*NONDISPATCH*/ + +/* Define the common fields for NC and NC_FILE_INFO_T etc */ +typedef struct NCcommon { + int ext_ncid; /* uid << 16 */ + int int_ncid; /* unspecified other id */ + struct NC_Dispatch* dispatch; + void* dispatchdata; /* per-protocol instance data */ + char* path; /* as specified at open or create */ + int substrate; /* ncid for another protocol on which to build */ +} NCcommon; + +extern int NC_atomictypelen(nc_type xtype); +extern char* NC_atomictypename(nc_type xtype); + +/* Provide an initializer */ +extern int NC_initialize(void); + +/* Provide a dispatch table overlay facility */ +extern int NC_dispatch_overlay(const NC_Dispatch* overlay, + const NC_Dispatch* base, + NC_Dispatch* merge); + +/* Get/set the override dispatch table */ +extern NC_Dispatch* NC_get_dispatch_override(void); +extern void NC_set_dispatch_override(NC_Dispatch*); + +/* Does the path look like a url? */ +extern int NC_testurl(const char* path); +/* Return model (0 or 3 or 4) as specified by the url */ +extern int NC_urlmodel(const char* path); + +/* allow access url parse and params without exposing nc_url.h */ +extern int NCDAP_urlparse(const char* s, void** dapurl); +extern void NCDAP_urlfree(void* dapurl); +extern const char* NCDAP_urllookup(void* dapurl, const char* param); + +/* Test for specific set of servers */ +extern const char* NC_findtestserver(const char*); +/* Ping a specific server */ +extern int NCDAP_ping(const char*); + +/* Misc */ + +extern int NC_getshape(int ncid, int varid, int ndims, size_t* shape); +extern int NC_is_recvar(int ncid, int varid, size_t* nrecs); + +#define nullstring(s) (s==NULL?"(null)":s) + +extern size_t* NC_coord_zero; +extern size_t* NC_coord_one; + +#endif /* _DISPATCH_H */ + diff --git a/extern/src_netcdf4/ncfunc.c b/extern/src_netcdf4/ncfunc.c new file mode 100644 index 0000000..85ce74b --- /dev/null +++ b/extern/src_netcdf4/ncfunc.c @@ -0,0 +1,100 @@ +/* + +This file is part of netcdf-4, a netCDF-like interface for HDF5, or a +HDF5 backend for netCDF, depending on your point of view. + +This file handles the nc_ calls, calling the appropriate nc3 or nc4 +function, depending on ncid. + +Copyright 2003, University Corporation for Atmospheric Research. See +netcdf-4/docs/COPYRIGHT file for copying and redistribution +conditions. +*/ + +#include "nc4internal.h" +#include "nc3dispatch.h" + +#ifdef IGNORE +/* Keep a linked list of file info objects. */ +extern NC_FILE_INFO_T *nc_file; +#endif + +#ifdef IGNORE +/* This function deletes a member of parliment. Be careful! Last time + * this function was used, Labor got in! This function only does + * anything for netcdf-3 files. */ + +int +nc_delete(const char *path) +{ + return NC3_delete_mp(path, 0); +} + +int +nc_delete_mp(const char *path, int basepe) +{ + return NC3_delete_mp(path, basepe); +} +#endif + +/* This will return the length of a netcdf data type in bytes. Since + we haven't added any new types, I just call the v3 function. + Ed Hartnett 10/43/03 +*/ + +/* This function only does anything for netcdf-3 files. */ +int +NC4_set_base_pe(int ncid, int pe) +{ + NC_FILE_INFO_T *nc; + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + if (nc->nc4_info) + return NC_ENOTNC3; + return NC3_set_base_pe(nc->int_ncid, pe); +} + +/* This function only does anything for netcdf-3 files. */ +int +NC4_inq_base_pe(int ncid, int *pe) +{ + NC_FILE_INFO_T *nc; + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + if (nc->nc4_info) + return NC_ENOTNC3; + return NC3_inq_base_pe(nc->int_ncid, pe); +} + +/* Get the format (i.e. classic, 64-bit-offset, or netcdf-4) of an + * open file. */ +int +NC4_inq_format(int ncid, int *formatp) +{ + NC_FILE_INFO_T *nc; + + LOG((2, "nc_inq_format: ncid 0x%x", ncid)); + + if (!formatp) + return NC_NOERR; + + /* Find the file metadata. */ + if (!(nc = nc4_find_nc_file(ncid))) + return NC_EBADID; + + /* If this isn't a netcdf-4 file, pass this call on to the netcdf-3 + * library. */ + if (!nc->nc4_info) + return NC3_inq_format(nc->int_ncid, formatp); + + /* Otherwise, this is a netcdf-4 file. Check if classic NC3 rules + * are in effect for this file. */ + if (nc->nc4_info->cmode & NC_CLASSIC_MODEL) + *formatp = NC_FORMAT_NETCDF4_CLASSIC; + else + *formatp = NC_FORMAT_NETCDF4; + + return NC_NOERR; +} + + diff --git a/extern/src_netcdf4/nchashmap.c b/extern/src_netcdf4/nchashmap.c new file mode 100644 index 0000000..3f1eb2b --- /dev/null +++ b/extern/src_netcdf4/nchashmap.c @@ -0,0 +1,194 @@ +/********************************************************************* + * Copyright 1993, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header: /upc/share/CVS/netcdf-3/libncdap3/nchashmap.c,v 1.4 2009/09/23 22:26:08 dmh Exp $ + *********************************************************************/ +#include +#include +#include + +#include "nchashmap.h" + +static ncelem ncDATANULL = (ncelem)0; + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define DEFAULTALLOC 31 + +NChashmap* nchashnew(void) {return nchashnew0(DEFAULTALLOC);} + +NChashmap* nchashnew0(int alloc) +{ + NChashmap* hm; + hm = (NChashmap*)malloc(sizeof(NChashmap)); + if(!hm) return NULL; + hm->alloc = alloc; + hm->table = (NClist**)malloc(hm->alloc*sizeof(NClist*)); + if(!hm->table) {free(hm); return NULL;} + memset((void*)hm->table,0,hm->alloc*sizeof(NClist*)); + return hm; +} + +int +nchashfree(NChashmap* hm) +{ + if(hm) { + int i; + for(i=0;ialloc;i++) { + if(hm->table[i] != NULL) nclistfree(hm->table[i]); + } + free(hm->table); + free(hm); + } + return TRUE; +} + +/* Insert a pair into the table*/ +/* Fail if already there*/ +int +nchashinsert(NChashmap* hm, nchashid hash, ncelem value) +{ + int i,offset,len; + NClist* seq; + ncelem* list; + + offset = (hash % hm->alloc); + seq = hm->table[offset]; + if(seq == NULL) {seq = nclistnew(); hm->table[offset] = seq;} + len = nclistlength(seq); + list = nclistcontents(seq); + for(i=0;isize++; + return TRUE; +} + +/* Insert a pair into the table*/ +/* Overwrite if already there*/ +int +nchashreplace(NChashmap* hm, nchashid hash, ncelem value) +{ + int i,offset,len; + NClist* seq; + ncelem* list; + + offset = (hash % hm->alloc); + seq = hm->table[offset]; + if(seq == NULL) {seq = nclistnew(); hm->table[offset] = seq;} + len = nclistlength(seq); + list = nclistcontents(seq); + for(i=0;isize++; + return TRUE; +} + +/* remove a nchashid*/ +/* return TRUE if found, false otherwise*/ +int +nchashremove(NChashmap* hm, nchashid hash) +{ + int i,offset,len; + NClist* seq; + ncelem* list; + + offset = (hash % hm->alloc); + seq = hm->table[offset]; + if(seq == NULL) return TRUE; + len = nclistlength(seq); + list = nclistcontents(seq); + for(i=0;isize--; + if(nclistlength(seq) == 0) {nclistfree(seq); hm->table[offset] = NULL;} + return TRUE; + } + } + return FALSE; +} + +/* lookup a nchashid; return DATANULL if not found*/ +/* (use hashlookup if the possible values include 0)*/ +ncelem +nchashget(NChashmap* hm, nchashid hash) +{ + ncelem value; + if(!nchashlookup(hm,hash,&value)) return ncDATANULL; + return value; +} + +int +nchashlookup(NChashmap* hm, nchashid hash, ncelem* valuep) +{ + int i,offset,len; + NClist* seq; + ncelem* list; + + offset = (hash % hm->alloc); + seq = hm->table[offset]; + if(seq == NULL) return TRUE; + len = nclistlength(seq); + list = nclistcontents(seq); + for(i=0;ialloc;i++) { + NClist* seq = hm->table[i]; + int len = nclistlength(seq) / 2; + if(len == 0) continue; + if((index - len) < 0) { + if(hashp) *hashp = (nchashid)nclistget(seq,index*2); + if(elemp) *elemp = nclistget(seq,(index*2)+1); + return TRUE; + } + index -= len; + } + return FALSE; +} + +/* Return all the keys; order is completely arbitrary*/ +/* Can be expensive*/ +int +nchashkeys(NChashmap* hm, nchashid** keylist) +{ + int i,j,index; + nchashid* keys; + if(hm == NULL) return FALSE; + if(hm->size == 0) { + keys = NULL; + } else { + keys = (nchashid*)malloc(sizeof(nchashid)*hm->size); + for(index=0,i=0;ialloc;i++) { + NClist* seq = hm->table[i]; + for(j=0;jsize:0) + +#endif /*NCHASHMAP_H*/ + diff --git a/extern/src_netcdf4/ncio.c b/extern/src_netcdf4/ncio.c new file mode 100644 index 0000000..018b5a8 --- /dev/null +++ b/extern/src_netcdf4/ncio.c @@ -0,0 +1,132 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ + +#include +#include + +#include "netcdf.h" +#include "ncio.h" +#include "fbits.h" + +/* With the advent of diskless io, we need to provide + for multiple ncio packages at the same time, + so we have multiple versions of ncio_create. +*/ + +/* Define known ncio packages */ +extern int posixio_create(const char*,int,size_t,off_t,size_t,size_t*,ncio**,void** const); +extern int posixio_open(const char*,int,off_t,size_t,size_t*,ncio**,void** const); + +#ifdef USE_FFIO +extern int ffio_create(const char*,int,size_t,off_t,size_t,size_t*,ncio**,void** const); +extern int ffio_open(const char*,int,off_t,size_t,size_t*,ncio**,void** const); +#endif + +#ifdef USE_DISKLESS +# ifdef USE_MMAP + extern int mmapio_create(const char*,int,size_t,off_t,size_t,size_t*,ncio**,void** const); + extern int mmapio_open(const char*,int,off_t,size_t,size_t*,ncio**,void** const); +# endif + extern int memio_create(const char*,int,size_t,off_t,size_t,size_t*,ncio**,void** const); + extern int memio_open(const char*,int,off_t,size_t,size_t*,ncio**,void** const); +#endif + +int +ncio_create(const char *path, int ioflags, size_t initialsz, + off_t igeto, size_t igetsz, size_t *sizehintp, + ncio** iopp, void** const mempp) +{ +#ifdef USE_DISKLESS + if(fIsSet(ioflags,NC_DISKLESS)) { +# ifdef USE_MMAP + if(fIsSet(ioflags,NC_MMAP)) + return mmapio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,iopp,mempp); + else +# endif /*USE_MMAP*/ + return memio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,iopp,mempp); + } +#endif + +#ifdef USE_FFIO + return ffio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,iopp,mempp); +#else + return posixio_create(path,ioflags,initialsz,igeto,igetsz,sizehintp,iopp,mempp); +#endif +} + +int +ncio_open(const char *path, int ioflags, + off_t igeto, size_t igetsz, size_t *sizehintp, + ncio** iopp, void** const mempp) +{ + /* Diskless open has the following constraints: + 1. file must be classic version 1 or 2 + */ +#ifdef USE_DISKLESS + if(fIsSet(ioflags,NC_DISKLESS)) { +# ifdef USE_MMAP + if(fIsSet(ioflags,NC_MMAP)) + return mmapio_open(path,ioflags,igeto,igetsz,sizehintp,iopp,mempp); + else +# endif /*USE_MMAP*/ + return memio_open(path,ioflags,igeto,igetsz,sizehintp,iopp,mempp); + } +#endif +#ifdef USE_FFIO + return ffio_open(path,ioflags,igeto,igetsz,sizehintp,iopp,mempp); +#else + return posixio_open(path,ioflags,igeto,igetsz,sizehintp,iopp,mempp); +#endif +} + +/**************************************************/ +/* wrapper functions for the ncio dispatch table */ + +int +ncio_rel(ncio *const nciop, off_t offset, int rflags) +{ + return nciop->rel(nciop,offset,rflags); +} + +int +ncio_get(ncio *const nciop, off_t offset, size_t extent, + int rflags, void **const vpp) +{ + return nciop->get(nciop,offset,extent,rflags,vpp); +} + +int +ncio_move(ncio *const nciop, off_t to, off_t from, size_t nbytes, int rflags) +{ + return nciop->move(nciop,to,from,nbytes,rflags); +} + +int +ncio_sync(ncio *const nciop) +{ + return nciop->sync(nciop); +} + +int +ncio_filesize(ncio *nciop, off_t *filesizep) +{ + return nciop->filesize(nciop,filesizep); +} + +int +ncio_pad_length(ncio* nciop, off_t length) +{ + return nciop->pad_length(nciop,length); +} + +int +ncio_close(ncio *nciop, int doUnlink) +{ + /* close and release all resources associated + with nciop, including nciop + */ + int status = nciop->close(nciop,doUnlink); + return status; +} diff --git a/extern/src_netcdf4/ncio.h b/extern/src_netcdf4/ncio.h new file mode 100644 index 0000000..617b851 --- /dev/null +++ b/extern/src_netcdf4/ncio.h @@ -0,0 +1,175 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: ncio.h,v 1.27 2006/01/03 04:56:28 russ Exp $ */ + +#ifndef _NCIO_H_ +#define _NCIO_H_ + +#include /* size_t */ +#include /* off_t */ +#include "netcdf.h" + +typedef struct ncio ncio; /* forward reference */ + +/* + * A value which is an invalid off_t + */ +#define OFF_NONE ((off_t)(-1)) + +/* + * Flags used by the region layer, + * 'rflags' argument to ncio.rel() and ncio.get(). + */ +#define RGN_NOLOCK 0x1 /* Don't lock region. + * Used when contention control handled + * elsewhere. + */ +#define RGN_NOWAIT 0x2 /* return immediate if can't lock, else wait */ + +#define RGN_WRITE 0x4 /* we intend to modify, else read only */ + +#define RGN_MODIFIED 0x8 /* we did modify, else, discard */ + + +/* + * The next four typedefs define the signatures + * of function pointers in struct ncio below. + * They are not used outside of this file and ncio.h, + * They just make some casts in the ncio.c more readable. + */ + /* + * Indicate that you are done with the region which begins + * at offset. Only reasonable flag value is RGN_MODIFIED. + */ +typedef int ncio_relfunc(ncio *const nciop, + off_t offset, int rflags); + + /* + * Request that the region (offset, extent) + * be made available through *vpp. + */ +typedef int ncio_getfunc(ncio *const nciop, + off_t offset, size_t extent, + int rflags, + void **const vpp); + + /* + * Like memmove(), safely move possibly overlapping data. + * Only reasonable flag value is RGN_NOLOCK. + */ +typedef int ncio_movefunc(ncio *const nciop, off_t to, off_t from, + size_t nbytes, int rflags); + + /* + * Write out any dirty buffers to disk and + * ensure that next read will get data from disk. + */ +typedef int ncio_syncfunc(ncio *const nciop); + +/* + * Sync any changes to disk, then truncate or extend file so its size + * is length. This is only intended to be called before close, if the + * file is open for writing and the actual size does not match the + * calculated size, perhaps as the result of having been previously + * written in NOFILL mode. + */ +typedef int ncio_pad_lengthfunc(ncio* nciop, off_t length); + +/* + * Get file size in bytes. + */ +typedef int ncio_filesizefunc(ncio *nciop, off_t *filesizep); + +/* Write out any dirty buffers and + ensure that next read will not get cached data. + Sync any changes, then close the open file associated with the ncio + struct, and free its memory. + nciop - pointer to ncio to close. + doUnlink - if true, unlink file +*/ +typedef int ncio_closefunc(ncio *nciop, int doUnlink); + +/* Get around cplusplus "const xxx in class ncio without constructor" error */ +#if defined(__cplusplus) +#define NCIO_CONST +#else +#define NCIO_CONST const +#endif + +/* + * netcdf i/o abstraction + */ +struct ncio { + /* + * A copy of the ioflags argument passed in to ncio_open() + * or ncio_create(). + */ + int ioflags; + + /* + * The file descriptor of the netcdf file. + * This gets handed to the user as the netcdf id. + */ + NCIO_CONST int fd; + + /* member functions do the work */ + + ncio_relfunc *NCIO_CONST rel; + + ncio_getfunc *NCIO_CONST get; + + ncio_movefunc *NCIO_CONST move; + + ncio_syncfunc *NCIO_CONST sync; + + ncio_pad_lengthfunc *NCIO_CONST pad_length; + + ncio_filesizefunc *NCIO_CONST filesize; + + ncio_closefunc *NCIO_CONST close; + + /* + * A copy of the 'path' argument passed in to ncio_open() + * or ncio_create(). Used by ncabort() to remove (unlink) + * the file and by error messages. + */ + const char *path; + + /* implementation private stuff */ + void *pvt; +}; + +#undef NCIO_CONST + +/* Define wrappers around the ncio dispatch table */ + +extern int ncio_rel(ncio* const, off_t, int); +extern int ncio_get(ncio* const, off_t, size_t, int, void** const); +extern int ncio_move(ncio* const, off_t, off_t, size_t, int); +extern int ncio_sync(ncio* const); +extern int ncio_filesize(ncio* const, off_t*); +extern int ncio_pad_length(ncio* const, off_t); +extern int ncio_close(ncio* const, int); + +extern int ncio_create(const char *path, int ioflags, size_t initialsz, + off_t igeto, size_t igetsz, size_t *sizehintp, + ncio** nciopp, void** const mempp); + +extern int ncio_open(const char *path, int ioflags, + off_t igeto, size_t igetsz, size_t *sizehintp, + ncio** nciopp, void** const mempp); + +/* With the advent of diskless io, we need to provide + for multiple ncio packages at the same time, + so we have multiple versions of ncio_create. + If you create a new package, the you must do the following. + 1. add an extern definition for it in ncio.c + 2. modify ncio_create and ncio_open in ncio.c to invoke + the new package when appropriate. +*/ + + + +#endif /* _NCIO_H_ */ diff --git a/extern/src_netcdf4/nclist.c b/extern/src_netcdf4/nclist.c new file mode 100644 index 0000000..ffce295 --- /dev/null +++ b/extern/src_netcdf4/nclist.c @@ -0,0 +1,224 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ +#include +#include +#include + +#include "nclist.h" + +static ncelem ncDATANULL = (ncelem)0; +/*static int ncinitialized=0;*/ + +int nclistnull(ncelem e) {return e == ncDATANULL;} + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define DEFAULTALLOC 16 +#define ALLOCINCR 16 + +NClist* nclistnew(void) +{ + NClist* l; +/* + if(!ncinitialized) { + memset((void*)&ncDATANULL,0,sizeof(ncelem)); + ncinitialized = 1; + } +*/ + l = (NClist*)malloc(sizeof(NClist)); + if(l) { + l->alloc=0; + l->length=0; + l->content=NULL; + } + return l; +} + +int +nclistfree(NClist* l) +{ + if(l) { + l->alloc = 0; + if(l->content != NULL) {free(l->content); l->content = NULL;} + free(l); + } + return TRUE; +} + +int +nclistsetalloc(NClist* l, unsigned int sz) +{ + ncelem* newcontent; + if(l == NULL) return FALSE; + if(sz <= 0) {sz = (l->length?2*l->length:DEFAULTALLOC);} + if(l->alloc >= sz) {return TRUE;} + newcontent=(ncelem*)calloc(sz,sizeof(ncelem)); + if(l->alloc > 0 && l->length > 0 && l->content != NULL) { + memcpy((void*)newcontent,(void*)l->content,sizeof(ncelem)*l->length); + } + if(l->content != NULL) free(l->content); + l->content=newcontent; + l->alloc=sz; + return TRUE; +} + +int +nclistsetlength(NClist* l, unsigned int sz) +{ + if(l == NULL) return FALSE; + if(sz > l->alloc && !nclistsetalloc(l,sz)) return FALSE; + l->length = sz; + return TRUE; +} + +ncelem +nclistget(NClist* l, unsigned int index) +{ + if(l == NULL || l->length == 0) return ncDATANULL; + if(index >= l->length) return ncDATANULL; + return l->content[index]; +} + +int +nclistset(NClist* l, unsigned int index, ncelem elem) +{ + if(l == NULL) return FALSE; + if(index >= l->length) return FALSE; + l->content[index] = elem; + return TRUE; +} + +/* Insert at position i of l; will push up elements i..|seq|. */ +int +nclistinsert(NClist* l, unsigned int index, ncelem elem) +{ + int i; /* do not make unsigned */ + if(l == NULL) return FALSE; + if(index > l->length) return FALSE; + nclistsetalloc(l,0); + for(i=(int)l->length;i>index;i--) l->content[i] = l->content[i-1]; + l->content[index] = elem; + l->length++; + return TRUE; +} + +int +nclistpush(NClist* l, ncelem elem) +{ + if(l == NULL) return FALSE; + if(l->length >= l->alloc) nclistsetalloc(l,0); + l->content[l->length] = elem; + l->length++; + return TRUE; +} + +ncelem +nclistpop(NClist* l) +{ + if(l == NULL || l->length == 0) return ncDATANULL; + l->length--; + return l->content[l->length]; +} + +ncelem +nclisttop(NClist* l) +{ + if(l == NULL || l->length == 0) return ncDATANULL; + return l->content[l->length - 1]; +} + +ncelem +nclistremove(NClist* l, unsigned int i) +{ + unsigned int len; + ncelem elem; + if(l == NULL || (len=l->length) == 0) return ncDATANULL; + if(i >= len) return ncDATANULL; + elem = l->content[i]; + for(i+=1;icontent[i-1] = l->content[i]; + l->length--; + return elem; +} + +/* Duplicate and return the content (null terminate) */ +ncelem* +nclistdup(NClist* l) +{ + ncelem* result = (ncelem*)malloc(sizeof(ncelem)*(l->length+1)); + memcpy((void*)result,(void*)l->content,sizeof(ncelem)*l->length); + result[l->length] = (ncelem)0; + return result; +} + +int +nclistcontains(NClist* list, ncelem elem) +{ + unsigned int i; + for(i=0;ilength) == 0) return ncDATANULL; + for(i=0;icontent[i]; + if(elem == candidate) { + for(i+=1;icontent[i-1] = l->content[i]; + l->length--; + found = 1; + break; + } + } + return found; +} + + + + +/* Extends nclist to include a unique operator + which remove duplicate values; NULL values removed + return value is always 1. +*/ + +int +nclistunique(NClist* list) +{ + unsigned int i,j,k,len; + ncelem* content; + if(list == NULL || list->length == 0) return 1; + len = list->length; + content = list->content; + for(i=0;ilength = len; + return 1; +} + +NClist* +nclistclone(NClist* list) +{ + NClist* clone = nclistnew(); + *clone = *list; + clone->content = nclistdup(list); + return clone; +} diff --git a/extern/src_netcdf4/nclist.h b/extern/src_netcdf4/nclist.h new file mode 100644 index 0000000..260ddd0 --- /dev/null +++ b/extern/src_netcdf4/nclist.h @@ -0,0 +1,67 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ +#ifndef NCLIST_H +#define NCLIST_H 1 + +/* Define the type of the elements in the list*/ + +#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) +#define EXTERNC extern "C" +#else +#define EXTERNC extern +#endif + +typedef unsigned long ncelem; + +EXTERNC int nclistnull(ncelem); + +typedef struct NClist { + unsigned int alloc; + unsigned int length; + ncelem* content; +} NClist; + +EXTERNC NClist* nclistnew(void); +EXTERNC int nclistfree(NClist*); +EXTERNC int nclistsetalloc(NClist*,unsigned int); +EXTERNC int nclistsetlength(NClist*,unsigned int); + +/* Set the ith element */ +EXTERNC int nclistset(NClist*,unsigned int,ncelem); +/* Get value at position i */ +EXTERNC ncelem nclistget(NClist*,unsigned int);/* Return the ith element of l */ +/* Insert at position i; will push up elements i..|seq|. */ +EXTERNC int nclistinsert(NClist*,unsigned int,ncelem); +/* Remove element at position i; will move higher elements down */ +EXTERNC ncelem nclistremove(NClist* l, unsigned int i); + +/* Tail operations */ +EXTERNC int nclistpush(NClist*,ncelem); /* Add at Tail */ +EXTERNC ncelem nclistpop(NClist*); +EXTERNC ncelem nclisttop(NClist*); + +/* Duplicate and return the content (null terminate) */ +EXTERNC ncelem* nclistdup(NClist*); + +/* Look for value match */ +EXTERNC int nclistcontains(NClist*, ncelem); + +/* Remove element by value; only removes first encountered */ +EXTERNC int nclistelemremove(NClist* l, ncelem elem); + + +/* remove duplicates */ +EXTERNC int nclistunique(NClist*); + +/* Create a clone of a list */ +EXTERNC NClist* nclistclone(NClist*); + +/* Following are always "in-lined"*/ +#define nclistclear(l) nclistsetlength((l),0U) +#define nclistextend(l,len) nclistsetalloc((l),(len)+(l->alloc)) +#define nclistcontents(l) ((l)->content) +#define nclistlength(l) ((l)?(l)->length:0U) + +#endif /*NCLIST_H*/ + + diff --git a/extern/src_netcdf4/nclistmgr.c b/extern/src_netcdf4/nclistmgr.c new file mode 100644 index 0000000..f4241f1 --- /dev/null +++ b/extern/src_netcdf4/nclistmgr.c @@ -0,0 +1,80 @@ +/********************************************************************* + Copyright 2010, UCAR/Unidata See netcdf/COPYRIGHT file for + copying and redistribution conditions. + *********************************************************************/ + +#include +#include +#include +#include +#include "nc.h" + +#define ID_SHIFT (16) +#define NCFILELISTLENGTH 0x10000 +/* Version one just allocates the max space (sizeof(NC*)*2^16)*/ +static NC** nc_filelist = NULL; + +static int numfiles = 0; + +/* Common */ +int +count_NCList(void) +{ + return numfiles; +} + + +void +free_NCList(void) +{ + if(numfiles > 0) return; /* not empty */ + if(nc_filelist != NULL) free(nc_filelist); + nc_filelist = NULL; +} + +int +add_to_NCList(NC* ncp) +{ + int i; + int new_id; + if(nc_filelist == NULL) { + if (!(nc_filelist = calloc(1, sizeof(NC*)*NCFILELISTLENGTH))) + return NC_ENOMEM; + numfiles = 0; + } + new_id = 0; /* id's begin at 1 */ + for(i=1;i<0x10000;i++) { + if(nc_filelist[i] == NULL) {new_id = i; break;} + } + if(new_id == 0) return NC_ENOMEM; /* no more slots */ + nc_filelist[new_id] = ncp; + numfiles++; + new_id = (new_id << ID_SHIFT); + ncp->ext_ncid = new_id; + return NC_NOERR; +} + +void +del_from_NCList(NC* ncp) +{ + unsigned int ncid = ((unsigned int)ncp->ext_ncid) >> ID_SHIFT; + if(numfiles == 0 || ncid == 0 || nc_filelist == NULL) return; + if(nc_filelist[ncid] != ncp) return; + nc_filelist[ncid] = NULL; + numfiles--; + + /* If all files have been closed, release the filelist memory. */ + if (numfiles == 0) + free_NCList(); +} + +NC * +find_in_NCList(int ext_ncid) +{ + NC* f = NULL; + unsigned int ncid = ((unsigned int)ext_ncid) >> ID_SHIFT; + if(numfiles > 0 && nc_filelist != NULL && ncid < NCFILELISTLENGTH) + f = nc_filelist[ncid]; + return f; +} + diff --git a/extern/src_netcdf4/nclog.h b/extern/src_netcdf4/nclog.h new file mode 100644 index 0000000..1284b6b --- /dev/null +++ b/extern/src_netcdf4/nclog.h @@ -0,0 +1,31 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header$ + *********************************************************************/ + +#ifndef NCLOG_H +#define NCLOG_H + +#define ENVFLAG "NCLOGFILE" + +/* Suggested tag values */ +#define NCLOGNOTE 0 +#define NCLOGWARN 1 +#define NCLOGERR 2 +#define NCLOGDBG 3 + +extern void ncloginit(void); +extern void ncsetlogging(int tf); +extern void nclogopen(const char* file); +extern void nclogclose(void); + +/* The tag value is an arbitrary integer */ +extern void nclog(int tag, const char* fmt, ...); +extern void nclogtext(int tag, const char* text); +extern void nclogtextn(int tag, const char* text, size_t count); + +/* Provide printable names for tags */ +extern void nclogsettags(char** tagset, char* dfalt); + +#endif /*NCLOG_H*/ diff --git a/extern/src_netcdf4/nctime.c b/extern/src_netcdf4/nctime.c new file mode 100644 index 0000000..e21d920 --- /dev/null +++ b/extern/src_netcdf4/nctime.c @@ -0,0 +1,1169 @@ +/********************************************************************* + * Copyright 2008, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Id: nctime.c,v 1.9 2010/05/05 22:15:39 dmh Exp $ + *********************************************************************/ + +/* + * This code was extracted with permission from the CDMS time + * conversion and arithmetic routines developed by Bob Drach, Lawrence + * Livermore National Laboratory as part of the cdtime library. Russ + * Rew of the UCAR Unidata Program made changes and additions to + * support the "-t" option of the netCDF ncdump utility, including a + * 366-day climate calendar. + * + * For the complete time conversion and climate calendar facilities of + * the CDMS library, get the original sources from LLNL. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "nctime.h" + +static int cuErrOpts; /* Error options */ +static int cuErrorOccurred = 0; /* True iff cdError was called */ + +#define CU_FATAL 1 /* Exit immediately on fatal error */ +#define CU_VERBOSE 2 /* Report errors */ + +#define CD_DEFAULT_BASEYEAR "1979" /* Default base year for relative time (no 'since' clause) */ +#define VALCMP(a,b) ((a)<(b)?-1:(b)<(a)?1:0) + +/* forward declarations */ +static void cdComp2Rel(cdCalenType timetype, cdCompTime comptime, char* relunits, double* reltime); +static void cdRel2CompMixed(double reltime, cdUnitTime unit, cdCompTime basetime, cdCompTime *comptime); +static void cdRel2Comp(cdCalenType timetype, char* relunits, double reltime, cdCompTime* comptime); + +/* Trim trailing whitespace, up to n characters. */ +/* If no whitespace up to the last character, set */ +/* the last character to null, else set the first */ +/* whitespace character to null. */ +static void +cdTrim(char* s, int n) +{ + char* c; + + if(s==NULL) + return; + for(c=s; *c && cyear (long) (year since 0 BC) + * date->timeType (CdTimetype) (time type) + * date->baseYear base year for relative times + * Output: + * date->month (short) (month in year) + * date->day (short) (day in month) + * + * + * Derived from NRL NEONS V3.6. + */ + +static void +CdMonthDay(int *doy, CdTime *date) +{ + int i; /* month counter */ + int idoy; /* day of year counter */ + long year; + + if ((idoy = *doy) < 1) { + date->month = 0; + date->day = 0; + return; + } + + if(!(date->timeType & CdChronCal)) /* Ignore year for Clim calendar */ + year = 0; + else if(!(date->timeType & CdBase1970)) /* year is offset from base for relative time */ + year = date->baseYear + date->year; + else + year = date->year; + + if (ISLEAP(year,date->timeType)) { + mon_day_cnt[1] = 29; + } else { + mon_day_cnt[1] = 28; + } + date->month = 0; + for (i = 0; i < 12; i++) { + (date->month)++; + date->day = idoy; + if ((idoy -= ((date->timeType & Cd365) ? (mon_day_cnt[date->month-1]) : 30)) <= 0) { + return; + } + } + return; +} + +/* Compute day-of-year from year, month and day + * + * Input: + * date->year (long) (year since 0 BC) + * date->month (short) (month in year) + * date->day (short) (day in month) + * date->baseYear base year for relative times + * Output: doy (int) (day-of-year) + * + * Derived from NRL NEONS V3.6 + */ + +static void +CdDayOfYear(CdTime *date, int *doy) +{ + int leap_add = 0; /* add 1 day if leap year */ + int month; /* month */ + long year; + + month = date->month; + if (month < 1 || month > 12) { + cdError( "Day-of-year error; month: %d\n", month); + month = 1; + } + + if(!(date->timeType & CdChronCal)) /* Ignore year for Clim calendar */ + year = 0; + else if(!(date->timeType & CdBase1970)) /* year is offset from base for relative time */ + year = date->baseYear + date->year; + else + year = date->year; + + if (ISLEAP(year,date->timeType) && month > 2) leap_add = 1; + if( ((date->timeType) & Cd365) || ((date->timeType) & Cd366) ) { + *doy = days_sum[month-1] + date->day + leap_add ; + } else { /* date->timeType & Cd360 */ + *doy = 30*(month-1) + date->day + leap_add ; + } + return; +} + +/* Convert epochal time (hours since 00 jan 1, 1970) + * to human time (structured) + * + * Input: + * etime = epochal time representation + * timeType = time type (e.g., CdChron, CdClim, etc.) as defined in cdms.h + * baseYear = base real, used for relative time types only + * + * Output: htime = human (structured) time representation + * + * Derived from NRL Neons V3.6 + */ +void +Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime) +{ + long ytemp; /* temporary year holder */ + int yr_day_cnt; /* count of days in year */ + int doy; /* day of year */ + int daysInLeapYear; /* number of days in a leap year */ + int daysInYear; /* days in non-leap year */ + extern void CdMonthDay(int *doy, CdTime *date); + + doy = (long) floor(etime / 24.) + 1; + htime->hour = etime - (double) (doy - 1) * 24.; + + /* Correct for goofy floor func on J90 */ + if(htime->hour >= 24.){ + doy += 1; + htime->hour -= 24.; + } + + htime->baseYear = (timeType & CdBase1970) ? 1970 : baseYear; + if(!(timeType & CdChronCal)) htime->baseYear = 0; /* Set base year to 0 for Clim */ + if(timeType & Cd366) { + daysInLeapYear = 366; + daysInYear = 366; + } else { + daysInLeapYear = (timeType & Cd365) ? 366 : 360; + daysInYear = (timeType & Cd365) ? 365 : 360; + } + + if (doy > 0) { + for (ytemp = htime->baseYear; ; ytemp++) { + yr_day_cnt = ISLEAP(ytemp,timeType) ? daysInLeapYear : daysInYear; + if (doy <= yr_day_cnt) break; + doy -= yr_day_cnt; + } + } else { + for (ytemp = htime->baseYear-1; ; ytemp--) { + yr_day_cnt = ISLEAP(ytemp,timeType) ? daysInLeapYear : daysInYear; + doy += yr_day_cnt; + if (doy > 0) break; + } + } + htime->year = (timeType & CdBase1970) ? ytemp : (ytemp - htime->baseYear); + if(!(timeType & CdChronCal)) htime->year = 0; /* Set year to 0 for Clim */ + htime->timeType = timeType; + CdMonthDay(&doy,htime); + + return; +} + +/* Add 'nDel' times 'delTime' to epochal time 'begEtm', + * return the result in epochal time 'endEtm'. + */ +static void +CdAddDelTime(double begEtm, long nDel, CdDeltaTime delTime, CdTimeType timeType, + long baseYear, double *endEtm) +{ + double delHours; + long delMonths, delYears; + CdTime bhtime, ehtime; + + extern void Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime); + extern void Cdh2e(CdTime *htime, double *etime); + + switch(delTime.units){ + case CdYear: + delMonths = 12; + break; + case CdSeason: + delMonths = 3; + break; + case CdMonth: + delMonths = 1; + break; + case CdWeek: + delHours = 168.0; + break; + case CdDay: + delHours = 24.0; + break; + case CdHour: + delHours = 1.0; + break; + case CdMinute: + delHours = 1./60.; + break; + case CdSecond: + delHours = 1./3600.; + break; + default: + cdError("Invalid delta time units: %d\n",delTime.units); + return; + } + + switch(delTime.units){ + case CdYear: case CdSeason: case CdMonth: + Cde2h(begEtm,timeType,baseYear,&bhtime); + delMonths = delMonths * nDel * delTime.count + bhtime.month - 1; + delYears = (delMonths >= 0 ? (delMonths/12) : (delMonths+1)/12 - 1); + ehtime.year = bhtime.year + delYears; + ehtime.month = delMonths - (12 * delYears) + 1; + ehtime.day = 1; + ehtime.hour = 0.0; + ehtime.timeType = timeType; + ehtime.baseYear = !(timeType & CdChronCal) ? 0 : + (timeType & CdBase1970) ? 1970 : baseYear; /* base year is 0 for Clim, */ + /* 1970 for Chron, */ + /* or input base year for Rel */ + Cdh2e(&ehtime,endEtm); + break; + case CdWeek: case CdDay: case CdHour: case CdMinute: case CdSecond: + delHours *= (nDel * delTime.count); + *endEtm = begEtm + delHours; + break; + default: break; + } + return; +} + +/* Parse relative units, returning the unit and base component time. */ +/* Function returns 1 if error, 0 on success */ +int +cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTime* base_comptime) +{ + char charunits[CD_MAX_RELUNITS]; + char basetime_1[CD_MAX_CHARTIME]; + char basetime_2[CD_MAX_CHARTIME]; + char basetime[CD_MAX_CHARTIME]; + int nconv1, nconv2, nconv; + + /* Parse the relunits */ + /* Allow ISO-8601 "T" date-time separator as well as blank separator */ + nconv1 = sscanf(relunits,"%s since %[^T]T%s",charunits,basetime_1,basetime_2); + if(nconv1==EOF || nconv1==0){ + cdError("Error on relative units conversion, string = %s\n",relunits); + return 1; + } + nconv2 = sscanf(relunits,"%s since %s %s",charunits,basetime_1,basetime_2); + if(nconv2==EOF || nconv2==0){ + cdError("Error on relative units conversion, string = %s\n",relunits); + return 1; + } + if(nconv1 < nconv2) { + nconv = nconv2; + } else { + nconv = sscanf(relunits,"%s since %[^T]T%s",charunits,basetime_1,basetime_2); + } + /* Get the units */ + cdTrim(charunits,CD_MAX_RELUNITS); + if(!strncmp(charunits,"sec",3) || !strcmp(charunits,"s")){ + *unit = cdSecond; + } + else if(!strncmp(charunits,"min",3) || !strcmp(charunits,"mn")){ + *unit = cdMinute; + } + else if(!strncmp(charunits,"hour",4) || !strcmp(charunits,"hr")){ + *unit = cdHour; + } + else if(!strncmp(charunits,"day",3) || !strcmp(charunits,"dy")){ + *unit = cdDay; + } + else if(!strncmp(charunits,"week",4) || !strcmp(charunits,"wk")){ + *unit = cdWeek; + } + else if(!strncmp(charunits,"month",5) || !strcmp(charunits,"mo")){ + *unit = cdMonth; + } + else if(!strncmp(charunits,"season",6)){ + *unit = cdSeason; + } + else if(!strncmp(charunits,"year",4) || !strcmp(charunits,"yr")){ + if(!(timetype & cdStandardCal)){ + cdError("Error on relative units conversion: climatological units cannot be 'years'.\n"); + return 1; + } + *unit = cdYear; + } + else { + cdError("Error on relative units conversion: invalid units = %s\n",charunits); + return 1; + } + + /* Build the basetime, if any (default is 1979), */ + /* or month 1 for climatological time. */ + if(nconv == 1){ + if(timetype & cdStandardCal) + strcpy(basetime,CD_DEFAULT_BASEYEAR); + else + strcpy(basetime,"1"); + } + /* Convert the basetime to component, then epochal (hours since 1970) */ + else{ + if(nconv == 2){ + cdTrim(basetime_1,CD_MAX_CHARTIME); + strcpy(basetime,basetime_1); + } + else{ + cdTrim(basetime_1,CD_MAX_CHARTIME); + cdTrim(basetime_2,CD_MAX_CHARTIME); + sprintf(basetime,"%s %s",basetime_1,basetime_2); + } + } + + cdChar2Comp(timetype, basetime, base_comptime); + + return 0; +} + +/* ca - cb in Gregorian calendar */ +/* Result is in hours. */ +static double +cdDiffGregorian(cdCompTime ca, cdCompTime cb){ + + double rela, relb; + + cdComp2Rel(cdStandard, ca, "hours", &rela); + cdComp2Rel(cdStandard, cb, "hours", &relb); + return (rela - relb); +} + +/* Return -1, 0, 1 as ca is less than, equal to, */ +/* or greater than cb, respectively. */ +static int +cdCompCompare(cdCompTime ca, cdCompTime cb){ + + int test; + + if ((test = VALCMP(ca.year, cb.year))) + return test; + else if ((test = VALCMP(ca.month, cb.month))) + return test; + else if ((test = VALCMP(ca.day, cb.day))) + return test; + else + return (VALCMP(ca.hour, cb.hour)); +} + +/* ca - cb in Julian calendar. Result is in hours. */ +static double +cdDiffJulian(cdCompTime ca, cdCompTime cb){ + + double rela, relb; + + cdComp2Rel(cdJulian, ca, "hours", &rela); + cdComp2Rel(cdJulian, cb, "hours", &relb); + return (rela - relb); +} + +/* ca - cb in mixed Julian/Gregorian calendar. */ +/* Result is in hours. */ +static double +cdDiffMixed(cdCompTime ca, cdCompTime cb){ + + static cdCompTime ZA = {1582, 10, 5, 0.0}; + static cdCompTime ZB = {1582, 10, 15, 0.0}; + double result; + + if (cdCompCompare(cb, ZB) == -1){ + if (cdCompCompare(ca, ZB) == -1) { + result = cdDiffJulian(ca, cb); + } + else { + result = cdDiffGregorian(ca, ZB) + cdDiffJulian(ZA, cb); + } + } + else { + if (cdCompCompare(ca, ZB) == -1){ + result = cdDiffJulian(ca, ZA) + cdDiffGregorian(ZB, cb); + } + else { + result = cdDiffGregorian(ca, cb); + } + } + return result; +} + +/* Divide ('endEtm' - 'begEtm') by 'delTime', + * return the integer portion of the result in 'nDel'. + */ +static void +CdDivDelTime(double begEtm, double endEtm, CdDeltaTime delTime, CdTimeType timeType, + long baseYear, long *nDel) +{ + double delHours, frange; + long delMonths, range; + CdTime bhtime, ehtime; + int hoursInYear; + + extern void Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime); + + switch(delTime.units){ + case CdYear: + delMonths = 12; + break; + case CdSeason: + delMonths = 3; + break; + case CdMonth: + delMonths = 1; + break; + case CdWeek: + delHours = 168.0; + break; + case CdDay: + delHours = 24.0; + break; + case CdHour: + delHours = 1.0; + break; + case CdMinute: + delHours = 1./60.; + break; + case CdSecond: + delHours = 1./3600.; + break; + default: + cdError("Invalid delta time units: %d\n",delTime.units); + return; + } + + switch(delTime.units){ + case CdYear: case CdSeason: case CdMonth: + delMonths *= delTime.count; + Cde2h(begEtm,timeType,baseYear,&bhtime); + Cde2h(endEtm,timeType,baseYear,&ehtime); + if(timeType & CdChronCal){ /* Chron and Rel time */ + range = 12*(ehtime.year - bhtime.year) + + (ehtime.month - bhtime.month); + } + else{ /* Clim time, ignore year */ + range = (ehtime.month - bhtime.month); + if(range < 0) range += 12; + } + *nDel = abs(range)/delMonths; + break; + case CdWeek: case CdDay: case CdHour: case CdMinute: case CdSecond: + delHours *= (double)delTime.count; + if(timeType & CdChronCal){ /* Chron and Rel time */ + frange = fabs(endEtm - begEtm); + } + else{ /* Clim time, ignore year, but */ + /* wraparound relative to hours-in-year*/ + frange = endEtm - begEtm; + if(timeType & Cd366) { + hoursInYear = 8784; + } else { + hoursInYear = (timeType & Cd365) ? 8760. : 8640.; + } + /* Normalize frange to interval [0,hoursInYear) */ + if(frange < 0.0 || frange >= hoursInYear) + frange -= hoursInYear * floor(frange/hoursInYear); + } + *nDel = (frange + 1.e-10*delHours)/delHours; + break; + default: break; + } + return; +} + +/* Value is in hours. Translate to units. */ +static double +cdFromHours(double value, cdUnitTime unit){ + double result; + + switch(unit){ + case cdSecond: + result = value * 3600.0; + break; + case cdMinute: + result = value * 60.0; + break; + case cdHour: + result = value; + break; + case cdDay: + result = value/24.0; + break; + case cdWeek: + result = value/168.0; + break; + case cdMonth: + case cdSeason: + case cdYear: + case cdFraction: + default: + cdError("Error on conversion from hours to vague unit"); + result = 0; + break; + } + return result; +} + /* Map to old timetypes */ +static int +cdToOldTimetype(cdCalenType newtype, CdTimeType* oldtype) +{ + switch(newtype){ + case cdStandard: + *oldtype = CdChron; + break; + case cdJulian: + *oldtype = CdJulianCal; + break; + case cdNoLeap: + *oldtype = CdChronNoLeap; + break; + case cd360: + *oldtype = CdChron360; + break; + case cd366: + *oldtype = CdChron366; + break; + case cdClim: + *oldtype = CdClim; + break; + case cdClimLeap: + *oldtype = CdClimLeap; + break; + case cdClim360: + *oldtype = CdClim360; + break; + default: + cdError("Error on relative units conversion, invalid timetype = %d",newtype); + return 1; + } + return 0; +} + +/* Convert human time to epochal time (hours since 00 jan 1, 1970) + * + * Input: htime = human time representation + * + * Output: etime = epochal time representation + * + * Derived from NRL Neons V3.6 + */ +void +Cdh2e(CdTime *htime, double *etime) +{ + long ytemp, year; /* temporary year holder */ + int day_cnt; /* count of days */ + int doy; /* day of year */ + long baseYear; /* base year for epochal time */ + int daysInLeapYear; /* number of days in a leap year */ + int daysInYear; /* days in non-leap year */ + extern void CdDayOfYear(CdTime *date, int *doy); + + CdDayOfYear(htime,&doy); + + day_cnt = 0; + + baseYear = ((htime->timeType) & CdBase1970) ? 1970 : htime->baseYear; + year = ((htime->timeType) & CdBase1970) ? htime->year : (htime->year + htime->baseYear); + if(!((htime->timeType) & CdChronCal)) baseYear = year = 0; /* set year and baseYear to 0 for Clim */ + if((htime->timeType) & Cd366) { + daysInLeapYear = 366; + daysInYear = 366; + } else { + daysInLeapYear = ((htime->timeType) & Cd365) ? 366 : 360; + daysInYear = ((htime->timeType) & Cd365) ? 365 : 360; + } + + if (year > baseYear) { + for (ytemp = year - 1; ytemp >= baseYear; ytemp--) { + day_cnt += ISLEAP(ytemp,htime->timeType) ? daysInLeapYear : daysInYear; + } + } else if (year < baseYear) { + for (ytemp = year; ytemp < baseYear; ytemp++) { + day_cnt -= ISLEAP(ytemp,htime->timeType) ? daysInLeapYear : daysInYear; + } + } + *etime = (double) (day_cnt + doy - 1) * 24. + htime->hour; + return; +} + +/* Validate the component time, return 0 if valid, 1 if not */ +static int +cdValidateTime(cdCalenType timetype, cdCompTime comptime) +{ + if(comptime.month<1 || comptime.month>12){ + cdError("Error on time conversion: invalid month = %hd\n",comptime.month); + return 1; + } + if(comptime.day<1 || comptime.day>31){ + cdError("Error on time conversion: invalid day = %hd\n",comptime.day); + return 1; + } + if(comptime.hour<0.0 || comptime.hour>24.0){ + cdError("Error on time conversion: invalid hour = %lf\n",comptime.hour); + return 1; + } + return 0; +} + +void +cdChar2Comp(cdCalenType timetype, char* chartime, cdCompTime* comptime) +{ + double sec; + int ihr, imin, nconv; + long year; + short day; + short month; + + comptime->year = CD_NULL_YEAR; + comptime->month = CD_NULL_MONTH; + comptime->day = CD_NULL_DAY; + comptime->hour = CD_NULL_HOUR; + + if(timetype & cdStandardCal){ + nconv = sscanf(chartime,"%ld-%hd-%hd %d:%d:%lf",&year,&month,&day,&ihr,&imin,&sec); + if(nconv==EOF || nconv==0){ + cdError("Error on character time conversion, string = %s\n",chartime); + return; + } + if(nconv >= 1){ + comptime->year = year; + } + if(nconv >= 2){ + comptime->month = month; + } + if(nconv >= 3){ + comptime->day = day; + } + if(nconv >= 4){ + if(ihr<0 || ihr>23){ + cdError("Error on character time conversion: invalid hour = %d\n",ihr); + return; + } + comptime->hour = (double)ihr; + } + if(nconv >= 5){ + if(imin<0 || imin>59){ + cdError("Error on character time conversion: invalid minute = %d\n",imin); + return; + } + comptime->hour += (double)imin/60.; + } + if(nconv >= 6){ + if(sec<0.0 || sec>60.0){ + cdError("Error on character time conversion: invalid second = %lf\n",sec); + return; + } + comptime->hour += sec/3600.; + } + } + else{ /* Climatological */ + nconv = sscanf(chartime,"%hd-%hd %d:%d:%lf",&month,&day,&ihr,&imin,&sec); + if(nconv==EOF || nconv==0){ + cdError("Error on character time conversion, string = %s",chartime); + return; + } + if(nconv >= 1){ + comptime->month = month; + } + if(nconv >= 2){ + comptime->day = day; + } + if(nconv >= 3){ + if(ihr<0 || ihr>23){ + cdError("Error on character time conversion: invalid hour = %d\n",ihr); + return; + } + comptime->hour = (double)ihr; + } + if(nconv >= 4){ + if(imin<0 || imin>59){ + cdError("Error on character time conversion: invalid minute = %d\n",imin); + return; + } + comptime->hour += (double)imin/60.; + } + if(nconv >= 5){ + if(sec<0.0 || sec>60.0){ + cdError("Error on character time conversion: invalid second = %lf\n",sec); + return; + } + comptime->hour += sec/3600.; + } + } + (void)cdValidateTime(timetype,*comptime); + return; +} + +/* Convert ct to relunits (unit, basetime) */ +/* in the mixed Julian/Gregorian calendar. */ +/* unit is anything but year, season, month. unit and basetime are */ +/* from the parsed relunits. Return result in reltime. */ +static void +cdComp2RelMixed(cdCompTime ct, cdUnitTime unit, cdCompTime basetime, double *reltime){ + + double hourdiff; + + hourdiff = cdDiffMixed(ct, basetime); + *reltime = cdFromHours(hourdiff, unit); + return; +} + +static void +cdComp2Rel(cdCalenType timetype, cdCompTime comptime, char* relunits, double* reltime) +{ + cdCompTime base_comptime; + CdDeltaTime deltime; + CdTime humantime; + CdTimeType old_timetype; + cdUnitTime unit; + double base_etm, etm, delta; + long ndel, hoursInYear; + + /* Parse the relunits */ + if(cdParseRelunits(timetype, relunits, &unit, &base_comptime)) + return; + + /* Handle mixed Julian/Gregorian calendar */ + if (timetype == cdMixed){ + switch(unit){ + case cdWeek: case cdDay: case cdHour: case cdMinute: case cdSecond: + cdComp2RelMixed(comptime, unit, base_comptime, reltime); + return; + case cdYear: case cdSeason: case cdMonth: + timetype = cdStandard; + break; + case cdFraction: + cdError("invalid unit in conversion"); + break; + default: break; + } + } + + /* Convert basetime to epochal */ + humantime.year = base_comptime.year; + humantime.month = base_comptime.month; + humantime.day = base_comptime.day; + humantime.hour = base_comptime.hour; + humantime.baseYear = 1970; + /* Map to old-style timetype */ + if(cdToOldTimetype(timetype,&old_timetype)) + return; + humantime.timeType = old_timetype; + Cdh2e(&humantime,&base_etm); + + /* Map end time to epochal */ + humantime.year = comptime.year; + humantime.month = comptime.month; + humantime.day = comptime.day; + humantime.hour = comptime.hour; + Cdh2e(&humantime,&etm); + /* Calculate relative time value for months or hours */ + deltime.count = 1; + deltime.units = (CdTimeUnit)unit; + switch(unit){ + case cdWeek: case cdDay: case cdHour: case cdMinute: case cdSecond: + delta = etm - base_etm; + if(!(timetype & cdStandardCal)){ /* Climatological time */ + hoursInYear = (timetype & cd365Days) ? 8760. : (timetype & cdHasLeap) ? 8784. : 8640.; + /* Normalize delta to interval [0,hoursInYear) */ + if(delta < 0.0 || delta >= hoursInYear) + delta -= hoursInYear * floor(delta/hoursInYear); + } + break; + case cdYear: case cdSeason: case cdMonth: + CdDivDelTime(base_etm, etm, deltime, old_timetype, 1970, &ndel); + break; + case cdFraction: + cdError("invalid unit in conversion"); + break; + default: break; + } + + /* Convert to output units */ + switch(unit){ + case cdSecond: + *reltime = 3600.0 * delta; + break; + case cdMinute: + *reltime = 60.0 * delta; + break; + case cdHour: + *reltime = delta; + break; + case cdDay: + *reltime = delta/24.0; + break; + case cdWeek: + *reltime = delta/168.0; + break; + case cdMonth: case cdSeason: case cdYear: /* Already in correct units */ + if(timetype & cdStandardCal) + *reltime = (base_etm <= etm) ? (double)ndel : (double)(-ndel); + else /* Climatological time is already normalized*/ + *reltime = (double)ndel; + break; + default: + cdError("invalid unit in conversion"); + break; + } + + return; +} + +/* Add (value,unit) to comptime. */ +/* value is in hours. */ +/* calendar is anything but cdMixed. */ +static void +cdCompAdd(cdCompTime comptime, double value, cdCalenType calendar, cdCompTime *result){ + + double reltime; + + cdComp2Rel(calendar, comptime, "hours", &reltime); + reltime += value; + cdRel2Comp(calendar, "hours", reltime, result); + return; +} + +/* Add value in hours to ct, in the mixed Julian/Gregorian + * calendar. */ +static void +cdCompAddMixed(cdCompTime ct, double value, cdCompTime *result){ + + static cdCompTime ZA = {1582, 10, 5, 0.0}; + static cdCompTime ZB = {1582, 10, 15, 0.0}; + double xj, xg; + + if (cdCompCompare(ct, ZB) == -1){ + xj = cdDiffJulian(ZA, ct); + if (value <= xj){ + cdCompAdd(ct, value, cdJulian, result); + } + else { + cdCompAdd(ZB, value-xj, cdStandard, result); + } + } + else { + xg = cdDiffGregorian(ZB, ct); + if (value > xg){ + cdCompAdd(ct, value, cdStandard, result); + } + else { + cdCompAdd(ZA, value-xg, cdJulian, result); + } + } + return; +} + +/* Return value expressed in hours. */ +static double +cdToHours(double value, cdUnitTime unit){ + + double result = 0; + + switch(unit){ + case cdSecond: + result = value/3600.0; + break; + case cdMinute: + result = value/60.0; + break; + case cdHour: + result = value; + break; + case cdDay: + result = 24.0 * value; + break; + case cdWeek: + result = 168.0 * value; + break; + default: + cdError("invalid unit in conversion"); + break; + + } + return result; +} + +/* Convert relative time (reltime, unit, basetime) to comptime in the + * mixed Julian/Gregorian calendar. unit is anything but year, season, + * month. unit and basetime are from the parsed relunits. Return + * result in comptime. */ +static void +cdRel2CompMixed(double reltime, cdUnitTime unit, cdCompTime basetime, cdCompTime *comptime){ + + reltime = cdToHours(reltime, unit); + cdCompAddMixed(basetime, reltime, comptime); + return; +} + + +static void +cdRel2Comp(cdCalenType timetype, char* relunits, double reltime, cdCompTime* comptime) +{ + CdDeltaTime deltime; + CdTime humantime; + CdTimeType old_timetype; + cdCompTime base_comptime; + cdUnitTime unit, baseunits; + double base_etm, result_etm; + double delta; + long idelta; + + /* Parse the relunits */ + if(cdParseRelunits(timetype, relunits, &unit, &base_comptime)) + return; + + if (timetype == cdMixed){ + switch(unit){ + case cdWeek: case cdDay: case cdHour: case cdMinute: case cdSecond: + cdRel2CompMixed(reltime, unit, base_comptime, comptime); + return; + case cdYear: case cdSeason: case cdMonth: + timetype = cdStandard; + break; + case cdFraction: + cdError("invalid unit in conversion"); + break; + default: break; + } + } + + baseunits =cdBadUnit; + switch(unit){ + case cdSecond: + delta = reltime/3600.0; + baseunits = cdHour; + break; + case cdMinute: + delta = reltime/60.0; + baseunits = cdHour; + break; + case cdHour: + delta = reltime; + baseunits = cdHour; + break; + case cdDay: + delta = 24.0 * reltime; + baseunits = cdHour; + break; + case cdWeek: + delta = 168.0 * reltime; + baseunits = cdHour; + break; + case cdMonth: + idelta = (long)(reltime + (reltime<0 ? -1.e-10 : 1.e-10)); + baseunits = cdMonth; + break; + case cdSeason: + idelta = (long)(3.0 * reltime + (reltime<0 ? -1.e-10 : 1.e-10)); + baseunits = cdMonth; + break; + case cdYear: + idelta = (long)(12 * reltime + (reltime<0 ? -1.e-10 : 1.e-10)); + baseunits = cdMonth; + break; + default: + cdError("invalid unit in conversion"); + break; + } + + deltime.count = 1; + deltime.units = (CdTimeUnit)baseunits; + + humantime.year = base_comptime.year; + humantime.month = base_comptime.month; + humantime.day = base_comptime.day; + humantime.hour = base_comptime.hour; + humantime.baseYear = 1970; + /* Map to old-style timetype */ + if(cdToOldTimetype(timetype,&old_timetype)) + return; + humantime.timeType = old_timetype; + + Cdh2e(&humantime,&base_etm); + /* If months, seasons, or years, */ + if(baseunits == cdMonth){ + + /* Calculate new epochal time from integer months. */ + /* Convert back to human, then comptime. */ + /* For zero reltime, just return the basetime*/ + if(reltime != 0.0){ + CdAddDelTime(base_etm,idelta,deltime,old_timetype,1970,&result_etm); + Cde2h(result_etm, old_timetype, 1970, &humantime); + } + } + /* Calculate new epochal time. */ + /* Convert back to human, then comptime. */ + else if(baseunits == cdHour){ + Cde2h(base_etm+delta, old_timetype, 1970, &humantime); + + } + comptime->year = humantime.year; + comptime->month = humantime.month; + comptime->day = humantime.day; + comptime->hour = humantime.hour; + + return; +} + +/* rkr: output as ISO 8601 strings */ +static void +cdComp2Iso(cdCalenType timetype, int separator, cdCompTime comptime, char* time) +{ + double dtmp, sec; + int ihr, imin, isec; + int nskip; + + if(cdValidateTime(timetype,comptime)) + return; + + ihr = (int)comptime.hour; + dtmp = 60.0 * (comptime.hour - (double)ihr); + imin = (int)dtmp; + sec = 60.0 * (dtmp - (double)imin); + isec = sec; + + if(sec == isec) + if(isec == 0) + if(imin == 0) + if(ihr == 0) + nskip = 4; + else + nskip = 3; + else + nskip = 2; + else + nskip = 1; + else + nskip = 0; + + if(timetype & cdStandardCal){ + switch (nskip) { + case 0: /* sec != 0 && (int)sec != sec */ + sprintf(time,"%4.4ld-%2.2hd-%2.2hd%c%2.2d:%2.2d:%lf", + comptime.year,comptime.month,comptime.day,separator,ihr,imin,sec); + break; + case 1: + sprintf(time,"%4.4ld-%2.2hd-%2.2hd%c%2.2d:%2.2d:%2.2d", + comptime.year,comptime.month,comptime.day,separator,ihr,imin,isec); + break; + case 2: + sprintf(time,"%4.4ld-%2.2hd-%2.2hd%c%2.2d:%2.2d", + comptime.year,comptime.month,comptime.day,separator,ihr,imin); + break; + case 3: + sprintf(time,"%4.4ld-%2.2hd-%2.2hd%c%2.2d", + comptime.year,comptime.month,comptime.day,separator,ihr); + break; + case 4: + sprintf(time,"%4.4ld-%2.2hd-%2.2hd", + comptime.year,comptime.month,comptime.day); + break; + } + } + else { /* Climatological */ + switch (nskip) { + case 0: /* sec != 0 && (int)sec != sec */ + sprintf(time,"%2.2hd-%2.2hd%c%2.2d:%2.2d:%lf", + comptime.month,comptime.day,separator,ihr,imin,sec); + break; + case 1: + sprintf(time,"%2.2hd-%2.2hd%c%2.2d:%2.2d:%2.2d", + comptime.month,comptime.day,separator,ihr,imin,isec); + break; + case 2: + sprintf(time,"%2.2hd-%2.2hd%c%2.2d:%2.2d", + comptime.month,comptime.day,separator,ihr,imin); + break; + case 3: + sprintf(time,"%2.2hd-%2.2hd%c%2.2d", + comptime.month,comptime.day,separator,ihr); + break; + case 4: + sprintf(time,"%2.2hd-%2.2hd", + comptime.month,comptime.day); + break; + } + } + return; +} + +/* rkr: added for output closer to ISO 8601 */ +void +cdRel2Iso(cdCalenType timetype, char* relunits, int separator, double reltime, char* chartime) +{ + cdCompTime comptime; + + cdRel2Comp(timetype, relunits, reltime, &comptime); + cdComp2Iso(timetype, separator, comptime, chartime); + + return; +} diff --git a/extern/src_netcdf4/nctime.h b/extern/src_netcdf4/nctime.h new file mode 100644 index 0000000..ee5c275 --- /dev/null +++ b/extern/src_netcdf4/nctime.h @@ -0,0 +1,159 @@ +/********************************************************************* + * Copyright 2008, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Id: nctime.h,v 1.6 2010/03/18 19:24:26 russ Exp $ + *********************************************************************/ + +struct bounds_node{ + int ncid; /* group (or file) in which variable with associated + * bounds variable resides */ + int varid; /* has "bounds" attribute naming its bounds variable */ + char *bounds_name; /* the named variable, which stores bounds for varid */ + struct bounds_node *next; /* next node on list or NULL ifn last list node */ +}; + +typedef struct bounds_node bounds_node_t; + +/* + * This code was extracted with permission from the CDMS time + * conversion and arithmetic routines developed by Bob Drach, Lawrence + * Livermore National Laboratory as part of the cdtime library. + * Changes and additions were made to support the "-t" option of the + * netCDF ncdump utility. + * + * For the complete time conversion and climate calendar facilities of + * the CDMS library, get the original sources from LLNL. + */ + +#define CD_MAX_RELUNITS 64 /* Max characters in relative units */ +#define CD_MAX_CHARTIME 48 /* Max characters in character time */ +#define CD_NULL_DAY 1 /* Null day value */ +#define CD_NULL_HOUR 0.0 /* Null hour value */ +#define CD_NULL_ID 0 /* Reserved ID */ +#define CD_NULL_MONTH 1 /* Null month value */ +#define CD_NULL_YEAR 0 /* Null year value, component time */ + +typedef enum CdTimeUnit { + CdBadTimeUnit = 0, + CdMinute = 1, + CdHour = 2, + CdDay = 3, + CdWeek = 4, /* Always = 7 days */ + CdMonth = 5, + CdSeason = 6, /* Always = 3 months */ + CdYear = 7, + CdSecond = 8 +} CdTimeUnit; + +typedef enum cdUnit { + cdBadUnit = CdBadTimeUnit, + cdMinute = CdMinute, + cdHour = CdHour, + cdDay = CdDay, + cdWeek = CdWeek, /* Always = 7 days */ + cdMonth = CdMonth, + cdSeason = CdSeason, /* Always = 3 months */ + cdYear = CdYear, + cdSecond = CdSecond, + cdFraction /* Fractional part of absolute time */ +} cdUnitTime; + +#define CdChronCal 0x1 +#define CdClimCal 0x0 +#define CdBaseRel 0x00 +#define CdBase1970 0x10 +#define CdHasLeap 0x100 +#define CdNoLeap 0x000 +#define Cd366 0x2000 +#define Cd365 0x1000 +#define Cd360 0x0000 +#define CdJulianType 0x10000 + +typedef enum CdTimeType { + CdChron = ( CdChronCal | CdBase1970 | CdHasLeap | Cd365), /* 4369 */ + CdJulianCal = ( CdChronCal | CdBase1970 | CdHasLeap | Cd365 | CdJulianType), + CdChronNoLeap = ( CdChronCal | CdBase1970 | CdNoLeap | Cd365), /* 4113 */ + CdChron360 = ( CdChronCal | CdBase1970 | CdNoLeap | Cd360), /* 17 */ + CdRel = ( CdChronCal | CdBaseRel | CdHasLeap | Cd365), /* 4353 */ + CdRelNoLeap = ( CdChronCal | CdBaseRel | CdNoLeap | Cd365), /* 4097 */ + CdClim = ( CdClimCal | CdBaseRel | CdNoLeap | Cd365), /* 4096 */ + CdClimLeap = ( CdClimCal | CdBaseRel | CdHasLeap | Cd365), + CdClim360 = ( CdClimCal | CdBaseRel | CdNoLeap | Cd365), + CdChron366 = ( CdChronCal | CdBase1970 | CdNoLeap | Cd366) +} CdTimeType; + +typedef struct { + long year; /* e.g., 1979 */ + short month; /* e.g., CdDec */ + short day; /* e.g., 30 */ + double hour; /* hour and fractional hour */ + long baseYear; /* base year for relative, 1970 for CdChron */ + CdTimeType timeType; /* e.g., CdChron */ +} CdTime; + +#define cdStandardCal 0x11 +#define cdClimCal 0x0 +#define cdHasLeap 0x100 +#define cdHasNoLeap 0x000 +#define cd366Days 0x2000 +#define cd365Days 0x1000 +#define cd360Days 0x0000 +#define cdJulianCal 0x10000 +#define cdMixedCal 0x20000 + +typedef enum cdCalenType { + cdStandard = ( cdStandardCal | cdHasLeap | cd365Days), + cdJulian = ( cdStandardCal | cdHasLeap | cd365Days | cdJulianCal), + cdNoLeap = ( cdStandardCal | cdHasNoLeap | cd365Days), + cd360 = ( cdStandardCal | cdHasNoLeap | cd360Days), + cd366 = ( cdStandardCal | cdHasNoLeap | cd366Days), + cdClim = ( cdClimCal | cdHasNoLeap | cd365Days), + cdClimLeap = ( cdClimCal | cdHasLeap | cd365Days), + cdClim360 = ( cdClimCal | cdHasNoLeap | cd360Days), + cdMixed = ( cdStandardCal | cdHasLeap | cd365Days | cdMixedCal) +} cdCalenType; + +/* Component time */ +typedef struct { + long year; /* Year */ + short month; /* Numerical month (1..12) */ + short day; /* Day of month (1..31) */ + double hour; /* Hour and fractional hours */ +} cdCompTime; + +typedef struct { + long count; /* units count */ + CdTimeUnit units; /* time interval units */ +} CdDeltaTime; + +typedef struct timeinfo_t { + cdCalenType calendar; + cdUnitTime unit; + char *units; + cdCompTime origin; +} timeinfo_t; + + + +#if defined(DLL_NETCDF) /* Defined when library is a DLL */ +# if defined(DLL_EXPORT) /* define when building the library. */ +# define MSC_NCTIME_EXTRA __declspec(dllexport) +# else +# define MSC_NCTIME_EXTRA __declspec(dllimport) +# endif + +MSC_NCTIME_EXTRA extern void cdRel2Iso(cdCalenType timetype, char* relunits, int separator, double reltime, char* chartime); +MSC_NCTIME_EXTRA extern void cdChar2Comp(cdCalenType timetype, char* chartime, cdCompTime* comptime); +MSC_NCTIME_EXTRA extern void Cdh2e(CdTime *htime, double *etime); +MSC_NCTIME_EXTRA extern void Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime); +MSC_NCTIME_EXTRA extern int cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTime* base_comptime); +#else +extern void cdRel2Iso(cdCalenType timetype, char* relunits, int separator, double reltime, char* chartime); +extern void cdChar2Comp(cdCalenType timetype, char* chartime, cdCompTime* comptime); +extern void Cdh2e(CdTime *htime, double *etime); +extern void Cde2h(double etime, CdTimeType timeType, long baseYear, CdTime *htime); +extern int cdParseRelunits(cdCalenType timetype, char* relunits, cdUnitTime* unit, cdCompTime* base_comptime); +#endif /* DLL Considerations. */ + + + diff --git a/extern/src_netcdf4/ncx.c b/extern/src_netcdf4/ncx.c new file mode 100644 index 0000000..896ec40 --- /dev/null +++ b/extern/src_netcdf4/ncx.c @@ -0,0 +1,8385 @@ +/* Do not edit this file. It is produced from the corresponding .m4 source */ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * + * This file contains some routines derived from code + * which is copyrighted by Sun Microsystems, Inc. + * The "#ifdef vax" versions of + * ncx_put_float_float() + * ncx_get_float_float() + * ncx_put_double_double() + * ncx_get_double_double() + * ncx_putn_float_float() + * ncx_getn_float_float() + * ncx_putn_double_double() + * ncx_getn_double_double() + * are derived from xdr_float() and xdr_double() routines + * in the freely available, copyrighted Sun RPCSRC 3.9 + * distribution, xdr_float.c. + * Our "value added" is that these are always memory to memory, + * they handle IEEE subnormals properly, and their "n" versions + * operate speedily on arrays. + */ +/* $Id: ncx.m4,v 2.58 2010/05/26 18:11:08 dmh Exp $ */ + +/* + * An external data representation interface. + */ + +#include "ncx.h" +#include "nc3dispatch.h" +#include +#include + +/* alias poorly named limits.h macros */ +#define SHORT_MAX SHRT_MAX +#define SHORT_MIN SHRT_MIN +#define USHORT_MAX USHRT_MAX +#ifndef LLONG_MAX +# define LLONG_MAX 9223372036854775807LL +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX 18446744073709551615ULL +#endif +#define LONG_LONG_MAX LLONG_MAX +#define LONG_LONG_MIN LLONG_MIN +#define ULONG_LONG_MAX ULLONG_MAX +#include +#ifndef FLT_MAX /* This POSIX macro missing on some systems */ +# ifndef NO_IEEE_FLOAT +# define FLT_MAX 3.40282347e+38f +# else +# error "You will need to define FLT_MAX" +# endif +#endif +/* alias poorly named float.h macros */ +#define FLOAT_MAX FLT_MAX +#define FLOAT_MIN (-FLT_MAX) +#define DOUBLE_MAX DBL_MAX +#define DOUBLE_MIN (-DBL_MAX) +#define FLOAT_MAX_EXP FLT_MAX_EXP +#define DOUBLE_MAX_EXP DBL_MAX_EXP +#include +#define UCHAR_MIN 0 +#define Min(a,b) ((a) < (b) ? (a) : (b)) +#define Max(a,b) ((a) > (b) ? (a) : (b)) + +/* + * If the machine's float domain is "smaller" than the external one + * use the machine domain + */ +#if defined(FLT_MAX_EXP) && FLT_MAX_EXP < 128 /* 128 is X_FLT_MAX_EXP */ +#undef X_FLOAT_MAX +# define X_FLOAT_MAX FLT_MAX +#undef X_FLOAT_MIN +# define X_FLOAT_MIN (-X_FLOAT_MAX) +#endif + +#if _SX /* NEC SUPER UX */ +#define LOOPCNT 256 /* must be no longer than hardware vector length */ +#if _INT64 +#undef INT_MAX /* workaround cpp bug */ +#define INT_MAX X_INT_MAX +#undef INT_MIN /* workaround cpp bug */ +#define INT_MIN X_INT_MIN +#undef LONG_MAX /* workaround cpp bug */ +#define LONG_MAX X_INT_MAX +#undef LONG_MIN /* workaround cpp bug */ +#define LONG_MIN X_INT_MIN +#elif _LONG64 +#undef LONG_MAX /* workaround cpp bug */ +#define LONG_MAX 4294967295L +#undef LONG_MIN /* workaround cpp bug */ +#define LONG_MIN -4294967295L +#endif +#if !_FLOAT0 +#error "FLOAT1 and FLOAT2 not supported" +#endif +#endif /* _SX */ + +static const char nada[X_ALIGN] = {0, 0, 0, 0}; + +#ifndef WORDS_BIGENDIAN +/* LITTLE_ENDIAN: DEC and intel */ +/* + * Routines to convert to BIGENDIAN. + * Optimize the swapn?b() and swap?b() routines aggressivly. + */ + +#define SWAP2(a) ( (((a) & 0xff) << 8) | \ + (((a) >> 8) & 0xff) ) + +#define SWAP4(a) ( ((a) << 24) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) >> 24) & 0x000000ff) ) + + +static void +swapn2b(void *dst, const void *src, size_t nn) +{ + char *op = dst; + const char *ip = src; + +/* unroll the following to reduce loop overhead + * + * while(nn-- != 0) + * { + * *op++ = *(++ip); + * *op++ = *(ip++ -1); + * } + */ + while(nn > 3) + { + *op++ = *(++ip); + *op++ = *(ip++ -1); + *op++ = *(++ip); + *op++ = *(ip++ -1); + *op++ = *(++ip); + *op++ = *(ip++ -1); + *op++ = *(++ip); + *op++ = *(ip++ -1); + nn -= 4; + } + while(nn-- != 0) + { + *op++ = *(++ip); + *op++ = *(ip++ -1); + } +} + +# ifndef vax +static void +swap4b(void *dst, const void *src) +{ + char *op = dst; + const char *ip = src; + op[0] = ip[3]; + op[1] = ip[2]; + op[2] = ip[1]; + op[3] = ip[0]; +} +# endif /* !vax */ + +static void +swapn4b(void *dst, const void *src, size_t nn) +{ + char *op = dst; + const char *ip = src; + +/* unroll the following to reduce loop overhead + * while(nn-- != 0) + * { + * op[0] = ip[3]; + * op[1] = ip[2]; + * op[2] = ip[1]; + * op[3] = ip[0]; + * op += 4; + * ip += 4; + * } + */ + while(nn > 3) + { + op[0] = ip[3]; + op[1] = ip[2]; + op[2] = ip[1]; + op[3] = ip[0]; + op[4] = ip[7]; + op[5] = ip[6]; + op[6] = ip[5]; + op[7] = ip[4]; + op[8] = ip[11]; + op[9] = ip[10]; + op[10] = ip[9]; + op[11] = ip[8]; + op[12] = ip[15]; + op[13] = ip[14]; + op[14] = ip[13]; + op[15] = ip[12]; + op += 16; + ip += 16; + nn -= 4; + } + while(nn-- != 0) + { + op[0] = ip[3]; + op[1] = ip[2]; + op[2] = ip[1]; + op[3] = ip[0]; + op += 4; + ip += 4; + } +} + +# ifndef vax +static void +swap8b(void *dst, const void *src) +{ + char *op = dst; + const char *ip = src; +# ifndef FLOAT_WORDS_BIGENDIAN + op[0] = ip[7]; + op[1] = ip[6]; + op[2] = ip[5]; + op[3] = ip[4]; + op[4] = ip[3]; + op[5] = ip[2]; + op[6] = ip[1]; + op[7] = ip[0]; +# else + op[0] = ip[3]; + op[1] = ip[2]; + op[2] = ip[1]; + op[3] = ip[0]; + op[4] = ip[7]; + op[5] = ip[6]; + op[6] = ip[5]; + op[7] = ip[4]; +# endif +} +# endif /* !vax */ + +# ifndef vax +static void +swapn8b(void *dst, const void *src, size_t nn) +{ + char *op = dst; + const char *ip = src; + +/* unroll the following to reduce loop overhead + * while(nn-- != 0) + * { + * op[0] = ip[7]; + * op[1] = ip[6]; + * op[2] = ip[5]; + * op[3] = ip[4]; + * op[4] = ip[3]; + * op[5] = ip[2]; + * op[6] = ip[1]; + * op[7] = ip[0]; + * op += 8; + * ip += 8; + * } + */ +# ifndef FLOAT_WORDS_BIGENDIAN + while(nn > 1) + { + op[0] = ip[7]; + op[1] = ip[6]; + op[2] = ip[5]; + op[3] = ip[4]; + op[4] = ip[3]; + op[5] = ip[2]; + op[6] = ip[1]; + op[7] = ip[0]; + op[8] = ip[15]; + op[9] = ip[14]; + op[10] = ip[13]; + op[11] = ip[12]; + op[12] = ip[11]; + op[13] = ip[10]; + op[14] = ip[9]; + op[15] = ip[8]; + op += 16; + ip += 16; + nn -= 2; + } + while(nn-- != 0) + { + op[0] = ip[7]; + op[1] = ip[6]; + op[2] = ip[5]; + op[3] = ip[4]; + op[4] = ip[3]; + op[5] = ip[2]; + op[6] = ip[1]; + op[7] = ip[0]; + op += 8; + ip += 8; + } +# else + while(nn-- != 0) + { + op[0] = ip[3]; + op[1] = ip[2]; + op[2] = ip[1]; + op[3] = ip[0]; + op[4] = ip[7]; + op[5] = ip[6]; + op[6] = ip[5]; + op[7] = ip[4]; + op += 8; + ip += 8; + } +# endif +} +# endif /* !vax */ + +#endif /* LITTLE_ENDIAN */ + + +/* + * Primitive numeric conversion functions. + */ + +/* x_schar */ + +/* We don't implement any x_schar primitives. */ + + +/* x_short */ + +#if SHORT_MAX == X_SHORT_MAX +typedef short ix_short; +#define SIZEOF_IX_SHORT SIZEOF_SHORT +#define IX_SHORT_MAX SHORT_MAX +#elif INT_MAX >= X_SHORT_MAX +typedef int ix_short; +#define SIZEOF_IX_SHORT SIZEOF_INT +#define IX_SHORT_MAX INT_MAX +#elif LONG_MAX >= X_SHORT_MAX +typedef long ix_short; +#define SIZEOF_IX_SHORT SIZEOF_LONG +#define IX_SHORT_MAX LONG_MAX +#elif LLONG_MAX >= X_SHORT_MAX +typedef long long ix_short; +#define SIZEOF_IX_SHORT SIZEOF_LONG_LONG +#define IX_SHORT_MAX LLONG_MAX +#else +#error "ix_short implementation" +#endif + +static void +get_ix_short(const void *xp, ix_short *ip) +{ + const uchar *cp = (const uchar *) xp; + *ip = *cp++ << 8; +#if SIZEOF_IX_SHORT > X_SIZEOF_SHORT + if(*ip & 0x8000) + { + /* extern is negative */ + *ip |= (~(0xffff)); /* N.B. Assumes "twos complement" */ + } +#endif + *ip |= *cp; +} + +static void +put_ix_short(void *xp, const ix_short *ip) +{ + uchar *cp = (uchar *) xp; + *cp++ = (*ip) >> 8; + *cp = (*ip) & 0xff; +} + + +int +ncx_get_short_schar(const void *xp, schar *ip) +{ + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; + if(xx > SCHAR_MAX || xx < SCHAR_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_short_uchar(const void *xp, uchar *ip) +{ + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; + if(xx > UCHAR_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_short_short(const void *xp, short *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_SHORT && IX_SHORT_MAX == SHORT_MAX + get_ix_short(xp, (ix_short *)ip); + return ENOERR; +#else + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; +# if IX_SHORT_MAX > SHORT_MAX + if(xx > SHORT_MAX || xx < SHORT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_get_short_int(const void *xp, int *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_INT && IX_SHORT_MAX == INT_MAX + get_ix_short(xp, (ix_short *)ip); + return ENOERR; +#else + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; +# if IX_SHORT_MAX > INT_MAX + if(xx > INT_MAX || xx < INT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_get_short_uint(const void *xp, unsigned int *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_INT && IX_SHORT_MAX == INT_MAX + get_ix_short(xp, (ix_short *)ip); + return ENOERR; +#else + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; +# if IX_SHORT_MAX > INT_MAX + if(xx > UINT_MAX || xx < 0) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_get_short_longlong(const void *xp, long long *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_LONG_LONG && IX_SHORT_MAX == LONG_LONG_MAX + get_ix_short(xp, (ix_short *)ip); + return ENOERR; +#else + /* assert(LONG_LONG_MAX >= X_SHORT_MAX); */ + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; + return ENOERR; +#endif +} + +int +ncx_get_short_ulonglong(const void *xp, unsigned long long *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_LONG && IX_SHORT_MAX == LONG_MAX + get_ix_short(xp, (ix_short *)ip); + return ENOERR; +#else + /* assert(LONG_LONG_MAX >= X_SHORT_MAX); */ + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; + if(xx < 0) + return NC_ERANGE; + return ENOERR; +#endif +} + +int +ncx_get_short_float(const void *xp, float *ip) +{ + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; +#if 0 /* TODO: determine when necessary */ + if(xx > FLT_MAX || xx < (-FLT_MAX)) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_get_short_double(const void *xp, double *ip) +{ + /* assert(DBL_MAX >= X_SHORT_MAX); */ + ix_short xx; + get_ix_short(xp, &xx); + *ip = xx; + return ENOERR; +} + +int +ncx_put_short_schar(void *xp, const schar *ip) +{ + uchar *cp = (uchar *) xp; + if(*ip & 0x80) + *cp++ = 0xff; + else + *cp++ = 0; + *cp = (uchar)*ip; + return ENOERR; +} + +int +ncx_put_short_uchar(void *xp, const uchar *ip) +{ + uchar *cp = (uchar *) xp; + *cp++ = 0; + *cp = *ip; + return ENOERR; +} + +int +ncx_put_short_short(void *xp, const short *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_SHORT && X_SHORT_MAX == SHORT_MAX + put_ix_short(xp, (const ix_short *)ip); + return ENOERR; +#else + ix_short xx = (ix_short)*ip; + put_ix_short(xp, &xx); +# if X_SHORT_MAX < SHORT_MAX + if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_short_int(void *xp, const int *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_INT && X_SHORT_MAX == INT_MAX + put_ix_short(xp, (const ix_short *)ip); + return ENOERR; +#else + ix_short xx = (ix_short)*ip; + put_ix_short(xp, &xx); +# if X_SHORT_MAX < INT_MAX + if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_short_uint(void *xp, const unsigned int *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_INT && X_SHORT_MAX == INT_MAX + put_ix_short(xp, (const ix_short *)ip); + return ENOERR; +#else + ix_short xx = (ix_short)*ip; + put_ix_short(xp, &xx); +# if X_SHORT_MAX < INT_MAX + if(*ip > X_SHORT_MAX) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_short_longlong(void *xp, const long long *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_LONG_LONG && X_SHORT_MAX == LONG_LONG_MAX + put_ix_short(xp, (const ix_short *)ip); + return ENOERR; +#else + ix_short xx = (ix_short)*ip; + put_ix_short(xp, &xx); +# if X_SHORT_MAX < LONG_LONG_MAX + if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_short_ulonglong(void *xp, const unsigned long long *ip) +{ +#if SIZEOF_IX_SHORT == SIZEOF_LONG_LONG && X_SHORT_MAX == LONG_LONG_MAX + put_ix_short(xp, (const ix_short *)ip); + return ENOERR; +#else + ix_short xx = (ix_short)*ip; + put_ix_short(xp, &xx); +# if X_SHORT_MAX < LONG_LONG_MAX + if(*ip > X_SHORT_MAX) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_short_float(void *xp, const float *ip) +{ + ix_short xx = *ip; + put_ix_short(xp, &xx); + if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_put_short_double(void *xp, const double *ip) +{ + ix_short xx = *ip; + put_ix_short(xp, &xx); + if(*ip > X_SHORT_MAX || *ip < X_SHORT_MIN) + return NC_ERANGE; + return ENOERR; +} + +/* x_int */ + +#if SHORT_MAX == X_INT_MAX +typedef short ix_int; +#define SIZEOF_IX_INT SIZEOF_SHORT +#define IX_INT_MAX SHORT_MAX +#elif INT_MAX >= X_INT_MAX +typedef int ix_int; +#define SIZEOF_IX_INT SIZEOF_INT +#define IX_INT_MAX INT_MAX +#elif LONG_MAX >= X_INT_MAX +typedef long ix_int; +#define SIZEOF_IX_INT SIZEOF_LONG +#define IX_INT_MAX LONG_MAX +#else +#error "ix_int implementation" +#endif + + +static void +get_ix_int(const void *xp, ix_int *ip) +{ + const uchar *cp = (const uchar *) xp; + + *ip = *cp++ << 24; +#if SIZEOF_IX_INT > X_SIZEOF_INT + if(*ip & 0x80000000) + { + /* extern is negative */ + *ip |= (~(0xffffffff)); /* N.B. Assumes "twos complement" */ + } +#endif + *ip |= (*cp++ << 16); + *ip |= (*cp++ << 8); + *ip |= *cp; +} + +static void +put_ix_int(void *xp, const ix_int *ip) +{ + uchar *cp = (uchar *) xp; + + *cp++ = (*ip) >> 24; + *cp++ = ((*ip) & 0x00ff0000) >> 16; + *cp++ = ((*ip) & 0x0000ff00) >> 8; + *cp = ((*ip) & 0x000000ff); +} + + +int +ncx_get_int_schar(const void *xp, schar *ip) +{ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; + if(xx > SCHAR_MAX || xx < SCHAR_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_int_uchar(const void *xp, uchar *ip) +{ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; + if(xx > UCHAR_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_int_short(const void *xp, short *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_SHORT && IX_INT_MAX == SHORT_MAX + get_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; +# if IX_INT_MAX > SHORT_MAX + if(xx > SHORT_MAX || xx < SHORT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_get_int_int(const void *xp, int *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX + get_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; +# if IX_INT_MAX > INT_MAX + if(xx > INT_MAX || xx < INT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_get_int_uint(const void *xp, unsigned int *ip) +{ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; + if(xx > UINT_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_int_longlong(const void *xp, long long *ip) +{ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; + return ENOERR; +} + +int +ncx_get_int_ulonglong(const void *xp, unsigned long long *ip) +{ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; + if(xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_int_float(const void *xp, float *ip) +{ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; +#if 0 /* TODO: determine when necessary */ + if(xx > FLT_MAX || xx < (-FLT_MAX)) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_get_int_double(const void *xp, double *ip) +{ + /* assert((DBL_MAX >= X_INT_MAX); */ + ix_int xx; + get_ix_int(xp, &xx); + *ip = xx; + return ENOERR; +} + +int +ncx_put_int_schar(void *xp, const schar *ip) +{ + uchar *cp = (uchar *) xp; + if(*ip & 0x80) + { + *cp++ = 0xff; + *cp++ = 0xff; + *cp++ = 0xff; + } + else + { + *cp++ = 0x00; + *cp++ = 0x00; + *cp++ = 0x00; + } + *cp = (uchar)*ip; + return ENOERR; +} + +int +ncx_put_int_uchar(void *xp, const uchar *ip) +{ + uchar *cp = (uchar *) xp; + *cp++ = 0x00; + *cp++ = 0x00; + *cp++ = 0x00; + *cp = *ip; + return ENOERR; +} + +int +ncx_put_int_short(void *xp, const short *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_SHORT && IX_INT_MAX == SHORT_MAX + put_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); +# if IX_INT_MAX < SHORT_MAX + if(*ip > X_INT_MAX || *ip < X_INT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_int_int(void *xp, const int *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX + put_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); +# if IX_INT_MAX < INT_MAX + if(*ip > X_INT_MAX || *ip < X_INT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_int_uint(void *xp, const unsigned int *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_INT && IX_INT_MAX == INT_MAX + put_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); + if(*ip > X_UINT_MAX) + return NC_ERANGE; + return ENOERR; +#endif +} + +int +ncx_put_int_longlong(void *xp, const longlong *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_LONG && IX_INT_MAX == LONG_MAX + put_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); +# if IX_INT_MAX < LONG_LONG_MAX + if(*ip > X_INT_MAX || *ip < X_INT_MIN) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_int_ulonglong(void *xp, const unsigned long long *ip) +{ +#if SIZEOF_IX_INT == SIZEOF_LONG && IX_INT_MAX == LONG_MAX + put_ix_int(xp, (ix_int *)ip); + return ENOERR; +#else + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); +# if IX_INT_MAX < LONG_MAX + if(*ip > X_INT_MAX) + return NC_ERANGE; +# endif + return ENOERR; +#endif +} + +int +ncx_put_int_float(void *xp, const float *ip) +{ + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); + if(*ip > (double)X_INT_MAX || *ip < (double)X_INT_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_put_int_double(void *xp, const double *ip) +{ + ix_int xx = (ix_int)(*ip); + put_ix_int(xp, &xx); + if(*ip > X_INT_MAX || *ip < X_INT_MIN) + return NC_ERANGE; + return ENOERR; +} + + +/* x_float */ + +#if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT) + +static void +get_ix_float(const void *xp, float *ip) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(ip, xp, sizeof(float)); +#else + swap4b(ip, xp); +#endif +} + +static void +put_ix_float(void *xp, const float *ip) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(xp, ip, X_SIZEOF_FLOAT); +#else + swap4b(xp, ip); +#endif +} + +#elif vax + +/* What IEEE single precision floating point looks like on a Vax */ +struct ieee_single { + unsigned int exp_hi : 7; + unsigned int sign : 1; + unsigned int mant_hi : 7; + unsigned int exp_lo : 1; + unsigned int mant_lo_hi : 8; + unsigned int mant_lo_lo : 8; +}; + +/* Vax single precision floating point */ +struct vax_single { + unsigned int mantissa1 : 7; + unsigned int exp : 8; + unsigned int sign : 1; + unsigned int mantissa2 : 16; +}; + +#define VAX_SNG_BIAS 0x81 +#define IEEE_SNG_BIAS 0x7f + +static struct sgl_limits { + struct vax_single s; + struct ieee_single ieee; +} max = { + { 0x7f, 0xff, 0x0, 0xffff }, /* Max Vax */ + { 0x7f, 0x0, 0x0, 0x1, 0x0, 0x0 } /* Max IEEE */ +}; +static struct sgl_limits min = { + { 0x0, 0x0, 0x0, 0x0 }, /* Min Vax */ + { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } /* Min IEEE */ +}; + +static void +get_ix_float(const void *xp, float *ip) +{ + struct vax_single *const vsp = (struct vax_single *) ip; + const struct ieee_single *const isp = + (const struct ieee_single *) xp; + unsigned exp = isp->exp_hi << 1 | isp->exp_lo; + + switch(exp) { + case 0 : + /* ieee subnormal */ + if(isp->mant_hi == min.ieee.mant_hi + && isp->mant_lo_hi == min.ieee.mant_lo_hi + && isp->mant_lo_lo == min.ieee.mant_lo_lo) + { + *vsp = min.s; + } + else + { + unsigned mantissa = (isp->mant_hi << 16) + | isp->mant_lo_hi << 8 + | isp->mant_lo_lo; + unsigned tmp = mantissa >> 20; + if(tmp >= 4) { + vsp->exp = 2; + } else if (tmp >= 2) { + vsp->exp = 1; + } else { + *vsp = min.s; + break; + } /* else */ + tmp = mantissa - (1 << (20 + vsp->exp )); + tmp <<= 3 - vsp->exp; + vsp->mantissa2 = tmp; + vsp->mantissa1 = (tmp >> 16); + } + break; + case 0xfe : + case 0xff : + *vsp = max.s; + break; + default : + vsp->exp = exp - IEEE_SNG_BIAS + VAX_SNG_BIAS; + vsp->mantissa2 = isp->mant_lo_hi << 8 | isp->mant_lo_lo; + vsp->mantissa1 = isp->mant_hi; + } + + vsp->sign = isp->sign; + +} + + +static void +put_ix_float(void *xp, const float *ip) +{ + const struct vax_single *const vsp = + (const struct vax_single *)ip; + struct ieee_single *const isp = (struct ieee_single *) xp; + + switch(vsp->exp){ + case 0 : + /* all vax float with zero exponent map to zero */ + *isp = min.ieee; + break; + case 2 : + case 1 : + { + /* These will map to subnormals */ + unsigned mantissa = (vsp->mantissa1 << 16) + | vsp->mantissa2; + mantissa >>= 3 - vsp->exp; + mantissa += (1 << (20 + vsp->exp)); + isp->mant_lo_lo = mantissa; + isp->mant_lo_hi = mantissa >> 8; + isp->mant_hi = mantissa >> 16; + isp->exp_lo = 0; + isp->exp_hi = 0; + } + break; + case 0xff : /* max.s.exp */ + if( vsp->mantissa2 == max.s.mantissa2 + && vsp->mantissa1 == max.s.mantissa1) + { + /* map largest vax float to ieee infinity */ + *isp = max.ieee; + break; + } /* else, fall thru */ + default : + { + unsigned exp = vsp->exp - VAX_SNG_BIAS + IEEE_SNG_BIAS; + isp->exp_hi = exp >> 1; + isp->exp_lo = exp; + isp->mant_lo_lo = vsp->mantissa2; + isp->mant_lo_hi = vsp->mantissa2 >> 8; + isp->mant_hi = vsp->mantissa1; + } + } + + isp->sign = vsp->sign; + +} + + /* vax */ +#elif defined(_CRAY) && !defined(__crayx1) + +/* + * Return the number of bytes until the next "word" boundary + * N.B. This is based on the very wierd YMP address structure, + * which puts the address within a word in the leftmost 3 bits + * of the address. + */ +static size_t +word_align(const void *vp) +{ + const size_t rem = ((size_t)vp >> (64 - 3)) & 0x7; + return (rem != 0); +} + +struct ieee_single_hi { + unsigned int sign : 1; + unsigned int exp : 8; + unsigned int mant :23; + unsigned int pad :32; +}; +typedef struct ieee_single_hi ieee_single_hi; + +struct ieee_single_lo { + unsigned int pad :32; + unsigned int sign : 1; + unsigned int exp : 8; + unsigned int mant :23; +}; +typedef struct ieee_single_lo ieee_single_lo; + +static const int ieee_single_bias = 0x7f; + +struct ieee_double { + unsigned int sign : 1; + unsigned int exp :11; + unsigned int mant :52; +}; +typedef struct ieee_double ieee_double; + +static const int ieee_double_bias = 0x3ff; + +#if defined(NO_IEEE_FLOAT) + +struct cray_single { + unsigned int sign : 1; + unsigned int exp :15; + unsigned int mant :48; +}; +typedef struct cray_single cray_single; + +static const int cs_ieis_bias = 0x4000 - 0x7f; + +static const int cs_id_bias = 0x4000 - 0x3ff; + + +static void +get_ix_float(const void *xp, float *ip) +{ + + if(word_align(xp) == 0) + { + const ieee_single_hi *isp = (const ieee_single_hi *) xp; + cray_single *csp = (cray_single *) ip; + + if(isp->exp == 0) + { + /* ieee subnormal */ + *ip = (double)isp->mant; + if(isp->mant != 0) + { + csp->exp -= (ieee_single_bias + 22); + } + } + else + { + csp->exp = isp->exp + cs_ieis_bias + 1; + csp->mant = isp->mant << (48 - 1 - 23); + csp->mant |= (1 << (48 - 1)); + } + csp->sign = isp->sign; + + + } + else + { + const ieee_single_lo *isp = (const ieee_single_lo *) xp; + cray_single *csp = (cray_single *) ip; + + if(isp->exp == 0) + { + /* ieee subnormal */ + *ip = (double)isp->mant; + if(isp->mant != 0) + { + csp->exp -= (ieee_single_bias + 22); + } + } + else + { + csp->exp = isp->exp + cs_ieis_bias + 1; + csp->mant = isp->mant << (48 - 1 - 23); + csp->mant |= (1 << (48 - 1)); + } + csp->sign = isp->sign; + + + } +} + +static void +put_ix_float(void *xp, const float *ip) +{ + if(word_align(xp) == 0) + { + ieee_single_hi *isp = (ieee_single_hi*)xp; + const cray_single *csp = (const cray_single *) ip; + int ieee_exp = csp->exp - cs_ieis_bias -1; + + isp->sign = csp->sign; + + if(ieee_exp >= 0xff) + { + /* NC_ERANGE => ieee Inf */ + isp->exp = 0xff; + isp->mant = 0x0; + } + else if(ieee_exp > 0) + { + /* normal ieee representation */ + isp->exp = ieee_exp; + /* assumes cray rep is in normal form */ + assert(csp->mant & 0x800000000000); + isp->mant = (((csp->mant << 1) & + 0xffffffffffff) >> (48 - 23)); + } + else if(ieee_exp > -23) + { + /* ieee subnormal, right shift */ + const int rshift = (48 - 23 - ieee_exp); + + isp->mant = csp->mant >> rshift; + +#if 0 + if(csp->mant & (1 << (rshift -1))) + { + /* round up */ + isp->mant++; + } +#endif + + isp->exp = 0; + } + else + { + /* smaller than ieee can represent */ + isp->exp = 0; + isp->mant = 0; + } + + } + else + { + ieee_single_lo *isp = (ieee_single_lo*)xp; + const cray_single *csp = (const cray_single *) ip; + int ieee_exp = csp->exp - cs_ieis_bias -1; + + isp->sign = csp->sign; + + if(ieee_exp >= 0xff) + { + /* NC_ERANGE => ieee Inf */ + isp->exp = 0xff; + isp->mant = 0x0; + } + else if(ieee_exp > 0) + { + /* normal ieee representation */ + isp->exp = ieee_exp; + /* assumes cray rep is in normal form */ + assert(csp->mant & 0x800000000000); + isp->mant = (((csp->mant << 1) & + 0xffffffffffff) >> (48 - 23)); + } + else if(ieee_exp > -23) + { + /* ieee subnormal, right shift */ + const int rshift = (48 - 23 - ieee_exp); + + isp->mant = csp->mant >> rshift; + +#if 0 + if(csp->mant & (1 << (rshift -1))) + { + /* round up */ + isp->mant++; + } +#endif + + isp->exp = 0; + } + else + { + /* smaller than ieee can represent */ + isp->exp = 0; + isp->mant = 0; + } + + } +} + +#else + /* IEEE Cray with only doubles */ +static void +get_ix_float(const void *xp, float *ip) +{ + + ieee_double *idp = (ieee_double *) ip; + + if(word_align(xp) == 0) + { + const ieee_single_hi *isp = (const ieee_single_hi *) xp; + if(isp->exp == 0 && isp->mant == 0) + { + idp->exp = 0; + idp->mant = 0; + } + else + { + idp->exp = isp->exp + (ieee_double_bias - ieee_single_bias); + idp->mant = isp->mant << (52 - 23); + } + idp->sign = isp->sign; + } + else + { + const ieee_single_lo *isp = (const ieee_single_lo *) xp; + if(isp->exp == 0 && isp->mant == 0) + { + idp->exp = 0; + idp->mant = 0; + } + else + { + idp->exp = isp->exp + (ieee_double_bias - ieee_single_bias); + idp->mant = isp->mant << (52 - 23); + } + idp->sign = isp->sign; + } +} + +static void +put_ix_float(void *xp, const float *ip) +{ + const ieee_double *idp = (const ieee_double *) ip; + if(word_align(xp) == 0) + { + ieee_single_hi *isp = (ieee_single_hi*)xp; + if(idp->exp > (ieee_double_bias - ieee_single_bias)) + isp->exp = idp->exp - (ieee_double_bias - ieee_single_bias); + else + isp->exp = 0; + isp->mant = idp->mant >> (52 - 23); + isp->sign = idp->sign; + } + else + { + ieee_single_lo *isp = (ieee_single_lo*)xp; + if(idp->exp > (ieee_double_bias - ieee_single_bias)) + isp->exp = idp->exp - (ieee_double_bias - ieee_single_bias); + else + isp->exp = 0; + isp->mant = idp->mant >> (52 - 23); + isp->sign = idp->sign; + } +} +#endif + +#else +#error "ix_float implementation" +#endif + + +int +ncx_get_float_schar(const void *xp, schar *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (schar) xx; + if(xx > SCHAR_MAX || xx < SCHAR_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_uchar(const void *xp, uchar *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (uchar) xx; + if(xx > UCHAR_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_short(const void *xp, short *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (short) xx; + if(xx > SHORT_MAX || xx < SHORT_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_int(const void *xp, int *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (int) xx; + if(xx > (double)INT_MAX || xx < (double)INT_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_uint(const void *xp, unsigned int *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (unsigned int) xx; + if(xx > (double)UINT_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_longlong(const void *xp, longlong *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (longlong) xx; + if(xx > (double)LONG_LONG_MAX || xx < (double)LONG_LONG_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_ulonglong(const void *xp, unsigned long long *ip) +{ + float xx; + get_ix_float(xp, &xx); + *ip = (longlong) xx; + if(xx > (double)ULONG_LONG_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_float_float(const void *xp, float *ip) +{ + /* TODO */ + get_ix_float(xp, ip); + return ENOERR; +} + +int +ncx_get_float_double(const void *xp, double *ip) +{ + /* TODO */ + float xx; + get_ix_float(xp, &xx); + *ip = xx; + return ENOERR; +} + + +int +ncx_put_float_schar(void *xp, const schar *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); + return ENOERR; +} + +int +ncx_put_float_uchar(void *xp, const uchar *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); + return ENOERR; +} + +int +ncx_put_float_short(void *xp, const short *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); +#if 0 /* TODO: figure this out */ + if((float)(*ip) > X_FLOAT_MAX || (float)(*ip) < X_FLOAT_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_float_int(void *xp, const int *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); +#if 1 /* TODO: figure this out */ + if((float)(*ip) > X_FLOAT_MAX || (float)(*ip) < X_FLOAT_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_float_uint(void *xp, const unsigned int *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); +#if 1 /* TODO: figure this out */ + if((float)(*ip) > X_FLOAT_MAX) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_float_longlong(void *xp, const longlong *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); +#if 1 /* TODO: figure this out */ + if((float)(*ip) > X_FLOAT_MAX || (float)(*ip) < X_FLOAT_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_float_ulonglong(void *xp, const unsigned long long *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); +#if 1 /* TODO: figure this out */ + if((float)(*ip) > X_FLOAT_MAX) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_float_float(void *xp, const float *ip) +{ + put_ix_float(xp, ip); +#ifdef NO_IEEE_FLOAT + if(*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_float_double(void *xp, const double *ip) +{ + float xx = (float) *ip; + put_ix_float(xp, &xx); + if(*ip > X_FLOAT_MAX || *ip < X_FLOAT_MIN) + return NC_ERANGE; + return ENOERR; +} + +/* x_double */ + +#if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE && !defined(NO_IEEE_FLOAT) + +static void +get_ix_double(const void *xp, double *ip) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(ip, xp, sizeof(double)); +#else + swap8b(ip, xp); +#endif +} + +static void +put_ix_double(void *xp, const double *ip) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(xp, ip, X_SIZEOF_DOUBLE); +#else + swap8b(xp, ip); +#endif +} + +#elif vax + +/* What IEEE double precision floating point looks like on a Vax */ +struct ieee_double { + unsigned int exp_hi : 7; + unsigned int sign : 1; + unsigned int mant_6 : 4; + unsigned int exp_lo : 4; + unsigned int mant_5 : 8; + unsigned int mant_4 : 8; + + unsigned int mant_lo : 32; +}; + +/* Vax double precision floating point */ +struct vax_double { + unsigned int mantissa1 : 7; + unsigned int exp : 8; + unsigned int sign : 1; + unsigned int mantissa2 : 16; + unsigned int mantissa3 : 16; + unsigned int mantissa4 : 16; +}; + +#define VAX_DBL_BIAS 0x81 +#define IEEE_DBL_BIAS 0x3ff +#define MASK(nbits) ((1 << nbits) - 1) + +static const struct dbl_limits { + struct vax_double d; + struct ieee_double ieee; +} dbl_limits[2] = { + {{ 0x7f, 0xff, 0x0, 0xffff, 0xffff, 0xffff }, /* Max Vax */ + { 0x7f, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0}}, /* Max IEEE */ + {{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* Min Vax */ + { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}, /* Min IEEE */ +}; + + +static void +get_ix_double(const void *xp, double *ip) +{ + struct vax_double *const vdp = + (struct vax_double *)ip; + const struct ieee_double *const idp = + (const struct ieee_double *) xp; + { + const struct dbl_limits *lim; + int ii; + for (ii = 0, lim = dbl_limits; + ii < sizeof(dbl_limits)/sizeof(struct dbl_limits); + ii++, lim++) + { + if ((idp->mant_lo == lim->ieee.mant_lo) + && (idp->mant_4 == lim->ieee.mant_4) + && (idp->mant_5 == lim->ieee.mant_5) + && (idp->mant_6 == lim->ieee.mant_6) + && (idp->exp_lo == lim->ieee.exp_lo) + && (idp->exp_hi == lim->ieee.exp_hi) + ) + { + *vdp = lim->d; + goto doneit; + } + } + } + { + unsigned exp = idp->exp_hi << 4 | idp->exp_lo; + vdp->exp = exp - IEEE_DBL_BIAS + VAX_DBL_BIAS; + } + { + unsigned mant_hi = ((idp->mant_6 << 16) + | (idp->mant_5 << 8) + | idp->mant_4); + unsigned mant_lo = SWAP4(idp->mant_lo); + vdp->mantissa1 = (mant_hi >> 13); + vdp->mantissa2 = ((mant_hi & MASK(13)) << 3) + | (mant_lo >> 29); + vdp->mantissa3 = (mant_lo >> 13); + vdp->mantissa4 = (mant_lo << 3); + } + doneit: + vdp->sign = idp->sign; + +} + + +static void +put_ix_double(void *xp, const double *ip) +{ + const struct vax_double *const vdp = + (const struct vax_double *)ip; + struct ieee_double *const idp = + (struct ieee_double *) xp; + + if ((vdp->mantissa4 > (dbl_limits[0].d.mantissa4 - 3)) && + (vdp->mantissa3 == dbl_limits[0].d.mantissa3) && + (vdp->mantissa2 == dbl_limits[0].d.mantissa2) && + (vdp->mantissa1 == dbl_limits[0].d.mantissa1) && + (vdp->exp == dbl_limits[0].d.exp)) + { + *idp = dbl_limits[0].ieee; + goto shipit; + } + if ((vdp->mantissa4 == dbl_limits[1].d.mantissa4) && + (vdp->mantissa3 == dbl_limits[1].d.mantissa3) && + (vdp->mantissa2 == dbl_limits[1].d.mantissa2) && + (vdp->mantissa1 == dbl_limits[1].d.mantissa1) && + (vdp->exp == dbl_limits[1].d.exp)) + { + *idp = dbl_limits[1].ieee; + goto shipit; + } + + { + unsigned exp = vdp->exp - VAX_DBL_BIAS + IEEE_DBL_BIAS; + + unsigned mant_lo = ((vdp->mantissa2 & MASK(3)) << 29) | + (vdp->mantissa3 << 13) | + ((vdp->mantissa4 >> 3) & MASK(13)); + + unsigned mant_hi = (vdp->mantissa1 << 13) + | (vdp->mantissa2 >> 3); + + if((vdp->mantissa4 & 7) > 4) + { + /* round up */ + mant_lo++; + if(mant_lo == 0) + { + mant_hi++; + if(mant_hi > 0xffffff) + { + mant_hi = 0; + exp++; + } + } + } + + idp->mant_lo = SWAP4(mant_lo); + idp->mant_6 = mant_hi >> 16; + idp->mant_5 = (mant_hi & 0xff00) >> 8; + idp->mant_4 = mant_hi; + idp->exp_hi = exp >> 4; + idp->exp_lo = exp; + } + + shipit: + idp->sign = vdp->sign; + +} + + /* vax */ +#elif defined(_CRAY) && !defined(__crayx1) + +static void +get_ix_double(const void *xp, double *ip) +{ + const ieee_double *idp = (const ieee_double *) xp; + cray_single *csp = (cray_single *) ip; + + if(idp->exp == 0) + { + /* ieee subnormal */ + *ip = (double)idp->mant; + if(idp->mant != 0) + { + csp->exp -= (ieee_double_bias + 51); + } + } + else + { + csp->exp = idp->exp + cs_id_bias + 1; + csp->mant = idp->mant >> (52 - 48 + 1); + csp->mant |= (1 << (48 - 1)); + } + csp->sign = idp->sign; +} + +static void +put_ix_double(void *xp, const double *ip) +{ + ieee_double *idp = (ieee_double *) xp; + const cray_single *csp = (const cray_single *) ip; + + int ieee_exp = csp->exp - cs_id_bias -1; + + idp->sign = csp->sign; + + if(ieee_exp >= 0x7ff) + { + /* NC_ERANGE => ieee Inf */ + idp->exp = 0x7ff; + idp->mant = 0x0; + } + else if(ieee_exp > 0) + { + /* normal ieee representation */ + idp->exp = ieee_exp; + /* assumes cray rep is in normal form */ + assert(csp->mant & 0x800000000000); + idp->mant = (((csp->mant << 1) & + 0xffffffffffff) << (52 - 48)); + } + else if(ieee_exp >= (-(52 -48))) + { + /* ieee subnormal, left shift */ + const int lshift = (52 - 48) + ieee_exp; + idp->mant = csp->mant << lshift; + idp->exp = 0; + } + else if(ieee_exp >= -52) + { + /* ieee subnormal, right shift */ + const int rshift = (- (52 - 48) - ieee_exp); + + idp->mant = csp->mant >> rshift; + +#if 0 + if(csp->mant & (1 << (rshift -1))) + { + /* round up */ + idp->mant++; + } +#endif + + idp->exp = 0; + } + else + { + /* smaller than ieee can represent */ + idp->exp = 0; + idp->mant = 0; + } +} +#else +#error "ix_double implementation" +#endif + +int +ncx_get_double_schar(const void *xp, schar *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (schar) xx; + if(xx > SCHAR_MAX || xx < SCHAR_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_uchar(const void *xp, uchar *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (uchar) xx; + if(xx > UCHAR_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_short(const void *xp, short *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (short) xx; + if(xx > SHORT_MAX || xx < SHORT_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_int(const void *xp, int *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (int) xx; + if(xx > INT_MAX || xx < INT_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_uint(const void *xp, unsigned int *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (unsigned int) xx; + if(xx > UINT_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_longlong(const void *xp, longlong *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (longlong) xx; + if(xx > LONG_LONG_MAX || xx < LONG_LONG_MIN) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_ulonglong(const void *xp, unsigned long long *ip) +{ + double xx; + get_ix_double(xp, &xx); + *ip = (unsigned longlong) xx; + if(xx > ULONG_LONG_MAX || xx < 0) + return NC_ERANGE; + return ENOERR; +} + +int +ncx_get_double_float(const void *xp, float *ip) +{ + double xx; + get_ix_double(xp, &xx); + if(xx > FLT_MAX) + { + *ip = FLT_MAX; + return NC_ERANGE; + } + if(xx < (-FLT_MAX)) + { + *ip = (-FLT_MAX); + return NC_ERANGE; + } + *ip = (float) xx; + return ENOERR; +} + +int +ncx_get_double_double(const void *xp, double *ip) +{ + /* TODO */ + get_ix_double(xp, ip); + return ENOERR; +} + + +int +ncx_put_double_schar(void *xp, const schar *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); + return ENOERR; +} + +int +ncx_put_double_uchar(void *xp, const uchar *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); + return ENOERR; +} + +int +ncx_put_double_short(void *xp, const short *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); +#if 0 /* TODO: figure this out */ + if((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_double_int(void *xp, const int *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); +#if 0 /* TODO: figure this out */ + if((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_double_uint(void *xp, const unsigned int *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); +#if 0 /* TODO: figure this out */ + if((double)(*ip) > X_DOUBLE_MAX) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_double_longlong(void *xp, const longlong *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); +#if 1 /* TODO: figure this out */ + if((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_double_ulonglong(void *xp, const unsigned long long *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); +#if 1 /* TODO: figure this out */ + if((double)(*ip) > X_DOUBLE_MAX) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_double_float(void *xp, const float *ip) +{ + double xx = (double) *ip; + put_ix_double(xp, &xx); +#if 1 /* TODO: figure this out */ + if((double)(*ip) > X_DOUBLE_MAX || (double)(*ip) < X_DOUBLE_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + +int +ncx_put_double_double(void *xp, const double *ip) +{ + put_ix_double(xp, ip); +#ifdef NO_IEEE_FLOAT + if(*ip > X_DOUBLE_MAX || *ip < X_DOUBLE_MIN) + return NC_ERANGE; +#endif + return ENOERR; +} + + +/* x_size_t */ + +#if SIZEOF_SIZE_T < X_SIZEOF_SIZE_T +#error "x_size_t implementation" +/* netcdf requires size_t which can hold a values from 0 to 2^32 -1 */ +#endif + +int +ncx_put_size_t(void **xpp, const size_t *ulp) +{ + /* similar to put_ix_int() */ + uchar *cp = (uchar *) *xpp; + assert(*ulp <= X_SIZE_MAX); + + *cp++ = (uchar)((*ulp) >> 24); + *cp++ = (uchar)(((*ulp) & 0x00ff0000) >> 16); + *cp++ = (uchar)(((*ulp) & 0x0000ff00) >> 8); + *cp = (uchar)((*ulp) & 0x000000ff); + + *xpp = (void *)((char *)(*xpp) + X_SIZEOF_SIZE_T); + return ENOERR; +} + +int +ncx_get_size_t(const void **xpp, size_t *ulp) +{ + /* similar to get_ix_int */ + const uchar *cp = (const uchar *) *xpp; + + *ulp = (unsigned)(*cp++ << 24); + *ulp |= (*cp++ << 16); + *ulp |= (*cp++ << 8); + *ulp |= *cp; + + *xpp = (const void *)((const char *)(*xpp) + X_SIZEOF_SIZE_T); + return ENOERR; +} + +/* x_off_t */ + +int +ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t) +{ + /* similar to put_ix_int() */ + uchar *cp = (uchar *) *xpp; + /* No negative offsets stored in netcdf */ + if (*lp < 0) { + /* Assume this is an overflow of a 32-bit int... */ + return ERANGE; + } + + assert(sizeof_off_t == 4 || sizeof_off_t == 8); + + if (sizeof_off_t == 4) { + *cp++ = (uchar) ((*lp) >> 24); + *cp++ = (uchar)(((*lp) & 0x00ff0000) >> 16); + *cp++ = (uchar)(((*lp) & 0x0000ff00) >> 8); + *cp = (uchar)( (*lp) & 0x000000ff); + } else { +#if SIZEOF_OFF_T == 4 +/* Write a 64-bit offset on a system with only a 32-bit offset */ + *cp++ = (uchar)0; + *cp++ = (uchar)0; + *cp++ = (uchar)0; + *cp++ = (uchar)0; + + *cp++ = (uchar)(((*lp) & 0xff000000) >> 24); + *cp++ = (uchar)(((*lp) & 0x00ff0000) >> 16); + *cp++ = (uchar)(((*lp) & 0x0000ff00) >> 8); + *cp = (uchar)( (*lp) & 0x000000ff); +#else + *cp++ = (uchar) ((*lp) >> 56); + *cp++ = (uchar)(((*lp) & 0x00ff000000000000ULL) >> 48); + *cp++ = (uchar)(((*lp) & 0x0000ff0000000000ULL) >> 40); + *cp++ = (uchar)(((*lp) & 0x000000ff00000000ULL) >> 32); + *cp++ = (uchar)(((*lp) & 0x00000000ff000000ULL) >> 24); + *cp++ = (uchar)(((*lp) & 0x0000000000ff0000ULL) >> 16); + *cp++ = (uchar)(((*lp) & 0x000000000000ff00ULL) >> 8); + *cp = (uchar)( (*lp) & 0x00000000000000ffULL); +#endif + } + *xpp = (void *)((char *)(*xpp) + sizeof_off_t); + return ENOERR; +} + +int +ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t) +{ + /* similar to get_ix_int() */ + const uchar *cp = (const uchar *) *xpp; + assert(sizeof_off_t == 4 || sizeof_off_t == 8); + + if (sizeof_off_t == 4) { + *lp = *cp++ << 24; + *lp |= (*cp++ << 16); + *lp |= (*cp++ << 8); + *lp |= *cp; + } else { +#if SIZEOF_OFF_T == 4 +/* Read a 64-bit offset on a system with only a 32-bit offset */ +/* If the offset overflows, set an error code and return */ + *lp = ((off_t)(*cp++) << 24); + *lp |= ((off_t)(*cp++) << 16); + *lp |= ((off_t)(*cp++) << 8); + *lp |= ((off_t)(*cp++)); +/* + * lp now contains the upper 32-bits of the 64-bit offset. if lp is + * not zero, then the dataset is larger than can be represented + * on this system. Set an error code and return. + */ + if (*lp != 0) { + return ERANGE; + } + + *lp = ((off_t)(*cp++) << 24); + *lp |= ((off_t)(*cp++) << 16); + *lp |= ((off_t)(*cp++) << 8); + *lp |= (off_t)*cp; + + if (*lp < 0) { + /* + * If this fails, then the offset is >2^31, but less + * than 2^32 which is not allowed, but is not caught + * by the previous check + */ + return ERANGE; + } +#else + *lp = ((off_t)(*cp++) << 56); + *lp |= ((off_t)(*cp++) << 48); + *lp |= ((off_t)(*cp++) << 40); + *lp |= ((off_t)(*cp++) << 32); + *lp |= ((off_t)(*cp++) << 24); + *lp |= ((off_t)(*cp++) << 16); + *lp |= ((off_t)(*cp++) << 8); + *lp |= (off_t)*cp; +#endif + } + *xpp = (const void *)((const char *)(*xpp) + sizeof_off_t); + return ENOERR; +} + + +/* + * Aggregate numeric conversion functions. + */ + + + +/* schar */ + +int +ncx_getn_schar_schar(const void **xpp, size_t nelems, schar *tp) +{ + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + return ENOERR; + +} +int +ncx_getn_schar_uchar(const void **xpp, size_t nelems, uchar *tp) +{ + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + return ENOERR; + +} +int +ncx_getn_schar_short(const void **xpp, size_t nelems, short *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + +int +ncx_getn_schar_int(const void **xpp, size_t nelems, int *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + +int +ncx_getn_schar_float(const void **xpp, size_t nelems, float *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + +int +ncx_getn_schar_double(const void **xpp, size_t nelems, double *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + +int +ncx_getn_schar_uint(const void **xpp, size_t nelems, uint *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + +int +ncx_getn_schar_longlong(const void **xpp, size_t nelems, longlong *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + +int +ncx_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ + schar *xp = (schar *)(*xpp); + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (const void *)xp; + return ENOERR; +} + + +int +ncx_pad_getn_schar_schar(const void **xpp, size_t nelems, schar *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems + rndup); + + return ENOERR; + +} +int +ncx_pad_getn_schar_uchar(const void **xpp, size_t nelems, uchar *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems + rndup); + + return ENOERR; + +} +int +ncx_pad_getn_schar_short(const void **xpp, size_t nelems, short *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + +int +ncx_pad_getn_schar_int(const void **xpp, size_t nelems, int *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + +int +ncx_pad_getn_schar_float(const void **xpp, size_t nelems, float *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + +int +ncx_pad_getn_schar_double(const void **xpp, size_t nelems, double *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + +int +ncx_pad_getn_schar_uint(const void **xpp, size_t nelems, uint *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + +int +ncx_pad_getn_schar_longlong(const void **xpp, size_t nelems, longlong *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + +int +ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + *tp++ = *xp++; + } + + *xpp = (void *)(xp + rndup); + return ENOERR; +} + + +int +ncx_putn_schar_schar(void **xpp, size_t nelems, const schar *tp) +{ + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + return ENOERR; + +} +int +ncx_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp) +{ + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + return ENOERR; + +} +int +ncx_putn_schar_short(void **xpp, size_t nelems, const short *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_putn_schar_int(void **xpp, size_t nelems, const int *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_putn_schar_float(void **xpp, size_t nelems, const float *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_putn_schar_double(void **xpp, size_t nelems, const double *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_putn_schar_uint(void **xpp, size_t nelems, const uint *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_putn_schar_longlong(void **xpp, size_t nelems, const longlong *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ + int status = ENOERR; + schar *xp = (schar *) *xpp; + + while(nelems-- != 0) + { + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + *xpp = (void *)xp; + return status; +} + + +int +ncx_pad_putn_schar_schar(void **xpp, size_t nelems, const schar *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + if(rndup) + { + (void) memcpy(*xpp, nada, rndup); + *xpp = (void *)((char *)(*xpp) + rndup); + } + + return ENOERR; + +} +int +ncx_pad_putn_schar_uchar(void **xpp, size_t nelems, const uchar *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + if(rndup) + { + (void) memcpy(*xpp, nada, rndup); + *xpp = (void *)((char *)(*xpp) + rndup); + } + + return ENOERR; + +} +int +ncx_pad_putn_schar_short(void **xpp, size_t nelems, const short *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_schar_int(void **xpp, size_t nelems, const int *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_schar_float(void **xpp, size_t nelems, const float *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_schar_uint(void **xpp, size_t nelems, const uint *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_schar_longlong(void **xpp, size_t nelems, const longlong *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ + int status = ENOERR; + size_t rndup = nelems % X_ALIGN; + schar *xp = (schar *) *xpp; + + if(rndup) + rndup = X_ALIGN - rndup; + + while(nelems-- != 0) + { + /* N.B. schar as signed */ + if(*tp > X_SCHAR_MAX || *tp < X_SCHAR_MIN) + status = NC_ERANGE; + *xp++ = (schar) *tp++; + } + + + if(rndup) + { + (void) memcpy(xp, nada, rndup); + xp += rndup; + } + + *xpp = (void *)xp; + return status; +} + + + +/* short */ + +int +ncx_getn_short_schar(const void **xpp, size_t nelems, schar *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_short_uchar(const void **xpp, size_t nelems, uchar *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +#if X_SIZEOF_SHORT == SIZEOF_SHORT +/* optimized version */ +int +ncx_getn_short_short(const void **xpp, size_t nelems, short *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(tp, *xpp, nelems * sizeof(short)); +# else + swapn2b(tp, *xpp, nelems); +# endif + *xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_SHORT); + return ENOERR; +} +#else +int +ncx_getn_short_short(const void **xpp, size_t nelems, short *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SHORT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +#endif +int +ncx_getn_short_int(const void **xpp, size_t nelems, int *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j INT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_short_float(const void **xpp, size_t nelems, float *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j FLOAT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_short_double(const void **xpp, size_t nelems, double *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j DOUBLE_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_short_uint(const void **xpp, size_t nelems, uint *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UINT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_short_longlong(const void **xpp, size_t nelems, longlong *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j LONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j ULONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (short *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + + +int +ncx_pad_getn_short_schar(const void **xpp, size_t nelems, schar *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_uchar(const void **xpp, size_t nelems, uchar *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_short(const void **xpp, size_t nelems, short *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_int(const void **xpp, size_t nelems, int *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_float(const void **xpp, size_t nelems, float *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_double(const void **xpp, size_t nelems, double *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_uint(const void **xpp, size_t nelems, uint *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_longlong(const void **xpp, size_t nelems, longlong *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ + const size_t rndup = nelems % 2; + + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + const int lstatus = ncx_get_short_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + xp += X_SIZEOF_SHORT; + + *xpp = (void *)xp; + return status; +} + + +int +ncx_putn_short_schar(void **xpp, size_t nelems, const schar *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_short_uchar(void **xpp, size_t nelems, const uchar *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +#if X_SIZEOF_SHORT == SIZEOF_SHORT +/* optimized version */ +int +ncx_putn_short_short(void **xpp, size_t nelems, const short *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(*xpp, tp, nelems * X_SIZEOF_SHORT); +# else + swapn2b(*xpp, tp, nelems); +# endif + *xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_SHORT); + return ENOERR; +} +#else +int +ncx_putn_short_short(void **xpp, size_t nelems, const short *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +#endif +int +ncx_putn_short_int(void **xpp, size_t nelems, const int *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_short_float(void **xpp, size_t nelems, const float *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_short_double(void **xpp, size_t nelems, const double *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_short_uint(void **xpp, size_t nelems, const uint *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_short_longlong(void **xpp, size_t nelems, const longlong *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_SHORT == SIZEOF_SHORT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + short tmp[LOOPCNT]; /* in case input is misaligned */ + short *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_SHORT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_SHORT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_SHORT); + xp = (short *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + + +int +ncx_pad_putn_short_schar(void **xpp, size_t nelems, const schar *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_uchar(void **xpp, size_t nelems, const uchar *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_short(void **xpp, size_t nelems, const short *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_int(void **xpp, size_t nelems, const int *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_float(void **xpp, size_t nelems, const float *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_uint(void **xpp, size_t nelems, const uint *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_longlong(void **xpp, size_t nelems, const longlong *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + +int +ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ + const size_t rndup = nelems % 2; + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_SHORT, tp++) + { + int lstatus = ncx_put_short_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + if(rndup != 0) + { + (void) memcpy(xp, nada, X_SIZEOF_SHORT); + xp += X_SIZEOF_SHORT; + } + + *xpp = (void *)xp; + return status; +} + + + +/* int */ + +int +ncx_getn_int_schar(const void **xpp, size_t nelems, schar *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_int_uchar(const void **xpp, size_t nelems, uchar *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_int_short(const void **xpp, size_t nelems, short *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SHORT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +#if X_SIZEOF_INT == SIZEOF_INT +/* optimized version */ +int +ncx_getn_int_int(const void **xpp, size_t nelems, int *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(tp, *xpp, nelems * sizeof(int)); +# else + swapn4b(tp, *xpp, nelems); +# endif + *xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_INT); + return ENOERR; +} +int +ncx_getn_int_uint(const void **xpp, size_t nelems, unsigned int *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(tp, *xpp, nelems * sizeof(int)); +# else + swapn4b(tp, *xpp, nelems); +# endif + *xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_INT); + return ENOERR; +} +#else +int +ncx_getn_int_int(const void **xpp, size_t nelems, int *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j INT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_int_uint(const void **xpp, size_t nelems, uint *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UINT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +#endif + +int +ncx_getn_int_longlong(const void **xpp, size_t nelems, longlong *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j LONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j ULONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + + +int +ncx_getn_int_float(const void **xpp, size_t nelems, float *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j FLOAT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_int_double(const void **xpp, size_t nelems, double *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j DOUBLE_MAX; + } + /* update xpp and tp */ + if (realign) xp = (int *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + const int lstatus = ncx_get_int_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + + +int +ncx_putn_int_schar(void **xpp, size_t nelems, const schar *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_int_uchar(void **xpp, size_t nelems, const uchar *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_int_short(void **xpp, size_t nelems, const short *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +#if X_SIZEOF_INT == SIZEOF_INT +/* optimized version */ +int +ncx_putn_int_int(void **xpp, size_t nelems, const int *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(*xpp, tp, nelems * X_SIZEOF_INT); +# else + swapn4b(*xpp, tp, nelems); +# endif + *xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_INT); + return ENOERR; +} +int +ncx_putn_int_uint(void **xpp, size_t nelems, const unsigned int *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(*xpp, tp, nelems * X_SIZEOF_INT); +# else + swapn4b(*xpp, tp, nelems); +# endif + *xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_INT); + return ENOERR; +} +#else +int +ncx_putn_int_int(void **xpp, size_t nelems, const int *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_int_uint(void **xpp, size_t nelems, const uint *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +#endif + +int +ncx_putn_int_longlong(void **xpp, size_t nelems, const longlong *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_int_float(void **xpp, size_t nelems, const float *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + double d; /* special case for ncx_putn_int_float */ + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_int_double(void **xpp, size_t nelems, const double *tp) +{ +#if _SX && \ + X_SIZEOF_INT == SIZEOF_INT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + int tmp[LOOPCNT]; /* in case input is misaligned */ + int *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_INT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_INT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_INT); + xp = (int *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_INT, tp++) + { + int lstatus = ncx_put_int_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + + + +/* float */ + +int +ncx_getn_float_schar(const void **xpp, size_t nelems, schar *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_float_uchar(const void **xpp, size_t nelems, uchar *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_float_short(const void **xpp, size_t nelems, short *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SHORT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_float_int(const void **xpp, size_t nelems, int *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j INT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +#if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT) +/* optimized version */ +int +ncx_getn_float_float(const void **xpp, size_t nelems, float *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(tp, *xpp, nelems * sizeof(float)); +# else + swapn4b(tp, *xpp, nelems); +# endif + *xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_FLOAT); + return ENOERR; +} +#elif vax +int +ncx_getn_float_float(const void **xpp, size_t nfloats, float *ip) +{ + float *const end = ip + nfloats; + + while(ip < end) + { + struct vax_single *const vsp = (struct vax_single *) ip; + const struct ieee_single *const isp = + (const struct ieee_single *) (*xpp); + unsigned exp = isp->exp_hi << 1 | isp->exp_lo; + + switch(exp) { + case 0 : + /* ieee subnormal */ + if(isp->mant_hi == min.ieee.mant_hi + && isp->mant_lo_hi == min.ieee.mant_lo_hi + && isp->mant_lo_lo == min.ieee.mant_lo_lo) + { + *vsp = min.s; + } + else + { + unsigned mantissa = (isp->mant_hi << 16) + | isp->mant_lo_hi << 8 + | isp->mant_lo_lo; + unsigned tmp = mantissa >> 20; + if(tmp >= 4) { + vsp->exp = 2; + } else if (tmp >= 2) { + vsp->exp = 1; + } else { + *vsp = min.s; + break; + } /* else */ + tmp = mantissa - (1 << (20 + vsp->exp )); + tmp <<= 3 - vsp->exp; + vsp->mantissa2 = tmp; + vsp->mantissa1 = (tmp >> 16); + } + break; + case 0xfe : + case 0xff : + *vsp = max.s; + break; + default : + vsp->exp = exp - IEEE_SNG_BIAS + VAX_SNG_BIAS; + vsp->mantissa2 = isp->mant_lo_hi << 8 | isp->mant_lo_lo; + vsp->mantissa1 = isp->mant_hi; + } + + vsp->sign = isp->sign; + + + ip++; + *xpp = (char *)(*xpp) + X_SIZEOF_FLOAT; + } + return ENOERR; +} +#else +int +ncx_getn_float_float(const void **xpp, size_t nelems, float *tp) +{ + const char *xp = *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +} + +#endif +int +ncx_getn_float_double(const void **xpp, size_t nelems, double *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j DOUBLE_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_float_uint(const void **xpp, size_t nelems, uint *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UINT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_float_longlong(const void **xpp, size_t nelems, longlong *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j LONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_float_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j ULONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (float *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + const int lstatus = ncx_get_float_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + + +int +ncx_putn_float_schar(void **xpp, size_t nelems, const schar *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_float_uchar(void **xpp, size_t nelems, const uchar *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_float_short(void **xpp, size_t nelems, const short *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_float_int(void **xpp, size_t nelems, const int *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +#if X_SIZEOF_FLOAT == SIZEOF_FLOAT && !defined(NO_IEEE_FLOAT) +/* optimized version */ +int +ncx_putn_float_float(void **xpp, size_t nelems, const float *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(*xpp, tp, nelems * X_SIZEOF_FLOAT); +# else + swapn4b(*xpp, tp, nelems); +# endif + *xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_FLOAT); + return ENOERR; +} +#elif vax +int +ncx_putn_float_float(void **xpp, size_t nfloats, const float *ip) +{ + const float *const end = ip + nfloats; + + while(ip < end) + { + const struct vax_single *const vsp = + (const struct vax_single *)ip; + struct ieee_single *const isp = (struct ieee_single *) (*xpp); + + switch(vsp->exp){ + case 0 : + /* all vax float with zero exponent map to zero */ + *isp = min.ieee; + break; + case 2 : + case 1 : + { + /* These will map to subnormals */ + unsigned mantissa = (vsp->mantissa1 << 16) + | vsp->mantissa2; + mantissa >>= 3 - vsp->exp; + mantissa += (1 << (20 + vsp->exp)); + isp->mant_lo_lo = mantissa; + isp->mant_lo_hi = mantissa >> 8; + isp->mant_hi = mantissa >> 16; + isp->exp_lo = 0; + isp->exp_hi = 0; + } + break; + case 0xff : /* max.s.exp */ + if( vsp->mantissa2 == max.s.mantissa2 + && vsp->mantissa1 == max.s.mantissa1) + { + /* map largest vax float to ieee infinity */ + *isp = max.ieee; + break; + } /* else, fall thru */ + default : + { + unsigned exp = vsp->exp - VAX_SNG_BIAS + IEEE_SNG_BIAS; + isp->exp_hi = exp >> 1; + isp->exp_lo = exp; + isp->mant_lo_lo = vsp->mantissa2; + isp->mant_lo_hi = vsp->mantissa2 >> 8; + isp->mant_hi = vsp->mantissa1; + } + } + + isp->sign = vsp->sign; + + + ip++; + *xpp = (char *)(*xpp) + X_SIZEOF_FLOAT; + } + return ENOERR; +} +#else +int +ncx_putn_float_float(void **xpp, size_t nelems, const float *tp) +{ + char *xp = *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +} + +#endif +int +ncx_putn_float_double(void **xpp, size_t nelems, const double *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_float_uint(void **xpp, size_t nelems, const uint *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_float_longlong(void **xpp, size_t nelems, const longlong *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_FLOAT == SIZEOF_FLOAT + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + float tmp[LOOPCNT]; /* in case input is misaligned */ + float *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_FLOAT; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_FLOAT_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_FLOAT); + xp = (float *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_FLOAT, tp++) + { + int lstatus = ncx_put_float_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + + +/* double */ + +int +ncx_getn_double_schar(const void **xpp, size_t nelems, schar *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_uchar(const void **xpp, size_t nelems, uchar *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UCHAR_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_short(const void **xpp, size_t nelems, short *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j SHORT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_int(const void **xpp, size_t nelems, int *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j INT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_float(const void **xpp, size_t nelems, float *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j FLOAT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_uint(const void **xpp, size_t nelems, uint *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j UINT_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_longlong(const void **xpp, size_t nelems, longlong *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j LONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +int +ncx_getn_double_ulonglong(const void **xpp, size_t nelems, ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of input data + * - copy (conversion happens automatically) input data + * to output + * - update xpp to point at next unconverted input, and tp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j ULONGLONG_MAX; + } + /* update xpp and tp */ + if (realign) xp = (double *) *xpp; + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + const char *xp = (const char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +# endif +} + +#if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE && !defined(NO_IEEE_FLOAT) +/* optimized version */ +int +ncx_getn_double_double(const void **xpp, size_t nelems, double *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(tp, *xpp, nelems * sizeof(double)); +# else + swapn8b(tp, *xpp, nelems); +# endif + *xpp = (const void *)((const char *)(*xpp) + nelems * X_SIZEOF_DOUBLE); + return ENOERR; +} +#elif vax +int +ncx_getn_double_double(const void **xpp, size_t ndoubles, double *ip) +{ + double *const end = ip + ndoubles; + + while(ip < end) + { + struct vax_double *const vdp = + (struct vax_double *)ip; + const struct ieee_double *const idp = + (const struct ieee_double *) (*xpp); + { + const struct dbl_limits *lim; + int ii; + for (ii = 0, lim = dbl_limits; + ii < sizeof(dbl_limits)/sizeof(struct dbl_limits); + ii++, lim++) + { + if ((idp->mant_lo == lim->ieee.mant_lo) + && (idp->mant_4 == lim->ieee.mant_4) + && (idp->mant_5 == lim->ieee.mant_5) + && (idp->mant_6 == lim->ieee.mant_6) + && (idp->exp_lo == lim->ieee.exp_lo) + && (idp->exp_hi == lim->ieee.exp_hi) + ) + { + *vdp = lim->d; + goto doneit; + } + } + } + { + unsigned exp = idp->exp_hi << 4 | idp->exp_lo; + vdp->exp = exp - IEEE_DBL_BIAS + VAX_DBL_BIAS; + } + { + unsigned mant_hi = ((idp->mant_6 << 16) + | (idp->mant_5 << 8) + | idp->mant_4); + unsigned mant_lo = SWAP4(idp->mant_lo); + vdp->mantissa1 = (mant_hi >> 13); + vdp->mantissa2 = ((mant_hi & MASK(13)) << 3) + | (mant_lo >> 29); + vdp->mantissa3 = (mant_lo >> 13); + vdp->mantissa4 = (mant_lo << 3); + } + doneit: + vdp->sign = idp->sign; + + ip++; + *xpp = (char *)(*xpp) + X_SIZEOF_DOUBLE; + } + return ENOERR; +} + /* vax */ +#else +int +ncx_getn_double_double(const void **xpp, size_t nelems, double *tp) +{ + const char *xp = *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + const int lstatus = ncx_get_double_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (const void *)xp; + return status; +} + +#endif + +int +ncx_putn_double_schar(void **xpp, size_t nelems, const schar *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_schar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_uchar(void **xpp, size_t nelems, const uchar *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_uchar(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_short(void **xpp, size_t nelems, const short *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_short(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_int(void **xpp, size_t nelems, const int *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_int(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_float(void **xpp, size_t nelems, const float *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_float(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_uint(void **xpp, size_t nelems, const uint *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_uint(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_longlong(void **xpp, size_t nelems, const longlong *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_longlong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +int +ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *tp) +{ +#if _SX && \ + X_SIZEOF_DOUBLE == SIZEOF_DOUBLE + + /* basic algorithm is: + * - ensure sane alignment of output data + * - copy (conversion happens automatically) input data + * to output + * - update tp to point at next unconverted input, and xpp to point + * at next location for converted output + */ + long i, j, ni; + double tmp[LOOPCNT]; /* in case input is misaligned */ + double *xp; + int nrange = 0; /* number of range errors */ + int realign = 0; /* "do we need to fix input data alignment?" */ + long cxp = (long) *((char**)xpp); + + realign = (cxp & 7) % SIZEOF_DOUBLE; + /* sjl: manually stripmine so we can limit amount of + * vector work space reserved to LOOPCNT elements. Also + * makes vectorisation easy */ + for (j=0; j X_DOUBLE_MAX; + } + /* copy workspace back if necessary */ + if (realign) { + memcpy(*xpp, tmp, ni*X_SIZEOF_DOUBLE); + xp = (double *) *xpp; + } + /* update xpp and tp */ + xp += ni; + tp += ni; + *xpp = (void*)xp; + } + return nrange == 0 ? ENOERR : NC_ERANGE; + +#else /* not SX */ + + char *xp = (char *) *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_ulonglong(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +#endif +} + +#if X_SIZEOF_DOUBLE == SIZEOF_DOUBLE && !defined(NO_IEEE_FLOAT) +/* optimized version */ +int +ncx_putn_double_double(void **xpp, size_t nelems, const double *tp) +{ +#ifdef WORDS_BIGENDIAN + (void) memcpy(*xpp, tp, nelems * X_SIZEOF_DOUBLE); +# else + swapn8b(*xpp, tp, nelems); +# endif + *xpp = (void *)((char *)(*xpp) + nelems * X_SIZEOF_DOUBLE); + return ENOERR; +} +#elif vax +int +ncx_putn_double_double(void **xpp, size_t ndoubles, const double *ip) +{ + const double *const end = ip + ndoubles; + + while(ip < end) + { + const struct vax_double *const vdp = + (const struct vax_double *)ip; + struct ieee_double *const idp = + (struct ieee_double *) (*xpp); + + if ((vdp->mantissa4 > (dbl_limits[0].d.mantissa4 - 3)) && + (vdp->mantissa3 == dbl_limits[0].d.mantissa3) && + (vdp->mantissa2 == dbl_limits[0].d.mantissa2) && + (vdp->mantissa1 == dbl_limits[0].d.mantissa1) && + (vdp->exp == dbl_limits[0].d.exp)) + { + *idp = dbl_limits[0].ieee; + goto shipit; + } + if ((vdp->mantissa4 == dbl_limits[1].d.mantissa4) && + (vdp->mantissa3 == dbl_limits[1].d.mantissa3) && + (vdp->mantissa2 == dbl_limits[1].d.mantissa2) && + (vdp->mantissa1 == dbl_limits[1].d.mantissa1) && + (vdp->exp == dbl_limits[1].d.exp)) + { + *idp = dbl_limits[1].ieee; + goto shipit; + } + + { + unsigned exp = vdp->exp - VAX_DBL_BIAS + IEEE_DBL_BIAS; + + unsigned mant_lo = ((vdp->mantissa2 & MASK(3)) << 29) | + (vdp->mantissa3 << 13) | + ((vdp->mantissa4 >> 3) & MASK(13)); + + unsigned mant_hi = (vdp->mantissa1 << 13) + | (vdp->mantissa2 >> 3); + + if((vdp->mantissa4 & 7) > 4) + { + /* round up */ + mant_lo++; + if(mant_lo == 0) + { + mant_hi++; + if(mant_hi > 0xffffff) + { + mant_hi = 0; + exp++; + } + } + } + + idp->mant_lo = SWAP4(mant_lo); + idp->mant_6 = mant_hi >> 16; + idp->mant_5 = (mant_hi & 0xff00) >> 8; + idp->mant_4 = mant_hi; + idp->exp_hi = exp >> 4; + idp->exp_lo = exp; + } + + shipit: + idp->sign = vdp->sign; + + ip++; + *xpp = (char *)(*xpp) + X_SIZEOF_DOUBLE; + } + return ENOERR; +} + /* vax */ +#else +int +ncx_putn_double_double(void **xpp, size_t nelems, const double *tp) +{ + char *xp = *xpp; + int status = ENOERR; + + for( ; nelems != 0; nelems--, xp += X_SIZEOF_DOUBLE, tp++) + { + int lstatus = ncx_put_double_double(xp, tp); + if(lstatus != ENOERR) + status = lstatus; + } + + *xpp = (void *)xp; + return status; +} + +#endif + + +/* + * Other aggregate conversion functions. + */ + +/* text */ + +int +ncx_getn_text(const void **xpp, size_t nelems, char *tp) +{ + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + return ENOERR; + +} + +int +ncx_pad_getn_text(const void **xpp, size_t nelems, char *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems + rndup); + + return ENOERR; + +} + +int +ncx_putn_text(void **xpp, size_t nelems, const char *tp) +{ + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + return ENOERR; + +} + +int +ncx_pad_putn_text(void **xpp, size_t nelems, const char *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + if(rndup) + { + (void) memcpy(*xpp, nada, rndup); + *xpp = (void *)((char *)(*xpp) + rndup); + } + + return ENOERR; + +} + + +/* opaque */ + +int +ncx_getn_void(const void **xpp, size_t nelems, void *tp) +{ + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + return ENOERR; + +} + +int +ncx_pad_getn_void(const void **xpp, size_t nelems, void *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(tp, *xpp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems + rndup); + + return ENOERR; + +} + +int +ncx_putn_void(void **xpp, size_t nelems, const void *tp) +{ + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + return ENOERR; + +} + +int +ncx_pad_putn_void(void **xpp, size_t nelems, const void *tp) +{ + size_t rndup = nelems % X_ALIGN; + + if(rndup) + rndup = X_ALIGN - rndup; + + (void) memcpy(*xpp, tp, nelems); + *xpp = (void *)((char *)(*xpp) + nelems); + + if(rndup) + { + (void) memcpy(*xpp, nada, rndup); + *xpp = (void *)((char *)(*xpp) + rndup); + } + + return ENOERR; + +} diff --git a/extern/src_netcdf4/ncx.h b/extern/src_netcdf4/ncx.h new file mode 100644 index 0000000..746df5f --- /dev/null +++ b/extern/src_netcdf4/ncx.h @@ -0,0 +1,753 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* "$Id: ncx.h,v 1.65 2010/05/26 18:11:08 dmh Exp $" */ + +#ifndef _NCX_H_ +#define _NCX_H_ + +#include "ncdispatch.h" +#include "ncio.h" +#include "fbits.h" + +/* + * An external data representation interface. + + * + * This started out as a general replacement for ONC XDR, + * specifically, the xdrmem family of functions. + * + * We eventually realized that we could write more portable + * code if we decoupled any association between the 'C' types + * and the external types. (XDR has this association between the 'C' + * types and the external representations, like xdr_int() takes + * an int argument and goes to an external int representation.) + * So, now there is a matrix of functions. + * + */ + +#include /* output of 'configure' */ +#include "rnd.h" +#include /* size_t */ +#include +#include /* off_t */ +#include +#define longlong long long + +#if defined(_CRAY) && !defined(_CRAYIEEE) && !defined(__crayx1) +#define CRAYFLOAT 1 /* CRAY Floating point */ +#elif defined(_SX) && defined(_FLOAT2) /* NEC SUPER-UX in CRAY mode */ +#define CRAYFLOAT 1 /* CRAY Floating point */ +#endif + +/* + * The integer return code for the conversion routines + * is 0 (ENOERR) when no error occured, or NC_ERANGE as appropriate + * for an overflow conversion. + */ +#ifndef ENOERR +#define ENOERR 0 +#endif +#ifndef NC_ERANGE +#define NC_ERANGE (-60) /* N.B. must match value in netcdf.h */ +#endif +#ifndef NC_ENOMEM +#define NC_ENOMEM (-61) /* N.B. must match value in netcdf.h */ +#endif + + +/* + * External sizes of the primitive elements. + */ +#define X_SIZEOF_CHAR 1 +#define X_SIZEOF_SHORT 2 +#define X_SIZEOF_INT 4 /* xdr_int */ +#if 0 +#define X_SIZEOF_LONG 8 */ /* xdr_long_long */ +#endif +#define X_SIZEOF_FLOAT 4 +#define X_SIZEOF_DOUBLE 8 + +/* + * For now, netcdf is limited to 32 bit sizes, + * If compiled with support for "large files", then + * netcdf will use a 64 bit off_t and it can then write a file + * using 64 bit offsets. + * see also X_SIZE_MAX, X_OFF_MAX below + */ +#define X_SIZEOF_OFF_T (sizeof(off_t)) +#define X_SIZEOF_SIZE_T X_SIZEOF_INT + +/* + * limits of the external representation + */ +#define X_SCHAR_MIN (-128) +#define X_SCHAR_MAX 127 +#define X_UCHAR_MAX 255U +#define X_SHORT_MIN (-32768) +#define X_SHRT_MIN X_SHORT_MIN /* alias compatible with limits.h */ +#define X_SHORT_MAX 32767 +#define X_SHRT_MAX X_SHORT_MAX /* alias compatible with limits.h */ +#define X_USHORT_MAX 65535U +#define X_USHRT_MAX X_USHORT_MAX /* alias compatible with limits.h */ +#define X_INT_MIN (-2147483647-1) +#define X_INT_MAX 2147483647 +#define X_UINT_MAX 4294967295U +#define X_LONGLONG_MIN (-9223372036854775807LL-1LL) +#define X_LONGLONG_MAX 9223372036854775807LL +#define X_ULONGLONG_MAX 18446744073709551615ULL +#define X_FLOAT_MAX 3.402823466e+38f +#define X_FLOAT_MIN (-X_FLOAT_MAX) +#define X_FLT_MAX X_FLOAT_MAX /* alias compatible with limits.h */ +#if CRAYFLOAT +/* ldexp(1. - ldexp(.5 , -46), 1024) */ +#define X_DOUBLE_MAX 1.79769313486230e+308 +#else +/* scalb(1. - scalb(.5 , -52), 1024) */ +#define X_DOUBLE_MAX 1.7976931348623157e+308 +#endif +#define X_DOUBLE_MIN (-X_DOUBLE_MAX) +#define X_DBL_MAX X_DOUBLE_MAX /* alias compatible with limits.h */ + +#define X_SIZE_MAX X_UINT_MAX +#define X_OFF_MAX X_INT_MAX + + +/* Begin ncx_len */ + +/* + * ncx_len_xxx() interfaces are defined as macros below, + * These give the length of an array of nelems of the type. + * N.B. The 'char' and 'short' interfaces give the X_ALIGNED length. + */ +#define X_ALIGN 4 /* a.k.a. BYTES_PER_XDR_UNIT */ + +#define ncx_len_char(nelems) \ + _RNDUP((nelems), X_ALIGN) + +#define ncx_len_short(nelems) \ + (((nelems) + (nelems)%2) * X_SIZEOF_SHORT) + +#define ncx_len_int(nelems) \ + ((nelems) * X_SIZEOF_INT) + +#define ncx_len_long(nelems) \ + ((nelems) * X_SIZEOF_LONG) + +#define ncx_len_float(nelems) \ + ((nelems) * X_SIZEOF_FLOAT) + +#define ncx_len_double(nelems) \ + ((nelems) * X_SIZEOF_DOUBLE) + +/* End ncx_len */ + +#if __CHAR_UNSIGNED__ + /* 'char' is unsigned, declare ncbyte as 'signed char' */ +typedef signed char schar; + +#else + /* 'char' is signed */ +typedef signed char schar; + +#endif /* __CHAR_UNSIGNED__ */ + +/* + * Primitive numeric conversion functions. + * The `put' functions convert from native internal + * type to the external type, while the `get' functions + * convert from the external to the internal. + * + * These take the form + * int ncx_get_{external_type}_{internal_type}( + * const void *xp, + * internal_type *ip + * ); + * int ncx_put_{external_type}_{internal_type}( + * void *xp, + * const internal_type *ip + * ); + * where + * `external_type' and `internal_type' chosen from + schar + uchar + short + ushort + int + uint + long + ulong + float + double + * + * Not all combinations make sense. + * We may not implement all combinations that make sense. + * The netcdf functions that use this ncx interface don't + * use these primitive conversion functions. They use the + * aggregate conversion functions declared below. + * + * Storage for a single element of external type is at the `void * xp' + * argument. + * + * Storage for a single element of internal type is at `ip' argument. + * + * These functions return 0 (ENOERR) when no error occured, + * or NC_ERANGE when the value being converted is too large. + * When NC_ERANGE occurs, an undefined (implementation dependent) + * conversion may have occured. + * + * Note that loss of precision may occur silently. + * + */ + +#if 0 +extern int +ncx_get_schar_schar(const void *xp, schar *ip); +extern int +ncx_get_schar_uchar(const void *xp, uchar *ip); +extern int +ncx_get_schar_short(const void *xp, short *ip); +extern int +ncx_get_schar_int(const void *xp, int *ip); +extern int +ncx_get_schar_long(const void *xp, long *ip); +extern int +ncx_get_schar_float(const void *xp, float *ip); +extern int +ncx_get_schar_double(const void *xp, double *ip); + +extern int +ncx_put_schar_schar(void *xp, const schar *ip); +extern int +ncx_put_schar_uchar(void *xp, const uchar *ip); +extern int +ncx_put_schar_short(void *xp, const short *ip); +extern int +ncx_put_schar_int(void *xp, const int *ip); +extern int +ncx_put_schar_long(void *xp, const long *ip); +extern int +ncx_put_schar_float(void *xp, const float *ip); +extern int +ncx_put_schar_double(void *xp, const double *ip); +#endif + + +extern int +ncx_get_short_schar(const void *xp, schar *ip); +extern int +ncx_get_short_uchar(const void *xp, uchar *ip); +extern int +ncx_get_short_short(const void *xp, short *ip); +extern int +ncx_get_short_int(const void *xp, int *ip); +extern int +ncx_get_short_long(const void *xp, long *ip); +extern int +ncx_get_short_float(const void *xp, float *ip); +extern int +ncx_get_short_double(const void *xp, double *ip); + +extern int +ncx_put_short_schar(void *xp, const schar *ip); +extern int +ncx_put_short_uchar(void *xp, const uchar *ip); +extern int +ncx_put_short_short(void *xp, const short *ip); +extern int +ncx_put_short_int(void *xp, const int *ip); +extern int +ncx_put_short_long(void *xp, const long *ip); +extern int +ncx_put_short_float(void *xp, const float *ip); +extern int +ncx_put_short_double(void *xp, const double *ip); + + +extern int +ncx_get_int_schar(const void *xp, schar *ip); +extern int +ncx_get_int_uchar(const void *xp, uchar *ip); +extern int +ncx_get_int_short(const void *xp, short *ip); +extern int +ncx_get_int_int(const void *xp, int *ip); +extern int +ncx_get_int_long(const void *xp, long *ip); +extern int +ncx_get_int_float(const void *xp, float *ip); +extern int +ncx_get_int_double(const void *xp, double *ip); + +extern int +ncx_put_int_schar(void *xp, const schar *ip); +extern int +ncx_put_int_uchar(void *xp, const uchar *ip); +extern int +ncx_put_int_short(void *xp, const short *ip); +extern int +ncx_put_int_int(void *xp, const int *ip); +extern int +ncx_put_int_long(void *xp, const long *ip); +extern int +ncx_put_int_float(void *xp, const float *ip); +extern int +ncx_put_int_double(void *xp, const double *ip); + + +extern int +ncx_get_float_schar(const void *xp, schar *ip); +extern int +ncx_get_float_uchar(const void *xp, uchar *ip); +extern int +ncx_get_float_short(const void *xp, short *ip); +extern int +ncx_get_float_int(const void *xp, int *ip); +extern int +ncx_get_float_long(const void *xp, long *ip); +extern int +ncx_get_float_float(const void *xp, float *ip); +extern int +ncx_get_float_double(const void *xp, double *ip); + +extern int +ncx_put_float_schar(void *xp, const schar *ip); +extern int +ncx_put_float_uchar(void *xp, const uchar *ip); +extern int +ncx_put_float_short(void *xp, const short *ip); +extern int +ncx_put_float_int(void *xp, const int *ip); +extern int +ncx_put_float_long(void *xp, const long *ip); +extern int +ncx_put_float_float(void *xp, const float *ip); +extern int +ncx_put_float_double(void *xp, const double *ip); + + +extern int +ncx_get_double_schar(const void *xp, schar *ip); +extern int +ncx_get_double_uchar(const void *xp, uchar *ip); +extern int +ncx_get_double_short(const void *xp, short *ip); +extern int +ncx_get_double_int(const void *xp, int *ip); +extern int +ncx_get_double_long(const void *xp, long *ip); +extern int +ncx_get_double_float(const void *xp, float *ip); +extern int +ncx_get_double_double(const void *xp, double *ip); + +extern int +ncx_put_double_schar(void *xp, const schar *ip); +extern int +ncx_put_double_uchar(void *xp, const uchar *ip); +extern int +ncx_put_double_short(void *xp, const short *ip); +extern int +ncx_put_double_int(void *xp, const int *ip); +extern int +ncx_put_double_long(void *xp, const long *ip); +extern int +ncx_put_double_float(void *xp, const float *ip); +extern int +ncx_put_double_double(void *xp, const double *ip); + + +/* + * Other primitive conversion functions + * N.B. slightly different interface + * Used by netcdf. + */ + +/* ncx_get_int_size_t */ +extern int +ncx_get_size_t(const void **xpp, size_t *ulp); +/* ncx_get_int_off_t */ +extern int +ncx_get_off_t(const void **xpp, off_t *lp, size_t sizeof_off_t); + +/* ncx_put_int_size_t */ +extern int +ncx_put_size_t(void **xpp, const size_t *ulp); +/* ncx_put_int_off_t */ +extern int +ncx_put_off_t(void **xpp, const off_t *lp, size_t sizeof_off_t); + + +/* + * Aggregate numeric conversion functions. + * Convert an array. Replaces xdr_array(...). + * These functions are used by netcdf. Unlike the xdr + * interface, we optimize for aggregate conversions. + * This functions should be implemented to take advantage + * of multiple processor / parallel hardware where available. + * + * These take the form + * int ncx_getn_{external_type}_{internal_type}( + * const void *xpp, + * size_t nelems, + * internal_type *ip + * ); + * int ncx_putn_{external_type}_{internal_type}( + * void **xpp, + * size_t nelems, + * const internal_type *ip + * ); + * Where the types are as in the primitive numeric conversion functions. + * + * The value of the pointer to pointer argument, *xpp, is + * expected to reference storage for `nelems' of the external + * type. On return, it modified to reference just past the last + * converted external element. + * + * The types whose external size is less than X_ALIGN also have `pad' + * interfaces. These round (and zero fill on put) *xpp up to X_ALIGN + * boundaries. (This is the usual xdr behavior.) + * + * The `ip' argument should point to an array of `nelems' of + * internal_type. + * + * Range errors (NC_ERANGE) for a individual values in the array + * DO NOT terminate the array conversion. All elements are converted, + * with some having undefined values. + * If any range error occurs, the function returns NC_ERANGE. + * + */ + +extern int +ncx_getn_schar_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_getn_schar_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_getn_schar_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_getn_schar_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_getn_schar_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_getn_schar_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_getn_schar_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_getn_schar_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_getn_schar_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_pad_getn_schar_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_pad_getn_schar_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_pad_getn_schar_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_pad_getn_schar_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_pad_getn_schar_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_pad_getn_schar_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_pad_getn_schar_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_pad_getn_schar_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_pad_getn_schar_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_pad_getn_schar_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_putn_schar_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_putn_schar_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_putn_schar_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_putn_schar_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_putn_schar_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_putn_schar_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_putn_schar_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_putn_schar_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_putn_schar_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + +extern int +ncx_pad_putn_schar_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_pad_putn_schar_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_pad_putn_schar_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_pad_putn_schar_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_pad_putn_schar_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_pad_putn_schar_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_pad_putn_schar_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_pad_putn_schar_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_pad_putn_schar_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_pad_putn_schar_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + + +extern int +ncx_getn_short_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_getn_short_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_getn_short_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_getn_short_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_getn_short_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_getn_short_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_getn_short_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_getn_short_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_getn_short_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_pad_getn_short_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_pad_getn_short_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_pad_getn_short_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_pad_getn_short_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_pad_getn_short_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_pad_getn_short_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_pad_getn_short_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_pad_getn_short_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_pad_getn_short_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_pad_getn_short_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_putn_short_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_putn_short_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_putn_short_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_putn_short_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_putn_short_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_putn_short_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_putn_short_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_putn_short_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_putn_short_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + +extern int +ncx_pad_putn_short_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_pad_putn_short_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_pad_putn_short_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_pad_putn_short_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_pad_putn_short_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_pad_putn_short_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_pad_putn_short_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_pad_putn_short_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_pad_putn_short_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_pad_putn_short_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + + +extern int +ncx_getn_int_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_getn_int_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_getn_int_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_getn_int_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_getn_int_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_getn_int_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_getn_int_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_getn_int_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_getn_int_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_getn_int_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_putn_int_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_putn_int_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_putn_int_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_putn_int_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_putn_int_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_putn_int_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_putn_int_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_putn_int_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_putn_int_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_putn_int_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + + +extern int +ncx_getn_float_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_getn_float_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_getn_float_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_getn_float_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_getn_float_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_getn_float_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_getn_float_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_getn_float_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_getn_float_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_getn_float_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_putn_float_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_putn_float_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_putn_float_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_putn_float_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_putn_float_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_putn_float_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_putn_float_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_putn_float_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_putn_float_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_putn_float_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + + +extern int +ncx_getn_double_schar(const void **xpp, size_t nelems, schar *ip); +extern int +ncx_getn_double_uchar(const void **xpp, size_t nelems, uchar *ip); +extern int +ncx_getn_double_short(const void **xpp, size_t nelems, short *ip); +extern int +ncx_getn_double_int(const void **xpp, size_t nelems, int *ip); +extern int +ncx_getn_double_long(const void **xpp, size_t nelems, long *ip); +extern int +ncx_getn_double_float(const void **xpp, size_t nelems, float *ip); +extern int +ncx_getn_double_double(const void **xpp, size_t nelems, double *ip); +extern int +ncx_getn_double_uint(const void **xpp, size_t nelems, unsigned int *ip); +extern int +ncx_getn_double_longlong(const void **xpp, size_t nelems, longlong *ip); +extern int +ncx_getn_double_ulonglong(const void **xpp, size_t nelems, ulonglong *ip); + +extern int +ncx_putn_double_schar(void **xpp, size_t nelems, const schar *ip); +extern int +ncx_putn_double_uchar(void **xpp, size_t nelems, const uchar *ip); +extern int +ncx_putn_double_short(void **xpp, size_t nelems, const short *ip); +extern int +ncx_putn_double_int(void **xpp, size_t nelems, const int *ip); +extern int +ncx_putn_double_long(void **xpp, size_t nelems, const long *ip); +extern int +ncx_putn_double_float(void **xpp, size_t nelems, const float *ip); +extern int +ncx_putn_double_double(void **xpp, size_t nelems, const double *ip); +extern int +ncx_putn_double_uint(void **xpp, size_t nelems, const unsigned int *ip); +extern int +ncx_putn_double_longlong(void **xpp, size_t nelems, const longlong *ip); +extern int +ncx_putn_double_ulonglong(void **xpp, size_t nelems, const ulonglong *ip); + + +/* + * Other aggregate conversion functions. + */ + +/* read ASCII characters */ +extern int +ncx_getn_text(const void **xpp, size_t nchars, char *cp); +extern int +ncx_pad_getn_text(const void **xpp, size_t nchars, char *cp); + +/* write ASCII characters */ +extern int +ncx_putn_text(void **xpp, size_t nchars, const char *cp); +extern int +ncx_pad_putn_text(void **xpp, size_t nchars, const char *cp); + +/* for symmetry */ +#define ncx_getn_char_char(xpp, nelems, fillp) ncx_getn_text(xpp, nelems, fillp) +#define ncx_putn_char_char(xpp, nelems, fillp) ncx_putn_text(xpp, nelems, fillp) + +/* read opaque data */ +extern int +ncx_getn_void(const void **xpp, size_t nchars, void *vp); +extern int +ncx_pad_getn_void(const void **xpp, size_t nchars, void *vp); + +/* write opaque data */ +extern int +ncx_putn_void(void **xpp, size_t nchars, const void *vp); +extern int +ncx_pad_putn_void(void **xpp, size_t nchars, const void *vp); + +#endif /* _NCX_H_ */ diff --git a/extern/src_netcdf4/netcdf.h b/extern/src_netcdf4/netcdf.h new file mode 100644 index 0000000..8ccfb0f --- /dev/null +++ b/extern/src_netcdf4/netcdf.h @@ -0,0 +1,1883 @@ +/*! \file + +Main header file for the C API. + +Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 University +Corporation for Atmospheric Research/Unidata. See \ref copyright file +for more info. +*/ + +#ifndef _NETCDF_ +#define _NETCDF_ + +#include /* size_t, ptrdiff_t */ +#include /* netcdf functions sometimes return system errors */ + +/*! The nc_type type is just an int. */ +typedef int nc_type; + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + * The netcdf external data types + */ +#define NC_NAT 0 /**< Not A Type */ +#define NC_BYTE 1 /**< signed 1 byte integer */ +#define NC_CHAR 2 /**< ISO/ASCII character */ +#define NC_SHORT 3 /**< signed 2 byte integer */ +#define NC_INT 4 /**< signed 4 byte integer */ +#define NC_LONG NC_INT /**< deprecated, but required for backward compatibility. */ +#define NC_FLOAT 5 /**< single precision floating point number */ +#define NC_DOUBLE 6 /**< double precision floating point number */ +#define NC_UBYTE 7 /**< unsigned 1 byte int */ +#define NC_USHORT 8 /**< unsigned 2-byte int */ +#define NC_UINT 9 /**< unsigned 4-byte int */ +#define NC_INT64 10 /**< signed 8-byte int */ +#define NC_UINT64 11 /**< unsigned 8-byte int */ +#define NC_STRING 12 /**< string */ + +#define NC_MAX_ATOMIC_TYPE NC_STRING + +/* The following are use internally in support of user-defines + * types. They are also the class returned by nc_inq_user_type. */ +#define NC_VLEN 13 /**< vlen types */ +#define NC_OPAQUE 14 /**< opaque types */ +#define NC_ENUM 15 /**< enum types */ +#define NC_COMPOUND 16 /**< compound types */ + +/* Define the first user defined type id (leave some room) */ +#define NC_FIRSTUSERTYPEID 32 + +/** Default fill value. This is used unless _FillValue attribute + * is set. These values are stuffed into newly allocated space as + * appropriate. The hope is that one might use these to notice that a + * particular datum has not been set. */ +/**@{*/ +#define NC_FILL_BYTE ((signed char)-127) +#define NC_FILL_CHAR ((char)0) +#define NC_FILL_SHORT ((short)-32767) +#define NC_FILL_INT (-2147483647L) +#define NC_FILL_FLOAT (9.9692099683868690e+36f) /* near 15 * 2^119 */ +#define NC_FILL_DOUBLE (9.9692099683868690e+36) +#define NC_FILL_UBYTE (255) +#define NC_FILL_USHORT (65535) +#define NC_FILL_UINT (4294967295U) +#define NC_FILL_INT64 ((long long)-9223372036854775806LL) +#define NC_FILL_UINT64 ((unsigned long long)18446744073709551614ULL) +#define NC_FILL_STRING "" +/**@}*/ + +/*! Max or min values for a type. Nothing greater/smaller can be + * stored in a netCDF file for their associated types. Recall that a C + * compiler may define int to be any length it wants, but a NC_INT is + * *always* a 4 byte signed int. On a platform with 64 bit ints, + * there will be many ints which are outside the range supported by + * NC_INT. But since NC_INT is an external format, it has to mean the + * same thing everywhere. */ +/**@{*/ +#define NC_MAX_BYTE 127 +#define NC_MIN_BYTE (-NC_MAX_BYTE-1) +#define NC_MAX_CHAR 255 +#define NC_MAX_SHORT 32767 +#define NC_MIN_SHORT (-NC_MAX_SHORT - 1) +#define NC_MAX_INT 2147483647 +#define NC_MIN_INT (-NC_MAX_INT - 1) +#define NC_MAX_FLOAT 3.402823466e+38f +#define NC_MIN_FLOAT (-NC_MAX_FLOAT) +#define NC_MAX_DOUBLE 1.7976931348623157e+308 +#define NC_MIN_DOUBLE (-NC_MAX_DOUBLE) +#define NC_MAX_UBYTE NC_MAX_CHAR +#define NC_MAX_USHORT 65535U +#define NC_MAX_UINT 4294967295U +#define NC_MAX_INT64 (9223372036854775807LL) +#define NC_MIN_INT64 (-9223372036854775807LL-1) +#define NC_MAX_UINT64 (18446744073709551615ULL) +#define X_INT64_MAX (9223372036854775807LL) +#define X_INT64_MIN (-X_INT64_MAX - 1) +#define X_UINT64_MAX (18446744073709551615ULL) +/**@}*/ + +/** Name of fill value attribute. If you wish a variable to use a + * different value than the above defaults, create an attribute with + * the same type as the variable and this reserved name. The value you + * give the attribute will be used as the fill value for that + * variable. */ +#define _FillValue "_FillValue" +#define NC_FILL 0 /**< Argument to nc_set_fill() to clear NC_NOFILL */ +#define NC_NOFILL 0x100 /**< Argument to nc_set_fill() to turn off filling of data. */ + +/* Define the ioflags bits for nc_create and nc_open. + currently unused: 0x0010,0x0020,0x0040,0x0080 + and the whole upper 16 bits +*/ + +#define NC_NOWRITE 0x0000 /**< Set read-only access for nc_open(). */ +#define NC_WRITE 0x0001 /**< Set read-write access for nc_open(). */ +/* unused: 0x0002 */ +#define NC_CLOBBER 0x0000 /**< Destroy existing file. Mode flag for nc_create(). */ +#define NC_NOCLOBBER 0x0004 /**< Don't destroy existing file. Mode flag for nc_create(). */ + +#define NC_DISKLESS 0x0008 /**< Use diskless file. Mode flag for nc_open() or nc_create(). */ +#define NC_MMAP 0x0010 /**< Use diskless file with mmap. Mode flag for nc_open() or nc_create(). */ + +#define NC_CLASSIC_MODEL 0x0100 /**< Enforce classic model. Mode flag for nc_create(). */ +#define NC_64BIT_OFFSET 0x0200 /**< Use large (64-bit) file offsets. Mode flag for nc_create(). */ + +/** \deprecated The following flag currently is ignored, but use in + * nc_open() or nc_create() may someday support use of advisory + * locking to prevent multiple writers from clobbering a file + */ +#define NC_LOCK 0x0400 + +/** Share updates, limit cacheing. +Use this in mode flags for both nc_create() and nc_open(). */ +#define NC_SHARE 0x0800 + +#define NC_NETCDF4 0x1000 /**< Use netCDF-4/HDF5 format. Mode flag for nc_create(). */ + +/** Turn on MPI I/O. +Use this in mode flags for both nc_create() and nc_open(). */ +#define NC_MPIIO 0x2000 +/** Turn on MPI POSIX I/O. +Use this in mode flags for both nc_create() and nc_open(). */ +#define NC_MPIPOSIX 0x4000 +#define NC_PNETCDF 0x8000 /**< Use parallel-netcdf library. Mode flag for nc_open(). */ + +/** Format specifier for nc_set_default_format(). Starting with + * version 3.6, there are different format netCDF files. 4.0 + * introduces the third one. \see netcdf_format + */ +/**@{*/ +#define NC_FORMAT_CLASSIC (1) +#define NC_FORMAT_64BIT (2) +#define NC_FORMAT_NETCDF4 (3) +#define NC_FORMAT_NETCDF4_CLASSIC (4) +/**@}*/ + +/** Let nc__create() or nc__open() figure out as suitable chunk + * size. */ +#define NC_SIZEHINT_DEFAULT 0 + +/** In nc__enddef(), align to the chunk size. */ +#define NC_ALIGN_CHUNK ((size_t)(-1)) + +/** Size argument to nc_def_dim() for an unlimited dimension. */ +#define NC_UNLIMITED 0L + +/** Attribute id to put/get a global attribute. */ +#define NC_GLOBAL -1 + +/** +Maximum for classic library. + +In the classic netCDF model there are maximum values for the number of +dimensions in the file (\ref NC_MAX_DIMS), the number of global or per +variable attributes (\ref NC_MAX_ATTRS), the number of variables in +the file (\ref NC_MAX_VARS), and the length of a name (\ref +NC_MAX_NAME). + +This maximum is enforced by the interface, to facilitate writing +applications and utilities. However, nothing is statically allocated +to this size internally. + +This maximum is not used for netCDF-4/HDF5 files unless they were +created with the ::NC_CLASSIC_MODEL flag. + +As a rule, NC_MAX_VAR_DIMS <= NC_MAX_DIMS. +*/ +/**@{*/ +#define NC_MAX_DIMS 1024 +#define NC_MAX_ATTRS 8192 +#define NC_MAX_VARS 8192 +#define NC_MAX_NAME 256 +#define NC_MAX_VAR_DIMS 1024 /**< max per variable dimensions */ +/**@}*/ + +/** This is the max size of an SD dataset name in HDF4 (from HDF4 documentation).*/ +#define NC_MAX_HDF4_NAME 64 + +/** In HDF5 files you can set the endianness of variables with + nc_def_var_endian(). This define is used there. */ +/**@{*/ +#define NC_ENDIAN_NATIVE 0 +#define NC_ENDIAN_LITTLE 1 +#define NC_ENDIAN_BIG 2 +/**@}*/ + +/** In HDF5 files you can set storage for each variable to be either + * contiguous or chunked, with nc_def_var_chunking(). This define is + * used there. */ +/**@{*/ +#define NC_CHUNKED 0 +#define NC_CONTIGUOUS 1 +/**@}*/ + +/** In HDF5 files you can set check-summing for each variable. +Currently the only checksum available is Fletcher-32, which can be set +with the function nc_def_var_fletcher32. These defines are used +there. */ +/**@{*/ +#define NC_NOCHECKSUM 0 +#define NC_FLETCHER32 1 +/**@}*/ + +/**@{*/ +/** Control the HDF5 shuffle filter. In HDF5 files you can specify + * that a shuffle filter should be used on each chunk of a variable to + * improve compression for that variable. This per-variable shuffle + * property can be set with the function nc_def_var_deflate(). */ +#define NC_NOSHUFFLE 0 +#define NC_SHUFFLE 1 +/**@}*/ + +/** The netcdf version 3 functions all return integer error status. + * These are the possible values, in addition to certain values from + * the system errno.h. + */ +#define NC_ISSYSERR(err) ((err) > 0) + +#define NC_NOERR 0 /**< No Error */ +#define NC2_ERR (-1) /**< Returned for all errors in the v2 API. */ + +/** Not a netcdf id. + +The specified netCDF ID does not refer to an +open netCDF dataset. */ +#define NC_EBADID (-33) +#define NC_ENFILE (-34) /**< Too many netcdfs open */ +#define NC_EEXIST (-35) /**< netcdf file exists && NC_NOCLOBBER */ +#define NC_EINVAL (-36) /**< Invalid Argument */ +#define NC_EPERM (-37) /**< Write to read only */ + +/** Operation not allowed in data mode. This is returned for netCDF +classic or 64-bit offset files, or for netCDF-4 files, when they were +been created with ::NC_CLASSIC_MODEL flag in nc_create(). */ +#define NC_ENOTINDEFINE (-38) + +/** Operation not allowed in define mode. + +The specified netCDF is in define mode rather than data mode. + +With netCDF-4/HDF5 files, this error will not occur, unless +::NC_CLASSIC_MODEL was used in nc_create(). + */ +#define NC_EINDEFINE (-39) + +/** Index exceeds dimension bound. + +The specified corner indices were out of range for the rank of the +specified variable. For example, a negative index or an index that is +larger than the corresponding dimension length will cause an error. */ +#define NC_EINVALCOORDS (-40) +#define NC_EMAXDIMS (-41) /**< NC_MAX_DIMS exceeded */ +#define NC_ENAMEINUSE (-42) /**< String match to name in use */ +#define NC_ENOTATT (-43) /**< Attribute not found */ +#define NC_EMAXATTS (-44) /**< NC_MAX_ATTRS exceeded */ +#define NC_EBADTYPE (-45) /**< Not a netcdf data type */ +#define NC_EBADDIM (-46) /**< Invalid dimension id or name */ +#define NC_EUNLIMPOS (-47) /**< NC_UNLIMITED in the wrong index */ + +/** NC_MAX_VARS exceeded. Max number of variables exceeded in a +classic or 64-bit offset file, or an netCDF-4 file with +::NC_CLASSIC_MODEL on. */ +#define NC_EMAXVARS (-48) + +/** Variable not found. + +The variable ID is invalid for the specified netCDF dataset. */ +#define NC_ENOTVAR (-49) +#define NC_EGLOBAL (-50) /**< Action prohibited on NC_GLOBAL varid */ +#define NC_ENOTNC (-51) /**< Not a netcdf file */ +#define NC_ESTS (-52) /**< In Fortran, string too short */ +#define NC_EMAXNAME (-53) /**< NC_MAX_NAME exceeded */ +#define NC_EUNLIMIT (-54) /**< NC_UNLIMITED size already in use */ +#define NC_ENORECVARS (-55) /**< nc_rec op when there are no record vars */ +#define NC_ECHAR (-56) /**< Attempt to convert between text & numbers */ + +/** Start+count exceeds dimension bound. + +The specified edge lengths added to the specified corner would have +referenced data out of range for the rank of the specified +variable. For example, an edge length that is larger than the +corresponding dimension length minus the corner index will cause an +error. */ +#define NC_EEDGE (-57) +#define NC_ESTRIDE (-58) /**< Illegal stride */ +#define NC_EBADNAME (-59) /**< Attribute or variable name contains illegal characters */ +/* N.B. following must match value in ncx.h */ + +/** Math result not representable. + +One or more of the values are out of the range of values representable +by the desired type. */ +#define NC_ERANGE (-60) +#define NC_ENOMEM (-61) /**< Memory allocation (malloc) failure */ +#define NC_EVARSIZE (-62) /**< One or more variable sizes violate format constraints */ +#define NC_EDIMSIZE (-63) /**< Invalid dimension size */ +#define NC_ETRUNC (-64) /**< File likely truncated or possibly corrupted */ +#define NC_EAXISTYPE (-65) /**< Unknown axis type. */ + +/* Following errors are added for DAP */ +#define NC_EDAP (-66) /**< Generic DAP error */ +#define NC_ECURL (-67) /**< Generic libcurl error */ +#define NC_EIO (-68) /**< Generic IO error */ +#define NC_ENODATA (-69) /**< Attempt to access variable with no data */ +#define NC_EDAPSVC (-70) /**< DAP server error */ +#define NC_EDAS (-71) /**< Malformed or inaccessible DAS */ +#define NC_EDDS (-72) /**< Malformed or inaccessible DDS */ +#define NC_EDATADDS (-73) /**< Malformed or inaccessible DATADDS */ +#define NC_EDAPURL (-74) /**< Malformed DAP URL */ +#define NC_EDAPCONSTRAINT (-75) /**< Malformed DAP Constraint*/ +#define NC_ETRANSLATION (-76) /**< Untranslatable construct */ + +/* The following was added in support of netcdf-4. Make all netcdf-4 + error codes < -100 so that errors can be added to netcdf-3 if + needed. */ +#define NC4_FIRST_ERROR (-100) + +/** Error at HDF5 layer. */ +#define NC_EHDFERR (-101) +#define NC_ECANTREAD (-102) /**< Can't read. */ +#define NC_ECANTWRITE (-103) /**< Can't write. */ +#define NC_ECANTCREATE (-104) /**< Can't create. */ +#define NC_EFILEMETA (-105) /**< Problem with file metadata. */ +#define NC_EDIMMETA (-106) /**< Problem with dimension metadata. */ +#define NC_EATTMETA (-107) /**< Problem with attribute metadata. */ +#define NC_EVARMETA (-108) /**< Problem with variable metadata. */ +#define NC_ENOCOMPOUND (-109) /**< Not a compound type. */ +#define NC_EATTEXISTS (-110) /**< Attribute already exists. */ +#define NC_ENOTNC4 (-111) /**< Attempting netcdf-4 operation on netcdf-3 file. */ + +/** Attempting netcdf-4 operation on strict nc3 netcdf-4 file. */ +#define NC_ESTRICTNC3 (-112) +#define NC_ENOTNC3 (-113) /**< Attempting netcdf-3 operation on netcdf-4 file. */ +#define NC_ENOPAR (-114) /**< Parallel operation on file opened for non-parallel access. */ +#define NC_EPARINIT (-115) /**< Error initializing for parallel access. */ +#define NC_EBADGRPID (-116) /**< Bad group ID. */ +#define NC_EBADTYPID (-117) /**< Bad type ID. */ +#define NC_ETYPDEFINED (-118) /**< Type has already been defined and may not be edited. */ +#define NC_EBADFIELD (-119) /**< Bad field ID. */ +#define NC_EBADCLASS (-120) /**< Bad class. */ +#define NC_EMAPTYPE (-121) /**< Mapped access for atomic types only. */ +#define NC_ELATEFILL (-122) /**< Attempt to define fill value when data already exists. */ +#define NC_ELATEDEF (-123) /**< Attempt to define var properties, like deflate, after enddef. */ +#define NC_EDIMSCALE (-124) /**< Probem with HDF5 dimscales. */ +#define NC_ENOGRP (-125) /**< No group found. */ +#define NC_ESTORAGE (-126) /**< Can't specify both contiguous and chunking. */ +#define NC_EBADCHUNK (-127) /**< Bad chunksize. */ +#define NC_ENOTBUILT (-128) /**< Attempt to use feature that was not turned on when netCDF was built. */ +#define NC_EDISKLESS (-129) /**< Error in using diskless access. */ + +#define NC4_LAST_ERROR (-129) + +/* This is used in netCDF-4 files for dimensions without coordinate + * vars. */ +#define DIM_WITHOUT_VARIABLE "This is a netCDF dimension but not a netCDF variable." + +/* This is here at the request of the NCO team to support our + * mistake of having chunksizes be first ints, then size_t. Doh! */ +#define NC_HAVE_NEW_CHUNKING_API 1 + + +/*Errors for all remote access methods(e.g. DAP and CDMREMOTE)*/ +#define NC_EURL (NC_EDAPURL) /* Malformed URL */ +#define NC_ECONSTRAINT (NC_EDAPCONSTRAINT) /* Malformed Constraint*/ + + +/* + * The Interface + */ + +/* Declaration modifiers for DLL support (MSC et al) */ + +#if defined(DLL_NETCDF) /* define when library is a DLL */ +# if defined(DLL_EXPORT) /* define when building the library */ +# define MSC_EXTRA __declspec(dllexport) +# else +# define MSC_EXTRA __declspec(dllimport) +# endif +#include +/*#define lseek _lseeki64 + #define off_t __int64*/ +#else +#define MSC_EXTRA +#endif /* defined(DLL_NETCDF) */ + +# define EXTERNL MSC_EXTRA extern + +#if defined(DLL_NETCDF) /* define when library is a DLL */ +EXTERNL int ncerr; +EXTERNL int ncopts; +#endif + +EXTERNL const char * +nc_inq_libvers(void); + +EXTERNL const char * +nc_strerror(int ncerr); + +EXTERNL int +nc__create(const char *path, int cmode, size_t initialsz, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc_create(const char *path, int cmode, int *ncidp); + +EXTERNL int +nc__open(const char *path, int mode, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc_open(const char *path, int mode, int *ncidp); + +/* Learn the path used to open/create the file. */ +EXTERNL int +nc_inq_path(int ncid, size_t *pathlen, char *path); + +/* Use these with nc_var_par_access(). */ +#define NC_INDEPENDENT 0 +#define NC_COLLECTIVE 1 + +/* Set parallel access for a variable to independent (the default) or + * collective. */ +EXTERNL int +nc_var_par_access(int ncid, int varid, int par_access); + +/* Given an ncid and group name (NULL gets root group), return + * locid. */ +EXTERNL int +nc_inq_ncid(int ncid, const char *name, int *grp_ncid); + +/* Given a location id, return the number of groups it contains, and + * an array of their locids. */ +EXTERNL int +nc_inq_grps(int ncid, int *numgrps, int *ncids); + +/* Given locid, find name of group. (Root group is named "/".) */ +EXTERNL int +nc_inq_grpname(int ncid, char *name); + +/* Given ncid, find full name and len of full name. (Root group is + * named "/", with length 1.) */ +EXTERNL int +nc_inq_grpname_full(int ncid, size_t *lenp, char *full_name); + +/* Given ncid, find len of full name. */ +EXTERNL int +nc_inq_grpname_len(int ncid, size_t *lenp); + +/* Given an ncid, find the ncid of its parent group. */ +EXTERNL int +nc_inq_grp_parent(int ncid, int *parent_ncid); + +/* Given a name and parent ncid, find group ncid. */ +EXTERNL int +nc_inq_grp_ncid(int ncid, const char *grp_name, int *grp_ncid); + +/* Given a full name and ncid, find group ncid. */ +EXTERNL int +nc_inq_grp_full_ncid(int ncid, const char *full_name, int *grp_ncid); + +/* Get a list of ids for all the variables in a group. */ +EXTERNL int +nc_inq_varids(int ncid, int *nvars, int *varids); + +/* Find all dimids for a location. This finds all dimensions in a + * group, or any of its parents. */ +EXTERNL int +nc_inq_dimids(int ncid, int *ndims, int *dimids, int include_parents); + +/* Find all user-defined types for a location. This finds all + * user-defined types in a group. */ +EXTERNL int +nc_inq_typeids(int ncid, int *ntypes, int *typeids); + +/* Are two types equal? */ +EXTERNL int +nc_inq_type_equal(int ncid1, nc_type typeid1, int ncid2, + nc_type typeid2, int *equal); + +/* Create a group. its ncid is returned in the new_ncid pointer. */ +EXTERNL int +nc_def_grp(int parent_ncid, const char *name, int *new_ncid); + +/* Here are functions for dealing with compound types. */ + +/* Create a compound type. */ +EXTERNL int +nc_def_compound(int ncid, size_t size, const char *name, nc_type *typeidp); + +/* Insert a named field into a compound type. */ +EXTERNL int +nc_insert_compound(int ncid, nc_type xtype, const char *name, + size_t offset, nc_type field_typeid); + +/* Insert a named array into a compound type. */ +EXTERNL int +nc_insert_array_compound(int ncid, nc_type xtype, const char *name, + size_t offset, nc_type field_typeid, + int ndims, const int *dim_sizes); + +/* Get the name and size of a type. */ +EXTERNL int +nc_inq_type(int ncid, nc_type xtype, char *name, size_t *size); + +/* Get the id of a type from the name. */ +EXTERNL int +nc_inq_typeid(int ncid, const char *name, nc_type *typeidp); + +/* Get the name, size, and number of fields in a compound type. */ +EXTERNL int +nc_inq_compound(int ncid, nc_type xtype, char *name, size_t *sizep, + size_t *nfieldsp); + +/* Get the name of a compound type. */ +EXTERNL int +nc_inq_compound_name(int ncid, nc_type xtype, char *name); + +/* Get the size of a compound type. */ +EXTERNL int +nc_inq_compound_size(int ncid, nc_type xtype, size_t *sizep); + +/* Get the number of fields in this compound type. */ +EXTERNL int +nc_inq_compound_nfields(int ncid, nc_type xtype, size_t *nfieldsp); + +/* Given the xtype and the fieldid, get all info about it. */ +EXTERNL int +nc_inq_compound_field(int ncid, nc_type xtype, int fieldid, char *name, + size_t *offsetp, nc_type *field_typeidp, int *ndimsp, + int *dim_sizesp); + +/* Given the typeid and the fieldid, get the name. */ +EXTERNL int +nc_inq_compound_fieldname(int ncid, nc_type xtype, int fieldid, + char *name); + +/* Given the xtype and the name, get the fieldid. */ +EXTERNL int +nc_inq_compound_fieldindex(int ncid, nc_type xtype, const char *name, + int *fieldidp); + +/* Given the xtype and fieldid, get the offset. */ +EXTERNL int +nc_inq_compound_fieldoffset(int ncid, nc_type xtype, int fieldid, + size_t *offsetp); + +/* Given the xtype and the fieldid, get the type of that field. */ +EXTERNL int +nc_inq_compound_fieldtype(int ncid, nc_type xtype, int fieldid, + nc_type *field_typeidp); + +/* Given the xtype and the fieldid, get the number of dimensions for + * that field (scalars are 0). */ +EXTERNL int +nc_inq_compound_fieldndims(int ncid, nc_type xtype, int fieldid, + int *ndimsp); + +/* Given the xtype and the fieldid, get the sizes of dimensions for + * that field. User must have allocated storage for the dim_sizes. */ +EXTERNL int +nc_inq_compound_fielddim_sizes(int ncid, nc_type xtype, int fieldid, + int *dim_sizes); + +/** This is the type of arrays of vlens. */ +typedef struct { + size_t len; /**< Length of VL data (in base type units) */ + void *p; /**< Pointer to VL data */ +} nc_vlen_t; + +/** Calculate an offset for creating a compound type. This calls a + * mysterious C macro which was found carved into one of the blocks of + * the Newgrange passage tomb in County Meath, Ireland. This code has + * been carbon dated to 3200 B.C.E. */ +#define NC_COMPOUND_OFFSET(S,M) (offsetof(S,M)) + +/* Create a variable length type. */ +EXTERNL int +nc_def_vlen(int ncid, const char *name, nc_type base_typeid, nc_type *xtypep); + +/* Find out about a vlen. */ +EXTERNL int +nc_inq_vlen(int ncid, nc_type xtype, char *name, size_t *datum_sizep, + nc_type *base_nc_typep); + +/* When you read VLEN type the library will actually allocate the + * storage space for the data. This storage space must be freed, so + * pass the pointer back to this function, when you're done with the + * data, and it will free the vlen memory. */ +EXTERNL int +nc_free_vlen(nc_vlen_t *vl); + +EXTERNL int +nc_free_vlens(size_t len, nc_vlen_t vlens[]); + +/* Put or get one element in a vlen array. */ +EXTERNL int +nc_put_vlen_element(int ncid, int typeid1, void *vlen_element, + size_t len, const void *data); + +EXTERNL int +nc_get_vlen_element(int ncid, int typeid1, const void *vlen_element, + size_t *len, void *data); + +/* When you read the string type the library will allocate the storage + * space for the data. This storage space must be freed, so pass the + * pointer back to this function, when you're done with the data, and + * it will free the string memory. */ +EXTERNL int +nc_free_string(size_t len, char **data); + +/* Find out about a user defined type. */ +EXTERNL int +nc_inq_user_type(int ncid, nc_type xtype, char *name, size_t *size, + nc_type *base_nc_typep, size_t *nfieldsp, int *classp); + +/* Write an attribute of any type. */ +EXTERNL int +nc_put_att(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const void *op); + +/* Read an attribute of any type. */ +EXTERNL int +nc_get_att(int ncid, int varid, const char *name, void *ip); + +/* Enum type. */ + +/* Create an enum type. Provide a base type and a name. At the moment + * only ints are accepted as base types. */ +EXTERNL int +nc_def_enum(int ncid, nc_type base_typeid, const char *name, + nc_type *typeidp); + +/* Insert a named value into an enum type. The value must fit within + * the size of the enum type, the name size must be <= NC_MAX_NAME. */ +EXTERNL int +nc_insert_enum(int ncid, nc_type xtype, const char *name, + const void *value); + +/* Get information about an enum type: its name, base type and the + * number of members defined. */ +EXTERNL int +nc_inq_enum(int ncid, nc_type xtype, char *name, nc_type *base_nc_typep, + size_t *base_sizep, size_t *num_membersp); + +/* Get information about an enum member: a name and value. Name size + * will be <= NC_MAX_NAME. */ +EXTERNL int +nc_inq_enum_member(int ncid, nc_type xtype, int idx, char *name, + void *value); + + +/* Get enum name from enum value. Name size will be <= NC_MAX_NAME. */ +EXTERNL int +nc_inq_enum_ident(int ncid, nc_type xtype, long long value, char *identifier); + +/* Opaque type. */ + +/* Create an opaque type. Provide a size and a name. */ +EXTERNL int +nc_def_opaque(int ncid, size_t size, const char *name, nc_type *xtypep); + +/* Get information about an opaque type. */ +EXTERNL int +nc_inq_opaque(int ncid, nc_type xtype, char *name, size_t *sizep); + +/* Write entire var of any type. */ +EXTERNL int +nc_put_var(int ncid, int varid, const void *op); + +/* Read entire var of any type. */ +EXTERNL int +nc_get_var(int ncid, int varid, void *ip); + +/* Write one value. */ +EXTERNL int +nc_put_var1(int ncid, int varid, const size_t *indexp, + const void *op); + +/* Read one value. */ +EXTERNL int +nc_get_var1(int ncid, int varid, const size_t *indexp, void *ip); + +/* Write an array of values. */ +EXTERNL int +nc_put_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, const void *op); + +/* Read an array of values. */ +EXTERNL int +nc_get_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, void *ip); + +/* Write slices of an array of values. */ +EXTERNL int +nc_put_vars(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const void *op); + +/* Read slices of an array of values. */ +EXTERNL int +nc_get_vars(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + void *ip); + +/* Write mapped slices of an array of values. */ +EXTERNL int +nc_put_varm(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const void *op); + +/* Read mapped slices of an array of values. */ +EXTERNL int +nc_get_varm(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, void *ip); + +/* Extra netcdf-4 stuff. */ + +/* Set compression settings for a variable. Lower is faster, higher is + * better. Must be called after nc_def_var and before nc_enddef. */ +EXTERNL int +nc_def_var_deflate(int ncid, int varid, int shuffle, int deflate, + int deflate_level); + +/* Find out compression settings of a var. */ +EXTERNL int +nc_inq_var_deflate(int ncid, int varid, int *shufflep, + int *deflatep, int *deflate_levelp); + +/* Find out szip settings of a var. */ +EXTERNL int +nc_inq_var_szip(int ncid, int varid, int *options_maskp, int *pixels_per_blockp); + +/* Set fletcher32 checksum for a var. This must be done after nc_def_var + and before nc_enddef. */ +EXTERNL int +nc_def_var_fletcher32(int ncid, int varid, int fletcher32); + +/* Inquire about fletcher32 checksum for a var. */ +EXTERNL int +nc_inq_var_fletcher32(int ncid, int varid, int *fletcher32p); + +/* Define chunking for a variable. This must be done after nc_def_var + and before nc_enddef. */ +EXTERNL int +nc_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp); + +/* Inq chunking stuff for a var. */ +EXTERNL int +nc_inq_var_chunking(int ncid, int varid, int *storagep, size_t *chunksizesp); + +/* Define fill value behavior for a variable. This must be done after + nc_def_var and before nc_enddef. */ +EXTERNL int +nc_def_var_fill(int ncid, int varid, int no_fill, const void *fill_value); + +/* Inq fill value setting for a var. */ +EXTERNL int +nc_inq_var_fill(int ncid, int varid, int *no_fill, void *fill_valuep); + +/* Define the endianness of a variable. */ +EXTERNL int +nc_def_var_endian(int ncid, int varid, int endian); + +/* Learn about the endianness of a variable. */ +EXTERNL int +nc_inq_var_endian(int ncid, int varid, int *endianp); + +/* Set the fill mode (classic or 64-bit offset files only). */ +EXTERNL int +nc_set_fill(int ncid, int fillmode, int *old_modep); + +/* Set the default nc_create format to NC_FORMAT_CLASSIC, + * NC_FORMAT_64BIT, NC_FORMAT_NETCDF4, NC_FORMAT_NETCDF4_CLASSIC. */ +EXTERNL int +nc_set_default_format(int format, int *old_formatp); + +/* Set the cache size, nelems, and preemption policy. */ +EXTERNL int +nc_set_chunk_cache(size_t size, size_t nelems, float preemption); + +/* Get the cache size, nelems, and preemption policy. */ +EXTERNL int +nc_get_chunk_cache(size_t *sizep, size_t *nelemsp, float *preemptionp); + +/* Set the per-variable cache size, nelems, and preemption policy. */ +EXTERNL int +nc_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, + float preemption); + +/* Set the per-variable cache size, nelems, and preemption policy. */ +EXTERNL int +nc_get_var_chunk_cache(int ncid, int varid, size_t *sizep, size_t *nelemsp, + float *preemptionp); + +EXTERNL int +nc_redef(int ncid); + +EXTERNL int +nc__enddef(int ncid, size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align); + +EXTERNL int +nc_enddef(int ncid); + +EXTERNL int +nc_sync(int ncid); + +EXTERNL int +nc_abort(int ncid); + +EXTERNL int +nc_close(int ncid); + +EXTERNL int +nc_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp); + +EXTERNL int +nc_inq_ndims(int ncid, int *ndimsp); + +EXTERNL int +nc_inq_nvars(int ncid, int *nvarsp); + +EXTERNL int +nc_inq_natts(int ncid, int *nattsp); + +EXTERNL int +nc_inq_unlimdim(int ncid, int *unlimdimidp); + +/* The next function is for NetCDF-4 only */ +EXTERNL int +nc_inq_unlimdims(int ncid, int *nunlimdimsp, int *unlimdimidsp); + +/* Added in 3.6.1 to return format of netCDF file. */ +EXTERNL int +nc_inq_format(int ncid, int *formatp); + +/* Begin _dim */ + +EXTERNL int +nc_def_dim(int ncid, const char *name, size_t len, int *idp); + +EXTERNL int +nc_inq_dimid(int ncid, const char *name, int *idp); + +EXTERNL int +nc_inq_dim(int ncid, int dimid, char *name, size_t *lenp); + +EXTERNL int +nc_inq_dimname(int ncid, int dimid, char *name); + +EXTERNL int +nc_inq_dimlen(int ncid, int dimid, size_t *lenp); + +EXTERNL int +nc_rename_dim(int ncid, int dimid, const char *name); + +/* End _dim */ +/* Begin _att */ + +EXTERNL int +nc_inq_att(int ncid, int varid, const char *name, + nc_type *xtypep, size_t *lenp); + +EXTERNL int +nc_inq_attid(int ncid, int varid, const char *name, int *idp); + +EXTERNL int +nc_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep); + +EXTERNL int +nc_inq_attlen(int ncid, int varid, const char *name, size_t *lenp); + +EXTERNL int +nc_inq_attname(int ncid, int varid, int attnum, char *name); + +EXTERNL int +nc_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out); + +EXTERNL int +nc_rename_att(int ncid, int varid, const char *name, const char *newname); + +EXTERNL int +nc_del_att(int ncid, int varid, const char *name); + +/* End _att */ +/* Begin {put,get}_att */ + +EXTERNL int +nc_put_att_text(int ncid, int varid, const char *name, + size_t len, const char *op); + +EXTERNL int +nc_get_att_text(int ncid, int varid, const char *name, char *ip); + +EXTERNL int +nc_put_att_uchar(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned char *op); + +EXTERNL int +nc_get_att_uchar(int ncid, int varid, const char *name, unsigned char *ip); + +EXTERNL int +nc_put_att_schar(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const signed char *op); + +EXTERNL int +nc_get_att_schar(int ncid, int varid, const char *name, signed char *ip); + +EXTERNL int +nc_put_att_short(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const short *op); + +EXTERNL int +nc_get_att_short(int ncid, int varid, const char *name, short *ip); + +EXTERNL int +nc_put_att_int(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const int *op); + +EXTERNL int +nc_get_att_int(int ncid, int varid, const char *name, int *ip); + +EXTERNL int +nc_put_att_long(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const long *op); + +EXTERNL int +nc_get_att_long(int ncid, int varid, const char *name, long *ip); + +EXTERNL int +nc_put_att_float(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const float *op); + +EXTERNL int +nc_get_att_float(int ncid, int varid, const char *name, float *ip); + +EXTERNL int +nc_put_att_double(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const double *op); + +EXTERNL int +nc_get_att_double(int ncid, int varid, const char *name, double *ip); + +EXTERNL int +nc_put_att_ushort(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned short *op); + +EXTERNL int +nc_get_att_ushort(int ncid, int varid, const char *name, unsigned short *ip); + +EXTERNL int +nc_put_att_uint(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned int *op); + +EXTERNL int +nc_get_att_uint(int ncid, int varid, const char *name, unsigned int *ip); + +EXTERNL int +nc_put_att_longlong(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const long long *op); + +EXTERNL int +nc_get_att_longlong(int ncid, int varid, const char *name, long long *ip); + +EXTERNL int +nc_put_att_ulonglong(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned long long *op); + +EXTERNL int +nc_get_att_ulonglong(int ncid, int varid, const char *name, + unsigned long long *ip); + +EXTERNL int +nc_put_att_string(int ncid, int varid, const char *name, + size_t len, const char **op); + +EXTERNL int +nc_get_att_string(int ncid, int varid, const char *name, char **ip); + +/* End {put,get}_att */ +/* Begin _var */ + +EXTERNL int +nc_def_var(int ncid, const char *name, nc_type xtype, int ndims, + const int *dimidsp, int *varidp); + +EXTERNL int +nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp); + +EXTERNL int +nc_inq_varid(int ncid, const char *name, int *varidp); + +EXTERNL int +nc_inq_varname(int ncid, int varid, char *name); + +EXTERNL int +nc_inq_vartype(int ncid, int varid, nc_type *xtypep); + +EXTERNL int +nc_inq_varndims(int ncid, int varid, int *ndimsp); + +EXTERNL int +nc_inq_vardimid(int ncid, int varid, int *dimidsp); + +EXTERNL int +nc_inq_varnatts(int ncid, int varid, int *nattsp); + +EXTERNL int +nc_rename_var(int ncid, int varid, const char *name); + +EXTERNL int +nc_copy_var(int ncid_in, int varid, int ncid_out); + +#ifndef ncvarcpy +/* support the old name for now */ +#define ncvarcpy(ncid_in, varid, ncid_out) ncvarcopy((ncid_in), (varid), (ncid_out)) +#endif + +/* End _var */ +/* Begin {put,get}_var1 */ + +EXTERNL int +nc_put_var1_text(int ncid, int varid, const size_t *indexp, const char *op); + +EXTERNL int +nc_get_var1_text(int ncid, int varid, const size_t *indexp, char *ip); + +EXTERNL int +nc_put_var1_uchar(int ncid, int varid, const size_t *indexp, + const unsigned char *op); + +EXTERNL int +nc_get_var1_uchar(int ncid, int varid, const size_t *indexp, + unsigned char *ip); + +EXTERNL int +nc_put_var1_schar(int ncid, int varid, const size_t *indexp, + const signed char *op); + +EXTERNL int +nc_get_var1_schar(int ncid, int varid, const size_t *indexp, + signed char *ip); + +EXTERNL int +nc_put_var1_short(int ncid, int varid, const size_t *indexp, + const short *op); + +EXTERNL int +nc_get_var1_short(int ncid, int varid, const size_t *indexp, + short *ip); + +EXTERNL int +nc_put_var1_int(int ncid, int varid, const size_t *indexp, const int *op); + +EXTERNL int +nc_get_var1_int(int ncid, int varid, const size_t *indexp, int *ip); + +EXTERNL int +nc_put_var1_long(int ncid, int varid, const size_t *indexp, const long *op); + +EXTERNL int +nc_get_var1_long(int ncid, int varid, const size_t *indexp, long *ip); + +EXTERNL int +nc_put_var1_float(int ncid, int varid, const size_t *indexp, const float *op); + +EXTERNL int +nc_get_var1_float(int ncid, int varid, const size_t *indexp, float *ip); + +EXTERNL int +nc_put_var1_double(int ncid, int varid, const size_t *indexp, const double *op); + +EXTERNL int +nc_get_var1_double(int ncid, int varid, const size_t *indexp, double *ip); + +EXTERNL int +nc_put_var1_ushort(int ncid, int varid, const size_t *indexp, + const unsigned short *op); + +EXTERNL int +nc_get_var1_ushort(int ncid, int varid, const size_t *indexp, + unsigned short *ip); + +EXTERNL int +nc_put_var1_uint(int ncid, int varid, const size_t *indexp, + const unsigned int *op); + +EXTERNL int +nc_get_var1_uint(int ncid, int varid, const size_t *indexp, + unsigned int *ip); + +EXTERNL int +nc_put_var1_longlong(int ncid, int varid, const size_t *indexp, + const long long *op); + +EXTERNL int +nc_get_var1_longlong(int ncid, int varid, const size_t *indexp, + long long *ip); + +EXTERNL int +nc_put_var1_ulonglong(int ncid, int varid, const size_t *indexp, + const unsigned long long *op); + +EXTERNL int +nc_get_var1_ulonglong(int ncid, int varid, const size_t *indexp, + unsigned long long *ip); + +EXTERNL int +nc_put_var1_string(int ncid, int varid, const size_t *indexp, + const char **op); + +EXTERNL int +nc_get_var1_string(int ncid, int varid, const size_t *indexp, + char **ip); + +/* End {put,get}_var1 */ +/* Begin {put,get}_vara */ + +EXTERNL int +nc_put_vara_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const char *op); + +EXTERNL int +nc_get_vara_text(int ncid, int varid, const size_t *startp, + const size_t *countp, char *ip); + +EXTERNL int +nc_put_vara_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned char *op); + +EXTERNL int +nc_get_vara_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned char *ip); + +EXTERNL int +nc_put_vara_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const signed char *op); + +EXTERNL int +nc_get_vara_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, signed char *ip); + +EXTERNL int +nc_put_vara_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const short *op); + +EXTERNL int +nc_get_vara_short(int ncid, int varid, const size_t *startp, + const size_t *countp, short *ip); + +EXTERNL int +nc_put_vara_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const int *op); + +EXTERNL int +nc_get_vara_int(int ncid, int varid, const size_t *startp, + const size_t *countp, int *ip); + +EXTERNL int +nc_put_vara_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const long *op); + +EXTERNL int +nc_get_vara_long(int ncid, int varid, + const size_t *startp, const size_t *countp, long *ip); + +EXTERNL int +nc_put_vara_float(int ncid, int varid, + const size_t *startp, const size_t *countp, const float *op); + +EXTERNL int +nc_get_vara_float(int ncid, int varid, + const size_t *startp, const size_t *countp, float *ip); + +EXTERNL int +nc_put_vara_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const double *op); + +EXTERNL int +nc_get_vara_double(int ncid, int varid, const size_t *startp, + const size_t *countp, double *ip); + +EXTERNL int +nc_put_vara_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned short *op); + +EXTERNL int +nc_get_vara_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned short *ip); + +EXTERNL int +nc_put_vara_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned int *op); + +EXTERNL int +nc_get_vara_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned int *ip); + +EXTERNL int +nc_put_vara_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const long long *op); + +EXTERNL int +nc_get_vara_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, long long *ip); + +EXTERNL int +nc_put_vara_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned long long *op); + +EXTERNL int +nc_get_vara_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned long long *ip); + +EXTERNL int +nc_put_vara_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const char **op); + +EXTERNL int +nc_get_vara_string(int ncid, int varid, const size_t *startp, + const size_t *countp, char **ip); + +/* End {put,get}_vara */ +/* Begin {put,get}_vars */ + +EXTERNL int +nc_put_vars_text(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const char *op); + +EXTERNL int +nc_get_vars_text(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + char *ip); + +EXTERNL int +nc_put_vars_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const unsigned char *op); + +EXTERNL int +nc_get_vars_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + unsigned char *ip); + +EXTERNL int +nc_put_vars_schar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const signed char *op); + +EXTERNL int +nc_get_vars_schar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + signed char *ip); + +EXTERNL int +nc_put_vars_short(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const short *op); + +EXTERNL int +nc_get_vars_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + short *ip); + +EXTERNL int +nc_put_vars_int(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const int *op); + +EXTERNL int +nc_get_vars_int(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + int *ip); + +EXTERNL int +nc_put_vars_long(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const long *op); + +EXTERNL int +nc_get_vars_long(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + long *ip); + +EXTERNL int +nc_put_vars_float(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const float *op); + +EXTERNL int +nc_get_vars_float(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + float *ip); + +EXTERNL int +nc_put_vars_double(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const double *op); + +EXTERNL int +nc_get_vars_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + double *ip); + +EXTERNL int +nc_put_vars_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned short *op); + +EXTERNL int +nc_get_vars_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned short *ip); + +EXTERNL int +nc_put_vars_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned int *op); + +EXTERNL int +nc_get_vars_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned int *ip); + +EXTERNL int +nc_put_vars_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const long long *op); + +EXTERNL int +nc_get_vars_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + long long *ip); + +EXTERNL int +nc_put_vars_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned long long *op); + +EXTERNL int +nc_get_vars_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned long long *ip); + +EXTERNL int +nc_put_vars_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const char **op); + +EXTERNL int +nc_get_vars_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + char **ip); + +/* End {put,get}_vars */ +/* Begin {put,get}_varm */ + +EXTERNL int +nc_put_varm_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const char *op); + +EXTERNL int +nc_get_varm_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, char *ip); + +EXTERNL int +nc_put_varm_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const unsigned char *op); + +EXTERNL int +nc_get_varm_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, unsigned char *ip); + +EXTERNL int +nc_put_varm_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const signed char *op); + +EXTERNL int +nc_get_varm_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, signed char *ip); + +EXTERNL int +nc_put_varm_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const short *op); + +EXTERNL int +nc_get_varm_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, short *ip); + +EXTERNL int +nc_put_varm_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const int *op); + +EXTERNL int +nc_get_varm_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, int *ip); + +EXTERNL int +nc_put_varm_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const long *op); + +EXTERNL int +nc_get_varm_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, long *ip); + +EXTERNL int +nc_put_varm_float(int ncid, int varid,const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const float *op); + +EXTERNL int +nc_get_varm_float(int ncid, int varid,const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, float *ip); + +EXTERNL int +nc_put_varm_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const double *op); + +EXTERNL int +nc_get_varm_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, double *ip); + +EXTERNL int +nc_put_varm_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned short *op); + +EXTERNL int +nc_get_varm_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned short *ip); + +EXTERNL int +nc_put_varm_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned int *op); + +EXTERNL int +nc_get_varm_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned int *ip); + +EXTERNL int +nc_put_varm_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const long long *op); + +EXTERNL int +nc_get_varm_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, long long *ip); + +EXTERNL int +nc_put_varm_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned long long *op); + +EXTERNL int +nc_get_varm_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned long long *ip); + +EXTERNL int +nc_put_varm_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const char **op); + +EXTERNL int +nc_get_varm_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, char **ip); + +/* End {put,get}_varm */ +/* Begin {put,get}_var */ + +EXTERNL int +nc_put_var_text(int ncid, int varid, const char *op); + +EXTERNL int +nc_get_var_text(int ncid, int varid, char *ip); + +EXTERNL int +nc_put_var_uchar(int ncid, int varid, const unsigned char *op); + +EXTERNL int +nc_get_var_uchar(int ncid, int varid, unsigned char *ip); + +EXTERNL int +nc_put_var_schar(int ncid, int varid, const signed char *op); + +EXTERNL int +nc_get_var_schar(int ncid, int varid, signed char *ip); + +EXTERNL int +nc_put_var_short(int ncid, int varid, const short *op); + +EXTERNL int +nc_get_var_short(int ncid, int varid, short *ip); + +EXTERNL int +nc_put_var_int(int ncid, int varid, const int *op); + +EXTERNL int +nc_get_var_int(int ncid, int varid, int *ip); + +EXTERNL int +nc_put_var_long(int ncid, int varid, const long *op); + +EXTERNL int +nc_get_var_long(int ncid, int varid, long *ip); + +EXTERNL int +nc_put_var_float(int ncid, int varid, const float *op); + +EXTERNL int +nc_get_var_float(int ncid, int varid, float *ip); + +EXTERNL int +nc_put_var_double(int ncid, int varid, const double *op); + +EXTERNL int +nc_get_var_double(int ncid, int varid, double *ip); + +EXTERNL int +nc_put_var_ushort(int ncid, int varid, const unsigned short *op); + +EXTERNL int +nc_get_var_ushort(int ncid, int varid, unsigned short *ip); + +EXTERNL int +nc_put_var_uint(int ncid, int varid, const unsigned int *op); + +EXTERNL int +nc_get_var_uint(int ncid, int varid, unsigned int *ip); + +EXTERNL int +nc_put_var_longlong(int ncid, int varid, const long long *op); + +EXTERNL int +nc_get_var_longlong(int ncid, int varid, long long *ip); + +EXTERNL int +nc_put_var_ulonglong(int ncid, int varid, const unsigned long long *op); + +EXTERNL int +nc_get_var_ulonglong(int ncid, int varid, unsigned long long *ip); + +EXTERNL int +nc_put_var_string(int ncid, int varid, const char **op); + +EXTERNL int +nc_get_var_string(int ncid, int varid, char **ip); + +/* Begin Deprecated, same as functions with "_ubyte" replaced by "_uchar" */ +EXTERNL int +nc_put_att_ubyte(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned char *op); +EXTERNL int +nc_get_att_ubyte(int ncid, int varid, const char *name, + unsigned char *ip); +EXTERNL int +nc_put_var1_ubyte(int ncid, int varid, const size_t *indexp, + const unsigned char *op); +EXTERNL int +nc_get_var1_ubyte(int ncid, int varid, const size_t *indexp, + unsigned char *ip); +EXTERNL int +nc_put_vara_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned char *op); +EXTERNL int +nc_get_vara_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned char *ip); +EXTERNL int +nc_put_vars_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned char *op); +EXTERNL int +nc_get_vars_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned char *ip); +EXTERNL int +nc_put_varm_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned char *op); +EXTERNL int +nc_get_varm_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned char *ip); +EXTERNL int +nc_put_var_ubyte(int ncid, int varid, const unsigned char *op); +EXTERNL int +nc_get_var_ubyte(int ncid, int varid, unsigned char *ip); +/* End Deprecated */ + +#ifdef LOGGING + +/* Set the log level. 0 shows only errors, 1 only major messages, + * etc., to 5, which shows way too much information. */ +EXTERNL int +nc_set_log_level(int new_level); + +/* Use this to turn off logging by calling + nc_log_level(NC_TURN_OFF_LOGGING) */ +#define NC_TURN_OFF_LOGGING (-1) + +#else /* not LOGGING */ + +#define nc_set_log_level(e) + +#endif /* LOGGING */ + +/* Show the netCDF library's in-memory metadata for a file. */ +EXTERNL int +nc_show_metadata(int ncid); + +/* End {put,get}_var */ + +/* #ifdef _CRAYMPP */ +/* + * Public interfaces to better support + * CRAY multi-processor systems like T3E. + * A tip of the hat to NERSC. + */ +/* + * It turns out we need to declare and define + * these public interfaces on all platforms + * or things get ugly working out the + * FORTRAN interface. On !_CRAYMPP platforms, + * these functions work as advertised, but you + * can only use "processor element" 0. + */ + +EXTERNL int +nc__create_mp(const char *path, int cmode, size_t initialsz, int basepe, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc__open_mp(const char *path, int mode, int basepe, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc_delete(const char *path); + +EXTERNL int +nc_delete_mp(const char *path, int basepe); + +EXTERNL int +nc_set_base_pe(int ncid, int pe); + +EXTERNL int +nc_inq_base_pe(int ncid, int *pe); + +/* #endif _CRAYMPP */ + +/* This v2 function is used in the nc_test program. */ +EXTERNL int +nctypelen(nc_type datatype); + +/* Begin v2.4 backward compatiblity */ +/* + * defining NO_NETCDF_2 to the preprocessor + * turns off backward compatiblity declarations. + */ +#ifndef NO_NETCDF_2 + +/** Backward compatible alias. */ +/**@{*/ +#define FILL_BYTE NC_FILL_BYTE +#define FILL_CHAR NC_FILL_CHAR +#define FILL_SHORT NC_FILL_SHORT +#define FILL_LONG NC_FILL_INT +#define FILL_FLOAT NC_FILL_FLOAT +#define FILL_DOUBLE NC_FILL_DOUBLE + +#define MAX_NC_DIMS NC_MAX_DIMS +#define MAX_NC_ATTRS NC_MAX_ATTRS +#define MAX_NC_VARS NC_MAX_VARS +#define MAX_NC_NAME NC_MAX_NAME +#define MAX_VAR_DIMS NC_MAX_VAR_DIMS +/**@}*/ + + +/* + * Global error status + */ +EXTERNL int ncerr; + +#define NC_ENTOOL NC_EMAXNAME /* Backward compatibility */ +#define NC_EXDR (-32) /* */ +#define NC_SYSERR (-31) + +/* + * Global options variable. + * Used to determine behavior of error handler. + */ +#define NC_FATAL 1 +#define NC_VERBOSE 2 + +EXTERNL int ncopts; /* default is (NC_FATAL | NC_VERBOSE) */ + +EXTERNL void +nc_advise(const char *cdf_routine_name, int err, const char *fmt,...); + +/* + * C data type corresponding to a netCDF NC_LONG argument, + * a signed 32 bit object. + * + * This is the only thing in this file which architecture dependent. + */ +typedef int nclong; + +EXTERNL int +nccreate(const char* path, int cmode); + +EXTERNL int +ncopen(const char* path, int mode); + +EXTERNL int +ncsetfill(int ncid, int fillmode); + +EXTERNL int +ncredef(int ncid); + +EXTERNL int +ncendef(int ncid); + +EXTERNL int +ncsync(int ncid); + +EXTERNL int +ncabort(int ncid); + +EXTERNL int +ncclose(int ncid); + +EXTERNL int +ncinquire(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimp); + +EXTERNL int +ncdimdef(int ncid, const char *name, long len); + +EXTERNL int +ncdimid(int ncid, const char *name); + +EXTERNL int +ncdiminq(int ncid, int dimid, char *name, long *lenp); + +EXTERNL int +ncdimrename(int ncid, int dimid, const char *name); + +EXTERNL int +ncattput(int ncid, int varid, const char *name, nc_type xtype, + int len, const void *op); + +EXTERNL int +ncattinq(int ncid, int varid, const char *name, nc_type *xtypep, int *lenp); + +EXTERNL int +ncattget(int ncid, int varid, const char *name, void *ip); + +EXTERNL int +ncattcopy(int ncid_in, int varid_in, const char *name, int ncid_out, + int varid_out); + +EXTERNL int +ncattname(int ncid, int varid, int attnum, char *name); + +EXTERNL int +ncattrename(int ncid, int varid, const char *name, const char *newname); + +EXTERNL int +ncattdel(int ncid, int varid, const char *name); + +EXTERNL int +ncvardef(int ncid, const char *name, nc_type xtype, + int ndims, const int *dimidsp); + +EXTERNL int +ncvarid(int ncid, const char *name); + +EXTERNL int +ncvarinq(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp); + +EXTERNL int +ncvarput1(int ncid, int varid, const long *indexp, const void *op); + +EXTERNL int +ncvarget1(int ncid, int varid, const long *indexp, void *ip); + +EXTERNL int +ncvarput(int ncid, int varid, const long *startp, const long *countp, + const void *op); + +EXTERNL int +ncvarget(int ncid, int varid, const long *startp, const long *countp, + void *ip); + +EXTERNL int +ncvarputs(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, const void *op); + +EXTERNL int +ncvargets(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, void *ip); + +EXTERNL int +ncvarputg(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, const long *imapp, const void *op); + +EXTERNL int +ncvargetg(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, const long *imapp, void *ip); + +EXTERNL int +ncvarrename(int ncid, int varid, const char *name); + +EXTERNL int +ncrecinq(int ncid, int *nrecvarsp, int *recvaridsp, long *recsizesp); + +EXTERNL int +ncrecget(int ncid, long recnum, void **datap); + +EXTERNL int +ncrecput(int ncid, long recnum, void *const *datap); + +/* End v2.4 backward compatiblity */ +#endif /*!NO_NETCDF_2*/ + +#if defined(__cplusplus) +} +#endif + +/* Temporary hack to shut up warnings */ +#ifndef __MINGW32_VERSION +#define END_OF_MAIN() +#endif + +#endif /* _NETCDF_ */ + + + diff --git a/extern/src_netcdf4/netcdf_f.h b/extern/src_netcdf4/netcdf_f.h new file mode 100644 index 0000000..096dddd --- /dev/null +++ b/extern/src_netcdf4/netcdf_f.h @@ -0,0 +1,63 @@ +/* + * Copyright 1993-2011 University Corporation for Atmospheric Research/Unidata + * + * This header contains prototypes for functions only called by fortran 77. + */ +#ifndef _NETCDF_F_ +#define _NETCDF_F_ + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +EXTERNL int +nc_inq_var_chunking_ints(int ncid, int varid, int *contiguousp, int *chunksizesp); + +EXTERNL int +nc_def_var_chunking_ints(int ncid, int varid, int contiguous, int *chunksizesp); + +EXTERNL int +nc_open_par_fortran(const char *path, int mode, int comm, + int info, int *ncidp); + +EXTERNL int +nc_create_par_fortran(const char *path, int cmode, int comm, + int info, int *ncidp); + +EXTERNL int +nc_set_chunk_cache_ints(int size, int nelems, int preemption); + +EXTERNL int +nc_get_chunk_cache_ints(int *sizep, int *nelemsp, int *preemptionp); + +EXTERNL int +nc_set_var_chunk_cache_ints(int ncid, int varid, int size, int nelems, + int preemption); +EXTERNL int +nc_get_var_chunk_cache_ints(int ncid, int varid, int *sizep, + int *nelemsp, int *preemptionp); + +/* Prototypes for some extra functions in fort-lib.c. */ +EXTERNL int +nc_inq_varids_f(int ncid, int *nvars, int *fvarids); + +EXTERNL int +nc_inq_dimids_f(int ncid, int *ndims, int *fdimids, int parent); + +EXTERNL int +nc_insert_array_compound_f(int ncid, int typeid, char *name, + size_t offset, nc_type field_typeid, + int ndims, int *dim_sizesp); + +EXTERNL int +nc_inq_compound_field_f(int ncid, nc_type xtype, int fieldid, char *name, + size_t *offsetp, nc_type *field_typeidp, int *ndimsp, + int *dim_sizesp); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/extern/src_netcdf4/netcdf_par.h b/extern/src_netcdf4/netcdf_par.h new file mode 100644 index 0000000..1dd0037 --- /dev/null +++ b/extern/src_netcdf4/netcdf_par.h @@ -0,0 +1,50 @@ +/* + * Copyright 2010 University Corporation for Atmospheric + * Research/Unidata. See COPYRIGHT file for more info. + * + * This header file is for the parallel I/O functions of netCDF. + * + */ +/* "$Id: netcdf_par.h,v 1.1 2010/06/01 15:46:49 ed Exp $" */ + +#ifndef NETCDF_PAR_H +#define NETCDF_PAR_H 1 + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Use these with nc_var_par_access(). */ +#define NC_INDEPENDENT 0 +#define NC_COLLECTIVE 1 + +/* Create a file and enable parallel I/O. */ +extern int +nc_create_par(const char *path, int cmode, MPI_Comm comm, MPI_Info info, + int *ncidp); + +/* Open a file and enable parallel I/O. */ +extern int +nc_open_par(const char *path, int mode, MPI_Comm comm, MPI_Info info, + int *ncidp); + +/* Change a variable from independent (the default) to collective + * access. */ +extern int +nc_var_par_access(int ncid, int varid, int par_access); + +extern int +nc_create_par_fortran(const char *path, int cmode, int comm, + int info, int *ncidp); +extern int +nc_open_par_fortran(const char *path, int mode, int comm, + int info, int *ncidp); + +#if defined(__cplusplus) +} +#endif + +#endif /* NETCDF_PAR_H */ diff --git a/extern/src_netcdf4/oc.c b/extern/src_netcdf4/oc.c new file mode 100644 index 0000000..e8143f3 --- /dev/null +++ b/extern/src_netcdf4/oc.c @@ -0,0 +1,957 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include +#include +#include + +#include "oc.h" +#include "ocinternal.h" +#include "occontent.h" +#include "ocdebug.h" +#include "ocdump.h" +#include "oclog.h" +#include "occlientparams.h" +#include "ochttp.h" + +#undef TRACK + +/**************************************************/ + +static int ocinitialized = 0; + +/**************************************************/ +/* Track legal ids */ + +#ifdef OC_FASTCONSISTENCY + +#define ocverify(object) ((object) != NULL && (*(object) == OCMAGIC)?1:0) + +#define ocassign(object) ((OCobject)(object)) +#define ocassignall(list) + +#else /*!OC_FASTCONSISTENCY*/ + +static OClist* ocmap = NULL; + +static int +ocverify(unsigned long object) +{ + unsigned int i; + void** map = (void**)oclistcontents(ocmap); + unsigned int len = oclistlength(ocmap); +#ifdef TRACK +fprintf(stderr,"verify: %lu\n",object); fflush(stderr); +#endif + if(object > 0) { + for(i=0;iroot; + if(root == NULL) return 0; + nodes = root->tree->nodes; + nobjects = oclistlength(nodes); + return nobjects; +} + +/* Return all the OCobjects associated with a tree with specified root */ +OCobject* +oc_inq_objects(OCconnection conn, OCobject root0) +{ + unsigned int i; + OCnode* root; + OClist* nodes; + OCobject* objects = NULL; + unsigned int nobjects; + OCVERIFYX(OCnode*,root,root0,OCNULL); + OCDEREF(OCnode*,root,root0); + + if(root == NULL) return NULL; + root = root->root; + if(root == NULL) return NULL; + nodes = root->tree->nodes; + nobjects = oclistlength(nodes); + if(nodes != NULL && nobjects > 0) { + size_t len = sizeof(OCobject)*(1+nobjects); + objects = (OCobject*)ocmalloc(len); + for(i=0;iroot; + if(root == NULL) return NULL; + return root->tree->text; +} + +OCerror +oc_inq_object(OCconnection conn, + OCobject node0, + char** namep, + OCtype* objecttypep, + OCtype* primitivetypep, /* if objecttype == OC_Primitive */ + OCobject* containerp, + unsigned int* rankp, + unsigned int* subnodesp, + unsigned int* nattrp) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(namep) *namep = nulldup(node->name); + if(objecttypep) *objecttypep = node->octype; + if(primitivetypep) *primitivetypep = node->etype; + if(rankp) *rankp = node->array.rank; + if(containerp) *containerp = (OCobject)node->container; + if(subnodesp) *subnodesp = oclistlength(node->subnodes); + if(nattrp) { + if(node->octype == OC_Attribute) { + *nattrp = oclistlength(node->att.values); + } else { + *nattrp = oclistlength(node->attributes); + } + } + return OC_NOERR; +} + +/* Useful accessor functions */ +OCerror +oc_inq_name(OCconnection conn, OCobject node0, char** namep) +{ + OCstate* state; + OCnode* node; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(state == NULL || node == NULL) return OC_EINVAL; + if(namep) *namep = nulldup(node->name); + return OC_NOERR; +} + +OCerror +oc_inq_nsubnodes(OCconnection conn, OCobject node0, unsigned int* nsubnodesp) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(nsubnodesp) *nsubnodesp = oclistlength(node->subnodes); + return OC_NOERR; +} + +OCerror +oc_inq_primtype(OCconnection conn, OCobject node0, OCtype* typep) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(typep) *typep = node->etype; + return OC_NOERR; +} + +/* Alias for oc_inq_class */ +OCerror +oc_inq_type(OCconnection conn, OCobject node0, OCtype* typep) +{ + return oc_inq_class(conn,node0,typep); +} + +OCerror +oc_inq_class(OCconnection conn, OCobject node0, OCtype* typep) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(typep) *typep = node->octype; + return OC_NOERR; +} + +OCerror +oc_inq_rank(OCconnection conn, OCobject node0, unsigned int* rankp) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(rankp) *rankp = node->array.rank; + return OC_NOERR; +} + +OCerror +oc_inq_nattr(OCconnection conn, OCobject node0, unsigned int* nattrp) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(nattrp) { + if(node->octype == OC_Attribute) { + *nattrp = oclistlength(node->att.values); + } else { + *nattrp = oclistlength(node->attributes); + } + } + return OC_NOERR; +} + +OCerror +oc_inq_root(OCconnection conn, OCobject node0, OCobject* rootp) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(rootp) *rootp = (OCobject)node->root; + return OC_NOERR; +} + +OCerror +oc_inq_container(OCconnection conn, OCobject node0, OCobject* containerp) +{ + OCnode* node; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(containerp) *containerp = (OCobject)node->container; + return OC_NOERR; +} + +/* Return the subnode objects, if any, for a given object */ +/* Caller must free returned list */ +OCerror +oc_inq_subnodes(OCconnection conn, OCobject node0, OCobject** subnodesp) +{ + OCnode* node; + OCobject* subnodes = NULL; + unsigned int len; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + len = oclistlength(node->subnodes); + if(len > 0) { + unsigned int i; + subnodes = (OCobject*)occalloc(sizeof(OCobject),len+1); + for(i=0;isubnodes,i); + subnodes[i] = (OCobject)ocnode; + } + subnodes[len] = OCNULL; /* NULL terminate */ + } + if(subnodesp) *subnodesp = subnodes; + return OC_NOERR; +} + +OCerror +oc_inq_ith(OCconnection conn, + OCobject node0, unsigned int index, OCobject* subnodeidp) +{ + OCnode* node; + OCobject subnodeid = OCNULL; + unsigned int nsubnodes; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + nsubnodes = oclistlength(node->subnodes); + if(nsubnodes > 0 && index < nsubnodes) { + subnodeid = (OCobject)oclistget(node->subnodes,index); + } else + return OC_EINVAL; + if(subnodeidp) *subnodeidp = subnodeid; + return OC_NOERR; +} + +/* Return the dimension objects, if any, for a given object */ +/* Caller must free returned dimids */ +OCerror +oc_inq_dimset(OCconnection conn, OCobject node0, OCobject** dimids) +{ + OCnode* node; + OCobject* dims = NULL; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(node->array.rank > 0) { + unsigned int i; + dims = (OCobject*)occalloc(sizeof(OCobject),node->array.rank+1); + for(i=0;iarray.rank;i++) { + OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i); + dims[i] = (OCobject)dim; + } + dims[node->array.rank] = OCNULL; + } + if(dimids) *dimids = dims; + return OC_NOERR; +} + + +OCerror +oc_inq_ithdim(OCconnection conn, OCobject node0, unsigned int index, OCobject* dimidp) +{ + OCnode* node; + OCobject dimid = OCNULL; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + if(node->array.rank > 0 && index < node->array.rank) { + dimid = (OCobject)oclistget(node->array.dimensions,index); + } else + return OC_EINVAL; + if(dimidp) *dimidp = dimid; + return OC_NOERR; +} + +OCerror +oc_inq_dim(OCconnection conn, OCobject node0, size_t* sizep, char** namep) +{ + OCnode* dim; + OCVERIFY(OCnode*,dim,node0); + OCDEREF(OCnode*,dim,node0); + + if(dim->octype != OC_Dimension) return OC_EINVAL; + if(sizep) *sizep = dim->dim.declsize; + if(namep) *namep = nulldup(dim->name); + return OC_NOERR; +} + +/* Obtain info about the ith attribute attached to a given DDS node*/ + +/* This procedure returns the value as the original DAS string */ +OCerror +oc_inq_attrstrings(OCconnection conn, OCobject node0, unsigned int i, + char** namep, OCtype* octypep, + unsigned int* nvaluesp, char*** stringsp) +{ + OCnode* node; + OCattribute* attr; + unsigned int nattrs; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + nattrs = oclistlength(node->attributes); + if(i >= nattrs) return OC_EINVAL; + attr = (OCattribute*)oclistget(node->attributes,i); + if(namep) *namep = strdup(attr->name); + if(octypep) *octypep = attr->etype; + if(nvaluesp) *nvaluesp = attr->nvalues; + if(stringsp) { + if(attr->nvalues > 0) { + size_t space = attr->nvalues * sizeof(char*); + char** strings = ocmalloc(space); + for(i=0;invalues;i++) + strings[i] = nulldup(attr->values[i]); + *stringsp = strings; + } else + *stringsp = NULL; + } + return OC_NOERR; +} + +/* This procedure returns the value as the default binary value + corresponding to the string value +*/ + +OCerror +oc_inq_attr(OCconnection conn, OCobject node0, unsigned int i, + char** namep, OCtype* octypep, unsigned int* nvaluesp, void** valuesp) +{ + OCnode* node; + OCattribute* attr; + unsigned int nattrs; + OCVERIFY(OCnode*,node,node0); + OCDEREF(OCnode*,node,node0); + + nattrs = oclistlength(node->attributes); + if(i >= nattrs) return OC_EINVAL; + attr = (OCattribute*)oclistget(node->attributes,i); + if(namep) *namep = strdup(attr->name); + if(octypep) *octypep = attr->etype; + if(nvaluesp) *nvaluesp = attr->nvalues; + if(valuesp && attr->nvalues > 0) { + void* memory = NULL; + memory = oclinearize(attr->etype,attr->nvalues,attr->values); + *valuesp = memory; + } + return OC_NOERR; +} + +/* Convenience function */ +void +oc_attr_reclaim(OCtype etype, unsigned int nvalues, void* values) +{ + if(nvalues == 0 || values == NULL) return; + if(etype == OC_String || etype == OC_URL) { + unsigned int i; + char** strings = (char**)values; + for(i=0;ioctype != OC_Attribute) return OC_EINVAL; + if(nvaluesp) *nvaluesp = oclistlength(attr->att.values); + return OC_NOERR; +} + +OCerror +oc_inq_dasattr(OCconnection conn, OCobject node0, unsigned int i, + OCtype* primtypep, char** valuep) +{ + OCnode* attr; + unsigned int nvalues; + OCVERIFY(OCnode*,attr,node0); + OCDEREF(OCnode*,attr,node0); + + if(attr->octype != OC_Attribute) return OC_EINVAL; + nvalues = oclistlength(attr->att.values); + if(i >= nvalues) return OC_EINVAL; + if(valuep) *valuep = nulldup((char*)oclistget(attr->att.values,i)); + if(primtypep) *primtypep = attr->etype; + return OC_NOERR; +} + +/**************************************************/ +/* Fetch and parse a given class of DXD the server specified + at open time, and using a specified set of constraints. + Return the root node of the parsed tree of objects. +*/ +OCerror oc_fetch(OCconnection conn, const char* constraint, + OCdxd dxdkind, OCobject* rootp) +{ + return oc_fetchf(conn,constraint,dxdkind,0,rootp); +} + +OCerror oc_fetchf(OCconnection conn, const char* constraint, + OCdxd dxdkind, OCflags flags, OCobject* rootp) +{ + OCstate* state; + OCerror ocerr = OC_NOERR; + OCnode* root; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + + ocerr = ocfetchf(state,constraint,dxdkind,flags,&root); + if(ocerr) return ocerr; + + ocassignall(root->tree->nodes); + if(rootp) *rootp = (OCobject)ocassign(root); + return ocerr; +} + + +OCerror +oc_data_root(OCconnection conn, OCobject root0, OCdata content0) +{ + OCstate* state; + OCnode* root; + OCcontent* content; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCnode*,root,root0); + OCDEREF(OCnode*,root,root0); + OCVERIFY(OCcontent*,content,content0); + OCDEREF(OCcontent*,content,content0); + + if(root->tree == NULL) {OCTHROWCHK((ocerr=OC_EINVAL)); goto fail;} + ocerr = ocrootdata(state,root,content); + +fail: + return ocerr; +} + +OCdata +oc_data_new(OCconnection conn) +{ + OCstate* state; + OCVERIFYX(OCstate*,state,conn,OCNULL); + OCDEREF(OCstate*,state,conn); + + return (OCdata)ocassign(ocnewcontent(state)); +} + +OCerror +oc_data_free(OCconnection conn, OCdata content0) +{ + OCstate* state; + OCcontent* content; + if(content0 == OCNULL) return OC_NOERR; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCcontent*,content,content0); + OCDEREF(OCcontent*,content,content0); + + ocfreecontent(state,content); + return OC_NOERR; +} + +OCerror +oc_data_ith(OCconnection conn, OCdata parentdata, size_t index, OCdata subdata) +{ + OCstate* state; + OCcontent* parent; + OCcontent* child; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCcontent*,parent,parentdata); + OCDEREF(OCcontent*,parent,parentdata); + OCVERIFY(OCcontent*,child,subdata); + OCDEREF(OCcontent*,child,subdata); + ocerr = ocdataith(state,parent,index,child); + return ocerr; +} + +OCerror +oc_data_get(OCconnection conn, OCdata currentcontent, + void* memory, size_t memsize, size_t start, size_t count) +{ + OCstate* state; + OCcontent* current; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCcontent*,current,currentcontent); + OCDEREF(OCcontent*,current,currentcontent); + + ocerr = ocgetcontent(state,current,memory,memsize,start,count); + + if(ocerr == OC_EDATADDS) ocdataddsmsg(state,current->tree); + + return ocerr; +} + +OCerror +oc_data_count(OCconnection conn, OCdata content0, size_t* sizep) +{ + OCstate* state; + OCcontent* current; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCcontent*,current,content0); + OCDEREF(OCcontent*,current,content0); + ocerr = ocdatacount(state, current, sizep); + return ocerr; +} + +OCerror +oc_data_index(OCconnection conn, OCdata content0, size_t* sizep) +{ + OCcontent* current; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCcontent*,current,content0); + OCDEREF(OCcontent*,current,content0); + + if(sizep) + *sizep = (current->cache.valid ? current->cache.index : 0); + return ocerr; +} + +OCerror +oc_data_object(OCconnection conn, OCdata content0, OCobject* op) +{ + OCcontent* current; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCcontent*,current,content0); + OCDEREF(OCcontent*,current,content0); + + if(op) *op = (OCobject)current->node; + return ocerr; +} + +OCerror +oc_data_mode(OCconnection conn, OCdata content0, OCmode* modep) +{ + OCcontent* current; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCcontent*,current,content0); + OCDEREF(OCcontent*,current,content0); + + if(modep) *modep = current->mode; + return ocerr; +} + +/**************************************************/ +/* OCtype management */ +size_t oc_typesize(OCtype etype) +{ + return octypesize(etype); +} + +const char* +oc_typetostring(OCtype octype) +{ + return octypetoddsstring(octype); +} + +OCerror +oc_typeprint(OCtype etype, char* buf, size_t bufsize, void* value) +{ + return octypeprint(etype,buf,bufsize,value); +} + +/**************************************************/ +/* The oc_logXXX procedures are define in oclog.c */ + +/**************************************************/ +/* Miscellaneous */ + +const char* +oc_errstring(int err) +{ + return ocerrstring(err); +} + +/* Get clientparameters from the URL */ +const char* +oc_clientparam_get(OCconnection conn, const char* param) +{ + OCstate* state; + OCVERIFYX(OCstate*,state,conn,NULL); + OCDEREF(OCstate*,state,conn); + + return ocparamlookup(state,param); +} + +#ifdef OCIGNORE +/* Delete client parameter + return value: + OC_NOERR => defined; deletion performed + OC_EINVAL => not already defined +*/ +OCerror +oc_clientparam_delete(OCconnection conn, const char* param) +{ + OCstate* state; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + + return ocparamdelete(state->clientparams,param); +} + +/* Insert client parameter + return value: + OC_NOERR => not already define; insertion performed + OC_EINVAL => already defined +*/ +OCerror +oc_clientparam_insert(OCconnection conn, const char* param, const char* value) +{ + OCstate* state; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + + state->clientparams = dapparaminsert(state->clientparams,param,value); + return OC_NOERR; +} + +/* Replace client parameter + return value: + OC_NOERR => already define; replacement performed + OC_EINVAL => not already defined +*/ +OCerror +oc_clientparam_replace(OCconnection conn, const char* param, const char* value) +{ + OCstate* state; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + + return dapparamreplace(state->clientparams,param,value); +} +#endif + +OCerror +oc_dd(OCconnection conn, OCobject root0, int level) +{ + OCstate* state; + OCnode* root; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCnode*,root,root0); + OCDEREF(OCnode*,root,root0); + + ocdd(state,root,1,level); + return OC_NOERR; +} + +OCerror +oc_ddnode(OCconnection conn, OCobject root0) +{ + OCnode* root; + OCVERIFY(OCnode*,root,root0); + OCDEREF(OCnode*,root,root0); + + ocdumpnode(root); + return OC_NOERR; +} + +/* Merge a specified DAS into a specified DDS or DATADDS */ +OCerror +oc_attach_das(OCconnection conn, OCobject dasroot, OCobject ddsroot) +{ + OCstate* state; + OCnode* das; + OCnode* dds; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCnode*,das,dasroot); + OCDEREF(OCnode*,das,dasroot); + OCVERIFY(OCnode*,dds,ddsroot); + OCDEREF(OCnode*,dds,ddsroot); + + return ocddsdasmerge(state,das,dds); +} + +#if 0 +/* +I suppressed this operation because I realized that it +appears to be impossible to implement correctly in general. +It also exposes a flaw in the protocol. +If I have a dds with two identical Grids, G1 and G2, +and I ask for the projection ?G1.temp,G2.temp, +then I get back a DATADDS with duplicated temp fields, +which means the DATADDS is illegal. The problem is that +the protocol throws away important scoping information +about the fact that each temp field is part of a different +grid. +*/ +/* Connect a specified DATADDS tree to a specified DDS tree */ +OCerror +oc_attach_datadds(OCconnection conn, OCobject dataddsroot, OCobject ddsroot) +{ + OCstate* state; + OCnode* dxd; + OCnode* dds; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCnode*,dxd,dataddsroot); + OCDEREF(OCnode*,dxd,dataddsroot); + OCVERIFY(OCnode*,dds,ddsroot); + OCDEREF(OCnode*,dds,ddsroot); + + /* get the true roots */ + dds = dds->root; + dxd = dxd->root; + if(dds == NULL || dxd == NULL) return OC_EBADID; + /* correlate the DATADDS to the DDS */ + return occorrelate(dxd,dds); +} + +/* Return the attached DATADDS object for a given DDS object */ +OCerror oc_inq_datadds(OCconnection conn, OCobject dds0, OCobject* dataddsp) +{ + OCstate* state; + OCnode* dds; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + OCVERIFY(OCnode*,dds,dds0); + OCDEREF(OCnode*,dds,dds0); + + if(dataddsp) *dataddsp = (OCobject)dds->datadds; + return OC_NOERR; +} +#endif + +/**************************************************/ + +OCerror +oc_svcerrordata(OCconnection conn, char** codep, + char** msgp, long* httpp) +{ + OCstate* state; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + return ocsvcerrordata(state,codep,msgp,httpp); +} + + +/**************************************************/ +/* Experimental: this is useful for the netcdf + DRNO project. +*/ + +/* New 10/31/2009: return the size (in bytes) + of the fetched datadds. +*/ + +OCerror +oc_raw_xdrsize(OCconnection conn, OCobject root0, size_t* sizep) +{ + OCnode* root; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCnode*,root,root0); + OCDEREF(OCnode*,root,root0); + + if(sizep == NULL) goto done; + if(root->tree == NULL || root->tree->dxdclass != OCDATADDS) + {OCTHROWCHK((ocerr=OC_EINVAL)); goto done;} + if(sizep) *sizep = root->tree->data.datasize; + +done: + return ocerr; +} + +/* Resend a url as a head request to check the Last-Modified time */ +OCerror +oc_update_lastmodified_data(OCconnection conn) +{ + OCstate* state; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + return ocupdatelastmodifieddata(state); +} + +long +oc_get_lastmodified_data(OCconnection conn) +{ + OCstate* state; + OCVERIFY(OCstate*,state,conn); + OCDEREF(OCstate*,state,conn); + return state->datalastmodified; +} + +int +oc_dumpnode(OCconnection conn, OCobject root0) +{ + OCnode* root; + OCerror ocerr = OC_NOERR; + OCVERIFY(OCnode*,root,root0); + OCDEREF(OCnode*,root,root0); + ocdumpnode(root); + return ocerr; +} + +OCerror +oc_ping(const char* url) +{ + return ocping(url); +} + diff --git a/extern/src_netcdf4/oc.h b/extern/src_netcdf4/oc.h new file mode 100644 index 0000000..8f91a63 --- /dev/null +++ b/extern/src_netcdf4/oc.h @@ -0,0 +1,443 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT dap for more information. */ + +/* +Draft OC External Interface +Created: 4/4/2009 +Last Revised: 4/14/2009 +*/ + +#ifndef OC_H +#define OC_H + +#include +#include + +/* if defined, use magic numbers for consistency]) */ +#define OC_FASTCONSISTENCY + +/* OC_MAX_DIMS should be greater or equal to max allowed by dap or netcdf*/ +#define OC_MAX_DIMS 1024 + +/* Specifies the OCtype.*/ +/* Primitives = Duplicate of the NODE_Byte..Node_URL union nc_type*/ + +typedef unsigned long OCtype; + +/* Note: use #define rather than enum so we can extend if needed + more easily */ +/* Primitives*/ +/* OC_Ubyte, OC_Char, OC_Int64 and OC_UInt64 are defined for future extension*/ +#define OC_NAT ((OCtype)0) +#define OC_Char ((OCtype)1) +#define OC_Byte ((OCtype)2) +#define OC_UByte ((OCtype)3) +#define OC_Int16 ((OCtype)4) +#define OC_UInt16 ((OCtype)5) +#define OC_Int32 ((OCtype)6) +#define OC_UInt32 ((OCtype)7) +#define OC_Int64 ((OCtype)8) +#define OC_UInt64 ((OCtype)9) +#define OC_Float32 ((OCtype)10) +#define OC_Float64 ((OCtype)11) +#define OC_String ((OCtype)12) +#define OC_URL ((OCtype)13) + +/* Non-primitives*/ +#define OC_Dataset ((OCtype)100) +#define OC_Sequence ((OCtype)101) +#define OC_Grid ((OCtype)102) +#define OC_Structure ((OCtype)103) +#define OC_Dimension ((OCtype)104) +#define OC_Attribute ((OCtype)105) +#define OC_Attributeset ((OCtype)106) +#define OC_Primitive ((OCtype)107) +#define OC_Group ((OCtype)108) +#define OC_Type ((OCtype)109) + +/* Define a set of error + positive are system errors + (needs work) +*/ + +typedef int OCerror; +#define OC_NOERR (0) +#define OC_EBADID (-1) +#define OC_ECHAR (-2) +#define OC_EDIMSIZE (-3) +#define OC_EEDGE (-4) +#define OC_EINVAL (-5) +#define OC_EINVALCOORDS (-6) +#define OC_ENOMEM (-7) +#define OC_ENOTVAR (-8) +#define OC_EPERM (-9) +#define OC_ESTRIDE (-10) +#define OC_EDAP (-11) +#define OC_EXDR (-12) +#define OC_ECURL (-13) +#define OC_EBADURL (-14) +#define OC_EBADVAR (-15) +#define OC_EOPEN (-16) +#define OC_EIO (-17) +#define OC_ENODATA (-18) +#define OC_EDAPSVC (-19) +#define OC_ENAMEINUSE (-20) +#define OC_EDAS (-21) +#define OC_EDDS (-22) +#define OC_EDATADDS (-23) +#define OC_ERCFILE (-24) +#define OC_ENOFILE (-25) + +/* Define the classes of DAP DXD objects */ +typedef int OCdxd; +#define OCDDS 0 +#define OCDAS 1 +#define OCDATADDS 2 +#define OCDATA OCDATADDS + +/* Define flags */ +typedef int OCflags; +#define OCONDISK 1 + +typedef enum OCmode { +OCNULLMODE = 0, +OCFIELDMODE = 1, +OCSEQUENCEMODE = 2, +OCARRAYMODE = 3, +OCPRIMITIVEMODE = 4, +OCEMPTYMODE = 0x8000000 /* internal use only */ +} OCmode; + + +/* Define an unsigned alternative to off(64)_t*/ +typedef unsigned long long ocoffset_t; + +/* Define a wrapper for dimension sizes */ +typedef size_t ocindex_t; + +/* Define the effective API */ + +#ifndef OCINTERNAL_H + +/* The OCobject type references a component of a DAS or DDS + (e.g. Sequence, Grid, Dataset, etc). These objects + are nested, so most objects reference a container object + and subnode objects. +*/ + + +#ifdef OC_FASTCONSISTENCY +/* Use unsigned int * so we can dereference to get magic number */ +typedef unsigned int* OCobject; +#define OCNULL NULL +#else +typedef unsigned long OCobject; +#define OCNULL ((OCobject)0) +#endif + +/* These are the two critical types*/ +/* Think of OClink as analogous to the C stdio FILE structure; + it "holds" all the other state info about + a connection to the server, the url request, and the DAS/DDS/DATADDSinfo. +*/ +/* Renamed from OCconnection because of confusion about term "connection" + 3/24/2010 by dmh +*/ +typedef OCobject OClink; + +/* Keep old name for back compatibility */ +typedef OClink OCconnection; /*Deprecated*/ + +/* Tag kind of log entry*/ +#define OCLOGNOTE 0 +#define OCLOGWARN 1 +#define OCLOGERR 2 +#define OCLOGDBG 3 + +/**************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int oc_dumpnode(OClink conn, OCobject root0); + +/**************************************************/ +/* Link management */ + +extern OCerror oc_open(const char* url, OClink*); +extern OCerror oc_close(OClink); + +/**************************************************/ +/* Root management */ +/* Fetch and parse a given class of DXD the server specified + at open time, and using a specified set of constraints + and flags. + Return the root node of the parsed tree of objects. +*/ +extern OCerror oc_fetchf(OClink, + const char* constraints, + OCdxd, + OCflags, + OCobject* rootp); + + +/* + Equivalent to oc_fetchf with zero flag parameter +*/ +extern OCerror oc_fetch(OClink, + const char* constraints, + OCdxd, + OCobject* rootp); + +/* Release/reclaim the tree of objects associated with a given root */ +extern OCerror oc_root_free(OClink, OCobject root); + +/* Return the # of OCobjects associated with a tree with specified root */ +extern unsigned int oc_inq_nobjects(OClink, OCobject root); + +/* Return all the OCobjects associated with a tree with specified root */ +extern OCobject* oc_inq_objects(OClink, OCobject root); + +/* Return the text of the DDS or DAS as received from the server */ +extern const char* oc_inq_text(OClink, OCobject root); + +/**************************************************/ +/* Object Management */ + +/* Any of the pointers may be NULL in the following procedure call; + If the object is of type Dataset, then return # of global attributes + If the object is of type Attribute, then return the # of values in nattrp. + The caller must free the resulting name string. +*/ +extern OCerror oc_inq_object(OClink, OCobject, + char** namep, + OCtype* typep, + OCtype* primitivetypep, /* if objecttype == OC_Primitive */ + OCobject* parentp, + unsigned int* rankp, + unsigned int* nsubnodesp, + unsigned int* nattrp); + +/* Also define some more individual accessors */ + +extern OCerror oc_inq_name(OClink,OCobject,char**); +extern OCerror oc_inq_class(OClink,OCobject,OCtype*); +extern OCerror oc_inq_type(OClink,OCobject,OCtype*); /*alias for oc_inq_class*/ +extern OCerror oc_inq_primtype(OClink,OCobject,OCtype*); +extern OCerror oc_inq_nsubnodes(OClink,OCobject,unsigned int*); +extern OCerror oc_inq_rank(OClink,OCobject,unsigned int*); +extern OCerror oc_inq_nattr(OClink,OCobject,unsigned int*); +extern OCerror oc_inq_root(OClink,OCobject,OCobject*); +extern OCerror oc_inq_container(OClink,OCobject,OCobject*); + +/* Return the subnode objects, if any, associated with a given object. +Caller must free the returned subnodes memory. +*/ +extern OCerror oc_inq_subnodes(OClink,OCobject,OCobject** subnodes); + +/* Return the i'th subnode object, if any, associated with a given object */ +/* If there is none such, then return OC_EINVAL */ +extern OCerror oc_inq_ith(OClink,OCobject, unsigned int, OCobject*); + +/* Return the dimension objects, if any, associated with a given object */ +/* Caller must free returned vector for dimids */ +/* If there are no dimensions (i.e. rank == 0), then return NULL */ +extern OCerror oc_inq_dimset(OClink,OCobject, OCobject** dimids); + +/* Return the i'th dim object, if any, associated with a given object */ +/* If there is no such dim, then return OC_EINVAL */ +extern OCerror oc_inq_ithdim(OClink,OCobject, unsigned int, OCobject*); + +/* Return the size and name associated with a given dimension object + as defined in the DDS +*/ +extern OCerror oc_inq_dim(OClink,OCobject,ocindex_t*,char**); + +/* Attribute Management */ + +/* Added: 11/2/2009 DMH: + Provide access to DDS node attributes + in the form of the original underlying + DAS string. + One specifies the DDS root to get the global attributes. + Caller must free returned strings. +*/ + +extern OCerror oc_inq_attrstrings(OClink,OCobject, unsigned int i, + char** name, OCtype* octype, + unsigned int* nvalues,char*** stringvalues); + +/* Obtain the attributes associated with a given DDS OCobject. + One specifies the DDS root to get the global attributes + This code takes the DAS strings and does a default + conversion to binary values. +*/ +extern OCerror oc_inq_attr(OClink,OCobject, unsigned int i, + char** name,OCtype* octype, + unsigned int* nvalues,void** values); + +/* Convenience function to simplify reclaiming the allocated attribute + value memory +*/ +extern void oc_attr_reclaim(OCtype, unsigned int nvalues, void* values); + +/* Access ith value string of a DAS object. + OCtype of the object is assumed to be OC_Attribute. + Note that this is different than the above inq_attr + and inq_attrstrings, which work on DDS + objects. Note also that the return value is always a string. + Caller must free returned string. +*/ + +extern OCerror oc_inq_dasattr_nvalues(OClink, OCobject, + unsigned int* nvaluesp); + +extern OCerror oc_inq_dasattr(OClink,OCobject, unsigned int, + OCtype* primtypep, char** valuep); + +/**************************************************/ +/* Data management */ + +/* +These procedures allow for the location and extraction +of data from the data packet part of a DATADDS. +See ocuserman.html for detailed description. +*/ + +typedef OCobject OCdata; + +/* Obtain the OCdata object that references the + whole data from a DATADDS fetch request specified + by the root object. This does not access the server. +*/ +extern OCerror oc_data_root(OClink, OCobject root, OCdata); + +/* Create an empty OCdata object */ +extern OCdata oc_data_new(OClink); + +/* Reclaim a no longer needed OCdata object */ +extern OCerror oc_data_free(OClink, OCdata); + +/* Given an OCdata object, set the nested subnode OCdata object + to refer to the data associated with the i'th element of + the parent data object. NOTE: if the i'th element is not + present then this function will return OC_ENODATA. + See the user's manual for details on mapping multi- + dimensional arrays to single indices. +*/ +extern OCerror oc_data_ith(OClink, + OCdata parentdata, + ocindex_t index, + OCdata subdata); + +/* Return the actual data values associated with the specified OCdata. + The OCdata is assumed to be referencing either a scalar + primitive value or a (1d) array of primitive values. + If scalar, then index must be 0 and count must be 1. +*/ +extern OCerror oc_data_get(OClink,OCdata, + void* memory, size_t memsize, + ocindex_t index, ocindex_t count); + +/* Return the OCdata's current index */ +extern OCerror oc_data_index(OClink,OCdata, ocindex_t*); + +/* Return the mode associated the specified OCdata object */ +extern OCerror oc_data_mode(OClink,OCdata, OCmode*); + +/* Return the OCobject associated the specified OCdata object */ +extern OCerror oc_data_object(OClink,OCdata, OCobject*); + +/* Compute the the count associated with the specified OCdata + instance. Note: this is potentially computationally costly + when computing # records. +*/ +extern OCerror oc_data_count(OClink, OCdata, ocindex_t*); + +/**************************************************/ +/* Misc. OCtype-related functions */ + +/* Return size of the given type (Primitive only) */ +extern size_t oc_typesize(OCtype); + +/* Return a canonical printable string describing a given type: + e.g. Byte, Int16, etc. +*/ +extern const char* oc_typetostring(OCtype); + +/* Given a value of a primitive OC type, provide a canonical + string representing that value +*/ +extern OCerror oc_typeprint(OCtype, char* buf, size_t bufsize, void* value); + +/**************************************************/ +/* Logging */ + +extern void oc_loginit(void); +extern void oc_setlogging(int onoff); /* 1=>start logging 0=>stop */ +extern void oc_logopen(const char* logfilename); +extern void oc_logclose(void); + +extern void oc_logtext(int tag, const char* text); + +extern void oc_log(int tag, const char* fmt, ...); + +/**************************************************/ +/* Miscellaneous */ + +/* Convert an OCerror to a human readable string */ +extern const char* oc_errstring(int err); + +/* Get client parameters from the URL + DO NOT free the result +*/ +extern const char* oc_clientparam_get(OClink, const char* param); + +extern OCerror oc_clientparam_delete(OClink, const char* param); +extern OCerror oc_clientparam_insert(OClink, const char* param, const char* value); +extern OCerror oc_clientparam_replace(OClink, const char* param, const char* value); + +/**************************************************/ +/* Merging operations */ + +/* Merge a specified DAS into a specified DDS or DATADDS */ +extern OCerror oc_attach_das(OClink, OCobject dasroot, OCobject ddsroot); + +/**************************************************/ +/* Debugging */ +extern OCerror oc_dd(OClink,OCobject,int level); +extern OCerror oc_ddnode(OClink,OCobject); + +/* When a server error is detected, then it is possible + to get the server error info using this procedure */ +extern OCerror oc_svcerrordata(OClink link, char** codep, + char** msgp, long* httpp); + + + +/**************************************************/ +/* Experimental */ + +/* New 10/31/2009: return raw information about a datadds +*/ + +extern OCerror oc_raw_xdrsize(OClink, OCobject, size_t*); + +/* Resend a url as a head request to check the Last-Modified time */ +extern OCerror oc_update_lastmodified_data(OClink); + +/* Get last known modification time; -1 => data unknown */ +extern long oc_get_lastmodified_data(OClink); + +extern OCerror oc_ping(const char* url); + +/**************************************************/ + +#endif /*OCINTERNAL_H*/ + +#ifdef __cplusplus +} +#endif + +#endif /*OC_H*/ diff --git a/extern/src_netcdf4/ocbytes.c b/extern/src_netcdf4/ocbytes.c new file mode 100644 index 0000000..7fe2f79 --- /dev/null +++ b/extern/src_netcdf4/ocbytes.c @@ -0,0 +1,190 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" + +#include +#include +#include + +#include "ocbytes.h" + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define DEFAULTALLOC 1024 +#define ALLOCINCR 1024 + +static int ocbytesdebug = 1; + +static long +ocbytesfail(void) +{ + fflush(stdout); + fprintf(stderr,"bytebuffer failure\n"); + fflush(stderr); + if(ocbytesdebug) abort(); + return FALSE; +} + +OCbytes* +ocbytesnew(void) +{ + OCbytes* bb = (OCbytes*)malloc(sizeof(OCbytes)); + if(bb == NULL) return (OCbytes*)ocbytesfail(); + bb->alloc=0; + bb->length=0; + bb->content=NULL; + bb->nonextendible = 0; + return bb; +} + +int +ocbytessetalloc(OCbytes* bb, unsigned int sz) +{ + char* newcontent; + if(bb == NULL) return ocbytesfail(); + if(sz <= 0) {sz = (bb->alloc?2*bb->alloc:DEFAULTALLOC);} + if(bb->alloc >= sz) return TRUE; + if(bb->nonextendible) return ocbytesfail(); + newcontent=(char*)calloc(sz,sizeof(char)); + if(newcontent == NULL) return FALSE; + if(bb->alloc > 0 && bb->length > 0 && bb->content != NULL) { + memcpy((void*)newcontent,(void*)bb->content,sizeof(char)*bb->length); + } + if(bb->content != NULL) free(bb->content); + bb->content=newcontent; + bb->alloc=sz; + return TRUE; +} + +void +ocbytesfree(OCbytes* bb) +{ + if(bb == NULL) return; + if(!bb->nonextendible && bb->content != NULL) free(bb->content); + free(bb); +} + +int +ocbytessetlength(OCbytes* bb, unsigned int sz) +{ + if(bb == NULL) return ocbytesfail(); + if(sz > bb->alloc) {if(!ocbytessetalloc(bb,sz)) return ocbytesfail();} + bb->length = sz; + return TRUE; +} + +int +ocbytesfill(OCbytes* bb, char fill) +{ + unsigned int i; + if(bb == NULL) return ocbytesfail(); + for(i=0;ilength;i++) bb->content[i] = fill; + return TRUE; +} + +int +ocbytesget(OCbytes* bb, unsigned int index) +{ + if(bb == NULL) return -1; + if(index >= bb->length) return -1; + return bb->content[index]; +} + +int +ocbytesset(OCbytes* bb, unsigned int index, char elem) +{ + if(bb == NULL) return ocbytesfail(); + if(index >= bb->length) return ocbytesfail(); + bb->content[index] = elem; + return TRUE; +} + +int +ocbytesappend(OCbytes* bb, char elem) +{ + if(bb == NULL) return ocbytesfail(); + /* We need space for the char + null */ + while(bb->length+1 >= bb->alloc) { + if(!ocbytessetalloc(bb,0)) return ocbytesfail(); + } + bb->content[bb->length] = elem; + bb->length++; + bb->content[bb->length] = '\0'; + return TRUE; +} + +/* This assumes s is a null terminated string*/ +int +ocbytescat(OCbytes* bb, char* s) +{ + ocbytesappendn(bb,(void*)s,strlen(s)+1); /* include trailing null*/ + /* back up over the trailing null*/ + if(bb->length == 0) return ocbytesfail(); + bb->length--; + return 1; +} + +int +ocbytesappendn(OCbytes* bb, void* elem, unsigned int n) +{ + if(bb == NULL || elem == NULL) return ocbytesfail(); + if(n == 0) {n = strlen((char*)elem);} + while(!ocbytesavail(bb,n+1)) { + if(!ocbytessetalloc(bb,0)) return ocbytesfail(); + } + memcpy((void*)&bb->content[bb->length],(void*)elem,n); + bb->length += n; + bb->content[bb->length] = '\0'; + return TRUE; +} + +int +ocbytesprepend(OCbytes* bb, char elem) +{ + int i; /* do not make unsigned */ + if(bb == NULL) return ocbytesfail(); + if(bb->length >= bb->alloc) if(!ocbytessetalloc(bb,0)) return ocbytesfail(); + /* could we trust memcpy? instead */ + for(i=bb->alloc;i>=1;i--) {bb->content[i]=bb->content[i-1];} + bb->content[0] = elem; + bb->length++; + return TRUE; +} + +char* +ocbytesdup(OCbytes* bb) +{ + char* result = (char*)malloc(bb->length+1); + memcpy((void*)result,(const void*)bb->content,bb->length); + result[bb->length] = '\0'; /* just in case it is a string*/ + return result; +} + +char* +ocbytesextract(OCbytes* bb) +{ + char* result = bb->content; + bb->alloc = 0; + bb->length = 0; + bb->content = NULL; + return result; +} + +int +ocbytessetcontents(OCbytes* bb, char* contents, unsigned int alloc) +{ + if(bb == NULL) return ocbytesfail(); + ocbytesclear(bb); + if(!bb->nonextendible && bb->content != NULL) free(bb->content); + bb->content = contents; + bb->length = 0; + bb->alloc = alloc; + bb->nonextendible = 1; + return 1; +} diff --git a/extern/src_netcdf4/ocbytes.h b/extern/src_netcdf4/ocbytes.h new file mode 100644 index 0000000..447e0e7 --- /dev/null +++ b/extern/src_netcdf4/ocbytes.h @@ -0,0 +1,54 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCBYTES_H +#define OCBYTES_H 1 + +typedef struct OCbytes { + int nonextendible; /* 1 => fail if an attempt is made to extend this buffer*/ + unsigned int alloc; + unsigned int length; + char* content; +} OCbytes; + +#if defined(_CPLUSPLUS_) || defined(__CPLUSPLUS__) || defined(__CPLUSPLUS) +#define EXTERNC extern "C" +#else +#define EXTERNC extern +#endif + +EXTERNC OCbytes* ocbytesnew(void); +EXTERNC void ocbytesfree(OCbytes*); +EXTERNC int ocbytessetalloc(OCbytes*,unsigned int); +EXTERNC int ocbytessetlength(OCbytes*,unsigned int); +EXTERNC int ocbytesfill(OCbytes*, char fill); + +/* Produce a duplicate of the contents*/ +EXTERNC char* ocbytesdup(OCbytes*); +/* Extract the contents and leave buffer empty */ +EXTERNC char* ocbytesextract(OCbytes*); + +/* Return the ith byte; -1 if no such index */ +EXTERNC int ocbytesget(OCbytes*,unsigned int); +/* Set the ith byte */ +EXTERNC int ocbytesset(OCbytes*,unsigned int,char); + +/* Append one byte */ +EXTERNC int ocbytesappend(OCbytes*,char); /* Add at Tail */ +/* Append n bytes */ +EXTERNC int ocbytesappendn(OCbytes*,void*,unsigned int); /* Add at Tail */ + +/* Concatenate a null-terminated string to the end of the buffer */ +EXTERNC int ocbytescat(OCbytes*,char*); +/* Set the contents of the buffer; mark the buffer as non-extendible */ +EXTERNC int ocbytessetcontents(OCbytes*, char*, unsigned int); + +/* Following are always "in-lined"*/ +#define ocbyteslength(bb) ((bb)?(bb)->length:0U) +#define ocbytesalloc(bb) ((bb)?(bb)->alloc:0U) +#define ocbytescontents(bb) ((bb && bb->content)?(bb)->content:(char*)"") +#define ocbytesextend(bb,len) ocbytessetalloc((bb),(len)+(bb->alloc)) +#define ocbytesclear(bb) ((bb)?(bb)->length=0:0U) +#define ocbytesavail(bb,n) ((bb)?((bb)->alloc - (bb)->length) >= (n):0U) + +#endif /*OCBYTES_H*/ diff --git a/extern/src_netcdf4/occlientparams.c b/extern/src_netcdf4/occlientparams.c new file mode 100644 index 0000000..c9c9ca2 --- /dev/null +++ b/extern/src_netcdf4/occlientparams.c @@ -0,0 +1,128 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include "ocinternal.h" +#include "ocdebug.h" + +#define LBRACKET '[' +#define RBRACKET ']' + + + +/* +Client parameters are assumed to be +one or more instances of bracketed pairs: +e.g "[...][...]...". +The bracket content in turn is assumed to be a +comma separated list of = pairs. +e.g. x=y,z=,a=b. +If the same parameter is specifed more than once, +then the first occurrence is used; this is so that +is possible to forcibly override user specified +parameters by prefixing. +IMPORTANT: client parameter string is assumed to +have blanks compress out. +*/ + +int +ocparamdecode(OCstate* state) +{ + int i; + i = ocuridecodeparams(state->uri); + return i?OC_NOERR:OC_EBADURL; +} + + +const char* +ocparamlookup(OCstate* state, const char* key) +{ + if(state == NULL || key == NULL || state->uri == NULL) return NULL; + return ocurilookup(state->uri,key); +} + +int +ocparamset(OCstate* state, const char* params) +{ + int i; + i = ocurisetparams(state->uri,params); + return i?OC_NOERR:OC_EBADURL; +} + +#ifdef OCIGNORE +void +ocparamfree(OClist* params) +{ + int i; + if(params == NULL) return; + for(i=0;i found and deleted; + 0 => param not found +*/ +int +ocparamdelete(OClist* params, const char* clientparam) +{ + int i,found = 0; + if(params == NULL || clientparam == NULL) return 0; + for(i=0;i not already defined + 0 => param already defined (no change) +*/ +int +ocparaminsert(OClist* params, const char* clientparam, const char* value) +{ + int i; + if(params == NULL || clientparam == NULL) return 0; + for(i=0;i replacement performed + 0 => insertion performed +*/ +int +ocparamreplace(OClist* params, const char* clientparam, const char* value) +{ + int i; + if(params == NULL || clientparam == NULL) return 0; + for(i=0;i> */ +} OCpath; + +/*! Specifies a ProjectionClause. */ +typedef struct OCprojectionclause { + char* target; /* "variable name" as mentioned in the projection */ + OClist* indexsets; /* oclist> */ + struct OCnode* node; /* node with name matching target, if any. */ + int gridconstraint; /* used only for testing purposes */ +} OCprojectionclause; + +/*! Selection is the node type for selection expression trees */ +typedef struct OCselectionclause { + int op; + char* value; + struct OCselectionclause* lhs; + OClist* rhs; +} OCselectionclause; + + +#endif /*CONSTRAINTS_H*/ diff --git a/extern/src_netcdf4/occontent.c b/extern/src_netcdf4/occontent.c new file mode 100644 index 0000000..8da0892 --- /dev/null +++ b/extern/src_netcdf4/occontent.c @@ -0,0 +1,1174 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include "ocinternal.h" +#include "occontent.h" +#include "ocdebug.h" + +/* Mnemonic*/ +#define ISPACKED 1 + +/* Define the skipstate flags */ +#ifdef OCDEBUG +typedef enum Skipstate { +SKIPFIELDS = 1, /* skip instance without leading tag or arraycount */ +SKIPINSTANCE = 2, /*skip leading sequence tag or array counts */ +SKIPWHOLE = 4 /* skip complete object */ +} Skipstate; +#else +#define SKIPFIELDS 1 /* skip instance without leading tag or arraycount */ +#define SKIPINSTANCE 2 /*skip leading sequence tag or array counts */ +#define SKIPWHOLE 4 /* skip complete object */ +#endif + +/* Forward*/ +static OCmode modetransition(OCnode*,OCmode); +static int ocgetsequencetag(XXDR* xdrs); +static int ocskipcounts(XXDR* xdrs, OCnode*, off_t expected); + +static int ocarrayith(OCstate*, OCcontent*, OCcontent*, size_t); +static int ocsequenceith(OCstate*, OCcontent*, OCcontent*, size_t); +static int ocfieldith(OCstate*, OCcontent*, OCcontent*, size_t); + +static size_t ocarraycount(OCstate*, struct OCcontent*); +static size_t ocsequencecount(OCstate*, struct OCcontent*); +static size_t ocfieldcount(OCstate*, struct OCcontent*); +static size_t ocprimcount(OCstate*, struct OCcontent*); + +static OCcontent* occlearcontent(struct OCstate* state, OCcontent* content); + + +#ifdef OCDEBUG +static void +report(size_t memsize, char* memory) +{ +#ifdef OCIGNORE + switch(memsize) { + case 1: + oc_log(LOGNOTE,"reading xdr: %lu bytes = |%2x|",(unsigned long)memsize,memory[0]); + break; + case 4: + oc_log(LOGNOTE,"reading xdr: %lu bytes = |%4lu|",(unsigned long)memsize,*(unsigned int*)memory); + break; + case 8: + oc_log(LOGNOTE,"reading xdr: %lu bytes = |%8lu|",(unsigned long)memsize,*(unsigned long long*)memory); + break; + default: + oc_log(LOGNOTE,"reading xdr: %lu bytes",(unsigned long)memsize); + break; + } + oc_log(LOGNOTE,"reading xdr: %lu bytes",(unsigned long)memsize); +#endif +} + +static char* +modestring(OCmode mode) +{ + switch(mode) { + case OCFIELDMODE: return "FIELD"; + case OCSEQUENCEMODE: return "SEQUENCE"; + case OCARRAYMODE: return "ARRAY"; + case OCPRIMITIVEMODE: return "PRIMITIVE"; + case OCNULLMODE: return "NULL"; + case OCEMPTYMODE: return "EMPTY"; + } + return "?"; +} + +void +octrace1(char* proc, OCstate* state, OCcontent* content, int start, int count) +{ + unsigned long pos = xxdr_getpos(content->tree->data.xdrs); + fprintf(stderr,"trace: %s mode=%s node=%s (%s)", + proc,modestring(content->mode),content->node->fullname, + octypetostring(content->node->octype)); + if(content->packed) + fprintf(stderr," packed=%d",content->packed); + if(count >= 0) + fprintf(stderr," start=%lu count=%lu", + (unsigned long)start,(unsigned long)count); + else + fprintf(stderr," index=%lu",(unsigned long)start); + fprintf(stderr," xdrs.pos=%lu",pos); + fprintf(stderr,"\n"); + if(content->cache.valid) { + fprintf(stderr,"\tcache{index=%lu maxindex=%lu offset=%lu}\n", + (unsigned long)content->cache.index, + (unsigned long)content->cache.maxindex, + (unsigned long)content->cache.offset); + } + fflush(stderr); +} + +void +octrace(char* proc, OCstate* state, OCcontent* content, int index) +{ + octrace1(proc,state,content,index,-1); +} + + +#else +#define octrace(proc,state,content,index) +#define octrace1(proc,state,content,start,count) +#define report(memsize,memory) +#endif /*OCDEBUG*/ + +OCmode +ocgetmode(OCcontent* content) +{ + return (content == NULL ? OCNULLMODE : content->mode); +} + +OCcontent* +ocnewcontent(OCstate* state) +{ + OCcontent* content; + if(state == NULL) return NULL; + content = state->contentlist; + /* Search for an unused content node*/ + while(content != NULL && content->mode != OCEMPTYMODE) { + content = content->next; + } + if(content == NULL) { + content = (OCcontent*)ocmalloc(sizeof(OCcontent)); + MEMCHECK(content,(OCcontent*)NULL); + content->magic = OCMAGIC; + content->next = state->contentlist; + state->contentlist = content; + } + return occlearcontent(state,content); +} + +void +ocfreecontent(OCstate* state, OCcontent* content) +{ + if(content != NULL) {content->mode = OCEMPTYMODE;} +} + +static OCcontent* +occlearcontent(struct OCstate* state, OCcontent* content) +{ + /* save fields that should not be cleared */ + unsigned int magic = content->magic; + OCcontent* next = content->next; + memset((void*)content,sizeof(OCcontent),0); + /* set/restore non-null fields */ + content->magic = magic; + content->next = next; + content->state = state; + content->mode = OCNULLMODE; + return content; +} + +static OCcontent* +ocsetcontent(OCcontent* childcontent, OCcontent* parent, OCnode* node, int packed) +{ + childcontent->state = parent->state; + childcontent->cache.valid = 0; + childcontent->node = node; + childcontent->tree = node->root->tree; + childcontent->mode = modetransition(node,parent->mode); + childcontent->packed = packed; + return childcontent; +} + +#ifdef OCIGNORE +static OCcontent* +occlonecontent(OCstate* state, OCcontent* content) +{ + OCcontent* clone = ocnewcontent(state); + clone->mode = content->mode; + clone->node = content->node; + clone->cache = content->indexcache; + return clone; +} +#endif + +OCerror +ocdataith(OCstate* state, OCcontent* parent, size_t index, OCcontent* child) +{ + OCerror ocerr = OC_NOERR; + switch (parent->mode) { + case OCARRAYMODE: + ocerr = ocarrayith(state,parent,child,index); + break; + case OCSEQUENCEMODE: + ocerr = ocsequenceith(state,parent,child,index); + break; + case OCFIELDMODE: + ocerr = ocfieldith(state,parent,child,index); + break; + default: return OC_EINVAL; + } + if(ocerr == OC_EDATADDS) + ocdataddsmsg(state,parent->tree); + return ocerr; +} + +OCerror +ocdatacount(OCstate* state, OCcontent* current, size_t* sizep) +{ + OCerror ocerr = OC_NOERR; + size_t count = 0; + switch(current->mode) { + case OCARRAYMODE: + count = ocarraycount(state,current); + break; + case OCSEQUENCEMODE: + count = ocsequencecount(state,current); + break; + case OCFIELDMODE: + count = ocfieldcount(state,current); + break; + case OCPRIMITIVEMODE: + count = ocprimcount(state,current); + break; + default: + return OC_EINVAL; + } + current->cache.maxindex = ocmax(count,current->cache.maxindex); + if(sizep) *sizep = count; + return ocerr; +} + +OCerror +ocrootdata(OCstate* state, OCnode* root, OCcontent* content) +{ + OCtree* tree; + if(state == NULL || root == NULL || content == NULL) + return OCTHROW(OC_EINVAL); + if(root->tree == NULL) return OCTHROW(OC_EINVAL); + tree = root->tree; + if(tree->dxdclass != OCDATADDS) return OCTHROW(OC_ENODATA); + if(tree->nodes == NULL) return OCTHROW(OC_EINVAL); + if(tree->data.xdrs == NULL) + return OCTHROW(OC_EXDR); + + occlearcontent(state,content); + content->mode = OCFIELDMODE; + content->node = root; + content->tree = tree; + + content->cache.index = 0; + content->cache.maxindex = oclistlength(content->node->subnodes); + content->cache.offset = 0; + content->cache.valid = 1; + + return OCTHROW(OC_NOERR); +} + +/* Remember: we are operating wrt the datadds count, not the dds count */ +static OCerror +ocarrayith(OCstate* state, OCcontent* content, OCcontent* elemcontent, size_t index) +{ + unsigned int i; + int stat = OC_NOERR; + XXDR* xdrs; + int packed, scalar; + OCtype etype,octype; + OCnode* node; + int startindex = 0; + + octrace("ocarrayith", state, content, index); + + if(state == NULL || content == NULL) return OCTHROW(OC_EINVAL); + if(content->mode != OCARRAYMODE) return OCTHROW(OC_EINVAL); + + etype = content->node->etype; + octype = content->node->octype; + node = content->node; + scalar = (node->array.rank == 0 ? 1 : 0); + packed = (!scalar && octype == OC_Primitive && + (etype == OC_Byte || etype == OC_UByte || etype == OC_Char)); + + xdrs = content->tree->data.xdrs; + if(xdrs == NULL) return OCTHROW(OC_EXDR); + + if(!content->cache.valid) { + content->cache.index = 0; /* because we will have to walk to index'th data */ + content->cache.maxindex = totaldimsize(node); + content->cache.valid = 1; + /* skip past the initial counts, if any */ + if(!scalar) { + if(!ocskipcounts(xdrs,node,node->skip.count)) return OCTHROW(OC_EDATADDS); + } + /* checkpoint xdr position */ + content->cache.offset = xxdr_getpos(xdrs); + } + + /* move to the checkpoint position */ + startindex = content->cache.index; + if(!xxdr_setpos(xdrs,content->cache.offset)) return xdrerror(); + + /* skip to the index'th item */ + if(packed) { + content->cache.index = 0; /* keep at beginning */ + } else { + for(i=startindex;icache.index = index; /* now we are at the index'th item */ + } + + /* update cache */ + content->cache.index = index; + content->cache.offset = xxdr_getpos(xdrs); + + /* set up the content for the current item in the array */ + ocsetcontent(elemcontent,content,node,packed); /*keep same node */ + if (index == content->cache.maxindex) { + /* mark eod */ + elemcontent->mode = OCNULLMODE; + } + + return OCTHROW(stat); +} + +static int +ocsequenceith(OCstate* state, OCcontent* content, OCcontent* structcontent, size_t index) +{ + unsigned int i; + int stat = OC_NOERR; + XXDR* xdrs; + OCtype octype,etype; + int packed,scalar; + OCnode* node = content->node; + int startindex, tag; + + octrace("ocsequenceith", state, content, index); + + if(state == NULL || content == NULL) goto einval; + if(content->mode != OCSEQUENCEMODE) goto einval; + if(node->octype != OC_Sequence) goto einval; + + octype = node->octype; + etype = node->etype; + scalar = (node->array.rank == 0 ? 1 : 0); + packed = (!scalar && octype == OC_Primitive && + (etype == OC_Byte || etype == OC_UByte || etype == OC_Char)); + + xdrs = content->tree->data.xdrs; + if(xdrs == NULL) goto exdr; + + if(!content->cache.valid) { + content->cache.valid = 1; + content->cache.index = 0; + content->cache.maxindex = 0; + content->cache.offset = xxdr_getpos(xdrs); + } + + /* move to checkpoint position*/ + startindex = content->cache.index; + if(!xxdr_setpos(xdrs,content->cache.offset)) goto exdr; + + /* Walk past the first (index-1) records */ + for(tag=StartOfSequence,i=startindex;icache.index = index; + content->cache.maxindex = ocmax(index,content->cache.index); + + /* this is a bit (too) tricky */ + /* move to point to fields */ + tag = ocgetsequencetag(xdrs); + if(tag == EndOfSequence) { + /* point past end of sequence */ + content->cache.offset = xxdr_getpos(xdrs); + } else {/*tag == StartOfSequence*/ + /* point to (next) start of sequence */ + content->cache.offset = xxdr_getpos(xdrs) - XDRUNIT; + } + /* at this point, xdrs should point unconditionally + past the index'th tag */ + + /* Set state of new content: keep same node */ + ocsetcontent(structcontent,content,node,packed); + if(tag == EndOfSequence) { + /* mark eod */ + structcontent->mode = OCNULLMODE; + } +done: + return OCTHROW(stat); +einval: + stat = OC_EINVAL; + goto done; +exdr: + stat = OC_EXDR; + goto done; +einvalcoords: + stat = OC_EINVALCOORDS; + goto done; +} + +/* +The ocfieldcontent procedure has to deal with the fact +that the dap constraints may have removed some fields +from the datadds and hence some fields may have no +representation in the xdr data (or compiled data). +Assume that xdr points to start of 0th field. +*/ +static int +ocfieldith(OCstate* state, OCcontent* content, OCcontent* fieldcontent, size_t index) +{ + unsigned int i; + int stat = OC_NOERR; + XXDR* xdrs; + OCtype octype,etype; + int packed; + int isscalar; + OCnode* node; + int startindex; + + octrace("ocfieldith", state, content, index); + + if(state == NULL || content == NULL) return OCTHROW(OC_EINVAL); + if(content->mode != OCFIELDMODE) return OCTHROW(OC_EINVAL); + + node = content->node; + octype = node->octype; + etype = node->etype; + isscalar = (node->array.rank == 0 ? 1 : 0); + packed = (!isscalar && octype == OC_Primitive + && (etype == OC_Byte || etype == OC_UByte || etype == OC_Char)); + + xdrs = content->tree->data.xdrs; + if(xdrs == NULL) return OCTHROW(OC_EXDR); + + if(!content->cache.valid) { + content->cache.index = 0; + content->cache.maxindex = oclistlength(node->subnodes); + content->cache.valid = 1; + /* checkpoint xdr position */ + content->cache.offset = xxdr_getpos(xdrs); + } + + /* move to the checkpoint position */ + startindex = content->cache.index; + if(!xxdr_setpos(xdrs,content->cache.offset)) return xdrerror(); + + switch (octype) { + case OC_Sequence: /* assume xdrs points past sequence tag */ + case OC_Grid: /* Note that the Grid array is field 0 and the maps are 1..nsubnodes*/ + case OC_Dataset: + case OC_Structure: + /* walk to (i-1)'th field */ + for(i=startindex;isubnodes,i); + stat = ocskipinstance(ithfield,xdrs,SKIPWHOLE,NULL); + if(stat != OC_NOERR) return OCTHROW(stat); + } + break; + + default: return OCTHROW(OC_EINVAL); + } + + /* update cache */ + content->cache.index = index; + content->cache.offset = xxdr_getpos(xdrs); + /* Set state of new content: node changes to field node */ + ocsetcontent(fieldcontent,content, + (OCnode*)oclistget(node->subnodes,index), + packed); + if(index >= content->cache.maxindex) { + /* mark eod */ + fieldcontent->mode = OCNULLMODE; + } + + return OCTHROW(stat); +} + +/* +In order to actually extract data, +one must move to the specific primitive typed +field containing the data of interest by using +ocfieldcontent(). +Then, oc_getcontent() is invoked to extract +some subsequence of items from the field. +Note that oc_getcontent() will also work for scalars, +but the start must be zero and the count must be one. +*/ + +int +ocgetcontent(OCstate* state, OCcontent* content, void* memory, size_t memsize, + size_t start, size_t count) +{ + int stat = OC_NOERR; + XXDR* xdrs; + OCtype etype, octype; + int isscalar, packed; + size_t elemsize, totalsize; + OCnode* node = content->node; + + octrace1("ocgetcontent", state, content, start, count); + + if(state == NULL || content == NULL || memory == NULL) + {OCTHROWCHK(stat=OC_EINVAL); goto done;} + if(content->mode != OCPRIMITIVEMODE || node->octype != OC_Primitive) + {OCTHROWCHK(stat=OC_EINVAL); goto done;} + + octype = node->octype; + etype = node->etype; + + isscalar = (node->array.rank == 0); + packed = (!isscalar && octype == OC_Primitive + && (etype == OC_Byte || etype == OC_UByte || etype == OC_Char)); + + if(isscalar && (start != 0 || count != 1)) + {OCTHROWCHK(stat=OC_EINVALCOORDS); goto done;} + + /* validate memory space*/ + elemsize = octypesize(etype); + totalsize = elemsize*count; + if(memsize < totalsize) return OCTHROW(OC_EINVAL); + + xdrs = content->tree->data.xdrs; + if(xdrs == NULL) return OCTHROW(OC_EXDR); + + /* Need to setup the cache */ + if(!content->cache.valid) { + content->cache.valid = 1; + content->cache.index = 0; + content->cache.maxindex = totaldimsize(content->node); + if(!ocskipcounts(xdrs,content->node,content->cache.maxindex)) + return OCTHROW(OC_EXDR); + content->cache.offset = xxdr_getpos(xdrs); + } + + if(content->cache.valid && content->cache.maxindex < (start+count)) + return OCTHROW(OC_ENODATA); + + /* utilize the cache */ + if(!xxdr_setpos(xdrs,content->cache.offset)) return OCTHROW(OC_EXDR); + + /* Extract the data */ + stat = ocxdrread(content,xdrs,(char*)memory,memsize,start,count); + +#ifdef OCDEBUG + report(memsize,memory+start); +#endif + + /* Update the cache */ + if(!packed) { + content->cache.index = (start+count); + content->cache.offset = xxdr_getpos(xdrs); + } + +done: + return OCTHROW(stat); +} + +static size_t +ocfieldcount(OCstate* state, OCcontent* content) +{ + OCnode* node = content->node; + size_t count; + OCASSERT((node != NULL)); + count = oclistlength(node->subnodes); + return count; +} + +static size_t +ocarraycount(OCstate* state, OCcontent* content) +{ + unsigned int count; + OCnode* node = content->node; + + OCASSERT((node != NULL)); + OCASSERT((content->mode == OCARRAYMODE)); + + count = totaldimsize(node); + +#ifdef VERIFY + if(node->array.rank > 0) { + off_t checkpoint; + XXDR* xdrs; + unsigned int xdrcount; + /* verify against xdr */ + xdrs = content->tree->data.xdrs; + OCASSERT((xdrs != NULL)); + /* checkpoint current location */ + checkpoint = xxdr_getpos(xdrs); + /* extract the count*/ + if(!xxdr_uint(xdrs,&xdrcount)) return 0; + if(xdrcount != count) return 0; + /* return to checkpoint position*/ + if(!xxdr_setpos(xdrs,checkpoint)) return 0; + } +#endif /*VERIFY*/ + return (size_t)count; +} + +/* Counting records actually requires walking the xdr packet + so it is not necessarily cheap*/ +static size_t +ocsequencecount(OCstate* state, OCcontent* content) +{ + size_t count; + OCnode* node = content->node; + XXDR* xdrs; + off_t checkpoint; + + OCASSERT((node != NULL)); + OCASSERT((node->octype == OC_Sequence)); + OCASSERT((content->mode == OCSEQUENCEMODE)); + + xdrs = content->tree->data.xdrs; + OCASSERT((xdrs != NULL)); + + /* checkpoint location */ + checkpoint = xxdr_getpos(xdrs); + + for(count=0;;count++) { + int tag; + OCerror stat = ocskipinstance(node,xdrs,SKIPINSTANCE,&tag); + if(stat != OC_NOERR) {count = 0; break;} + if(tag == EndOfSequence) { + break; /* done with the count*/ + } else if(tag != StartOfSequence) { + oc_log(LOGERR,"missing/invalid begin/end record marker\n"); + return 0; + } + } + + /* move back to checkpoint position*/ + if(!xxdr_setpos(xdrs,checkpoint)) return 0; + + return count; +} + +static size_t +ocprimcount(OCstate* state, OCcontent* content) +{ + unsigned int count; + OCnode* node = content->node; + + OCASSERT((node != NULL)); + OCASSERT((content->mode == OCPRIMITIVEMODE)); + + count = totaldimsize(node); + +#ifdef VERIFY + if(node->array.rank > 0) { + off_t checkpoint; + XXDR* xdrs; + unsigned int xdrcount; + /* verify against xdr */ + xdrs = content->tree->data.xdrs; + OCASSERT((xdrs != NULL)); + /* checkpoint current location */ + checkpoint = xxdr_getpos(xdrs); + /* extract the count*/ + if(!xxdr_uint(xdrs,&xdrcount)) return 0; + if(xdrcount != count) return 0; + /* return to checkpoint position*/ + if(!xxdr_setpos(xdrs,checkpoint)) return 0; + } +#endif /*VERIFY*/ + return (size_t)count; +} + +static OCmode +modetransition(OCnode* node, OCmode srcmode) +{ + OCmode newmode = OCNULLMODE; + switch (srcmode) { + case OCARRAYMODE: + switch (node->octype) { + case OC_Sequence: + newmode = OCSEQUENCEMODE; + break; + case OC_Grid: + case OC_Structure: + newmode = OCFIELDMODE; + break; + default: + break; + } + break; + + case OCSEQUENCEMODE: + switch (node->octype) { + default: + newmode = OCFIELDMODE; + break; + } + break; + + case OCFIELDMODE: + switch (node->octype) { + case OC_Sequence: + case OC_Grid: + case OC_Structure: + newmode = OCARRAYMODE; + break; + case OC_Primitive: + newmode = OCPRIMITIVEMODE; + break; + default: + break; + } + break; + + case OCPRIMITIVEMODE: + case OCNULLMODE: + case OCEMPTYMODE: + default: + newmode = OCNULLMODE; + break; + } + if(newmode == OCNULLMODE) + OCPANIC1("No defined mode transition: %d",(int)srcmode); + return newmode; +} + +/* get the presumed current sequence tag */ +static int +ocgetsequencetag(XXDR* xdrs) +{ + char tag[XDRUNIT]; + if(!xxdr_getbytes(xdrs,tag,sizeof(tag))) return 0; + return tag[0]; +} + +static int +ocskipcounts(XXDR* xdrs, OCnode* node, off_t expected) +{ + if(node->array.rank == 0) return 1; /* simple scalar */ +#ifdef VERIFY + unsigned int xdrcount0,xdrcount1; + /* Collect the dimension count from the xdr data packet*/ + if(!xxdr_uint(xdrs,&xdrcount0)) OCGOTO(shortxdr); + if(expected >= 0 && xdrcount0 != expected) return 0; + /* pull out redundant second count*/ + /* (note that String/URL do not have redundant count)*/ + if(node->octype == OC_Primitive + && node->etype != OC_String && node->etype != OC_URL) { + if(!xxdr_uint(xdrs,&xdrcount1)) return 0; + if(xdrcount0 != xdrcount1) return 0; + } +#else + /* skip the counts */ + expected = expected; /*shut up compiler*/ + if(node->octype == OC_Primitive + && node->etype != OC_String && node->etype != OC_URL) { + if(!xxdr_skip(xdrs,2*XDRUNIT)) return 0; + } else { + if(!xxdr_skip(xdrs,XDRUNIT)) return 0; + } +#endif + return 1; +} + +/**************************************************/ +/* Moved ocdata.c here */ +/**************************************************/ + +const char StartOfSequence = '\x5A'; +const char EndOfSequence = '\xA5'; + +static int ocerrorstring(XXDR* xdrs); + +#define LOCALMEMMAX 1024 + +/* +Skip arbitrary object based on its octype +and a state + +Cases: + +octype Skip State actions +------------------------------------------- +Structure + |Grid + |DataSet SKIPINSTANCE Skip single instance + |SKIPFIELDS + SKIPWHOLE Skip array of instances + including leading counts + +Sequence SKIPFIELDS Skip single record + (assume leading tag already skipped) + SKIPINSTANCE Skip single record + (including leading tag) + + SKIPWHOLE Skip all records + including leading tags + and trailing end marker + +Primitive Skip whole primitive array + including leading counts + +Notes: +1. unlisted combinations are not legal/possible. +2. assume that xxdr_getpos is properly positioned. +3. If octype is OC_Sequence, tagp will be set with the + last tag encountered. +*/ + +OCerror +ocskipinstance(OCnode* node, XXDR* xdrs, int state, int* tagp) +{ + int i,tag; + int stat = OC_NOERR; + +/* Support switch on combination of octype X state to simply code */ +#define CASE(octype,state) ((octype)<<3 | state) + + switch (CASE(node->octype,state)) { + + case CASE(OC_Dataset,SKIPINSTANCE): + case CASE(OC_Grid,SKIPINSTANCE): + case CASE(OC_Structure,SKIPINSTANCE): + + case CASE(OC_Dataset,SKIPFIELDS): + case CASE(OC_Grid,SKIPFIELDS): + case CASE(OC_Structure,SKIPFIELDS): + case CASE(OC_Sequence,SKIPFIELDS): /* NOTE this special case */ + if(node->skip.instancesize != OCINDETERMINATE) { + if(!xxdr_skip(xdrs,node->skip.instancesize)) OCGOTO(shortxdr); + } else {/* skip field by field */ + for(i=0;isubnodes);i++) { + OCnode* field = (OCnode*)oclistget(node->subnodes,i); + stat = ocskipinstance(field, xdrs, SKIPWHOLE,NULL); + if(stat != OC_NOERR) {OCTHROWCHK(stat); goto done;} + } + } + break; + + case CASE(OC_Dataset,SKIPWHOLE): + case CASE(OC_Grid,SKIPWHOLE): + case CASE(OC_Structure,SKIPWHOLE): + OCASSERT(node->skip.count != OCINDETERMINATE); + if(node->skip.totalsize != OCINDETERMINATE) { + if(!xxdr_skip(xdrs,node->skip.totalsize)) goto badxdr; + } else {/* skip each instance */ + if(node->array.rank > 0) { + if(!ocskipcounts(xdrs,node,node->skip.count)) goto badxdr; + for(i=0;iskip.count;i++) { + stat = ocskipinstance(node, xdrs, SKIPFIELDS,NULL); + if(stat != OC_NOERR) {OCTHROWCHK(stat); goto done;} + } + } else { /* scalar */ + stat = ocskipinstance(node, xdrs, SKIPINSTANCE,NULL); + if(stat != OC_NOERR) {OCTHROWCHK(stat); goto done;} + } + } + break; + + case CASE(OC_Sequence,SKIPINSTANCE): /* Skip record including tag */ + tag = ocgetsequencetag(xdrs); /* always read the tag */ + if(tagp) *tagp = tag; + if(tag == StartOfSequence) { /* skip record fields */ + stat = ocskipinstance(node, xdrs, SKIPFIELDS,NULL); + if(stat != OC_NOERR) {OCTHROWCHK(stat); break;} + } /* let caller handle */ + break; + + case CASE(OC_Sequence,SKIPWHOLE): /* Skip multiple records including tags */ + for(i=0;;i++) { + stat = ocskipinstance(node, xdrs, SKIPINSTANCE, &tag); + if(stat != OC_NOERR) {OCTHROWCHK(stat); break;} + if(tag == EndOfSequence) break; /* done */ + if(tag != StartOfSequence) goto badxdr; /* malformed */ + } + break; + + case CASE(OC_Primitive,SKIPWHOLE): + case CASE(OC_Primitive,SKIPINSTANCE): + case CASE(OC_Primitive,SKIPFIELDS): + OCASSERT(node->skip.count != OCINDETERMINATE); + if(node->skip.totalsize != OCINDETERMINATE) { + /* skip directly past it */ + if(!xxdr_skip(xdrs,node->skip.totalsize)) goto badxdr; + } else {/* Walk instance by instance */ + if(state == SKIPWHOLE) { + /* read the counts */ + if(!ocskipcounts(xdrs,node,node->skip.count)) + goto badxdr; + } + OCASSERT(node->etype == OC_String || node->etype == OC_URL); + /* get the count */ + for(i=0;iskip.count;i++) { + /* read and skip the string */ + unsigned int len; + /* read string size */ + if(!xxdr_uint(xdrs,&len)) OCGOTO(shortxdr); + /* round up to next XDRUNIT and skip string contents */ + len = RNDUP(len); + if(!xxdr_skip(xdrs,(size_t)len)) OCGOTO(shortxdr); + } + } + break; + + default: + OCPANIC2("ocskipinstance: encountered unexpected node type or state: %d,%d", + node->octype,state); + break; + } +done: + return OCTHROW(stat); +shortxdr: + oc_log(LOGERR,"short xdr packet"); + stat = OC_EXDR; + goto done; +badxdr: + oc_log(LOGERR,"malformed xdr packet"); + stat = OC_EXDR; + goto done; +} + +/* +Extract data from the xdr packet into a chunk of memory. +Normally, it is assumed that we are (at least virtually) +"at" a single instance in the xdr packet; which we read. +Virtually because for packed data, we need to point to +the beginning of the packed data and use the index to indicate +which packed element to get. Assume that in any case, +any leading counts have been passed. +*/ +OCerror +ocxdrread(OCcontent* content, XXDR* xdrs, char* memory, size_t memsize, + ocindex_t start, ocindex_t count) +{ + int stat = OC_NOERR; + unsigned int i; + size_t elemsize; + size_t readsize; + size_t skipsize; + char localmem[LOCALMEMMAX]; + char* srcmem; + unsigned int* p; + int packed; + int scalar; + OCtype octype,etype; + ocindex_t localstart = start; /* will change if node is cacheing */ + OCnode* node; + + node = content->node; + octype = node->octype; + etype = node->etype; + + elemsize = octypesize(etype); + + scalar = (node->array.rank == 0 ? 1 : 0); + + /* check if the data is packed*/ + packed = (octype == OC_Primitive && !scalar + && (etype == OC_Byte || etype == OC_UByte || etype == OC_Char)); + + /* validate memory space*/ + if(memsize < elemsize*count) return OCTHROW(OC_EINVAL); + +#ifdef OCIGNORE + if(!scalar && (!node->cache.cacheable || !node->cache.valid)) { + unsigned int xdrcount0,xdrcount1; + /* assume xdr position is correct */ + /* Read leading double count if ! scalar*/ + if(!xxdr_uint(xdrs,&xdrcount0)) OCGOTO(shortxdr); + if(!xxdr_uint(xdrs,&xdrcount1)) OCGOTO(shortxdr); + if(xdrcount0 != xdrcount1) return OCTHROW(OC_EXDR); + if(xdrcount0 < start+count) OCGOTO(shortxdr); + } +#endif + + /* Handle packed data specially*/ + if(packed) { + readsize = count*1; /* |OC_(Char,Byte,UByte)| == 1 */ + skipsize = start*1; /* |OC_(Char,Byte,UByte)| == 1 */ + /* skip to start of what we want to read */ + if(!xxdr_skip(xdrs,skipsize)) OCGOTO(shortxdr); + /* read data, keeping xdrs on XDRUNIT boundary */ + if(!xxdr_opaque(xdrs,memory,readsize)) + OCGOTO(shortxdr); + return OCTHROW(OC_NOERR); + } + + /* Not packed */ + +#ifdef OCIGNORE + /* If this (primitive) object is cacheable and is valid cache, + then modify start and set the xdr position accordingly + */ + if(node->cache.cacheable && node->cache.valid) { + if(node->cache.index <= start) { + localstart -= node->cache.index; + if(!xxdr_setpos(xdrs,node->cache.offset)) return xdrerror(); + } + } +#endif + + /* Compute how much to skip based on the content's cache index */ + localstart = start - content->cache.index; + if(localstart < 0) localstart = 0; + + /* extract count items; use xxdr_getbytes to speed up*/ + srcmem = memory; + switch (etype) { + case OC_Float64: case OC_Int64: case OC_UInt64: + readsize = count*2*XDRUNIT; + skipsize = localstart*2*XDRUNIT; + /* skip to start of what we want to read */ + if(!xxdr_skip(xdrs,skipsize)) OCGOTO(shortxdr); + if(!xxdr_opaque(xdrs,(char*)srcmem,readsize)) OCGOTO(shortxdr); + if(etype == OC_Float64) { + double* dp; + for(dp=(double*)srcmem,i=0;i sizeof(localmem)) { + srcmem = (char*)ocmalloc(count*sizeof(unsigned int)); + if(srcmem == NULL) {stat = OCTHROW(OC_ENOMEM); goto done;} + } + /* fall thru */ + case OC_Int32: case OC_UInt32: + case OC_Float32: + readsize = (count)*XDRUNIT; + skipsize = (localstart)*XDRUNIT; + if(!xxdr_skip(xdrs,skipsize)) OCGOTO(shortxdr); + if(!xxdr_opaque(xdrs,(char*)srcmem,readsize)) OCGOTO(shortxdr); + if(!xxdr_network_order) { + for(p=(unsigned int*)srcmem,i=0;icache.index = start + count; /* should be our current index */ + content->cache.offset = xxdr_getpos(xdrs); /* should be our current position */ + +done: + return OCTHROW(stat); + +shortxdr: + content->cache.valid = 0; /* no longer valid */ + if(!ocerrorstring(xdrs)) + oc_log(LOGERR,"DAP DATADDS packet is apparently too short"); + stat = OCTHROW(OC_EDATADDS); + goto done; +} + +int +occountrecords(OCnode* node, XXDR* xdrs, size_t* nrecordsp) +{ + int stat = OC_NOERR; + size_t nrecords = 0; + + if(node->octype != OC_Sequence) return OCTHROW(OC_EINVAL); + /* checkpoint the xdr position*/ + for(nrecords=0;;nrecords++) { + int tag = 0; + stat = ocskipinstance(node,xdrs,SKIPINSTANCE,&tag); + if(stat != OC_NOERR) break; + if(tag == EndOfSequence) break; + if(tag != StartOfSequence) { + oc_log(LOGERR,"missing/invalid begin/end record marker\n"); + stat = OC_EINVALCOORDS; + break; + } + if(stat != OC_NOERR) break; + } + if(nrecordsp != NULL) *nrecordsp = nrecords; + return OCTHROW(stat); +} + + + +#define tag "Error {\n" + +static int +ocerrorstring(XXDR* xdrs) +{ + /* Check to see if the xdrs contains "Error {\n'; assume it is at the beginning of data */ + off_t avail = xxdr_getavail(xdrs); + char* data = (char*)malloc(avail); + if(!xxdr_setpos(xdrs,0)) return 0; + if(!xxdr_opaque(xdrs,data,avail)) return 0; + /* check for error tag at front */ + if(ocstrncmp(data,tag,sizeof(tag))==0) { + char* p; + if((p=strchr(data,'}')) != NULL) *(++p)='\0'; + oc_log(LOGERR,"Server error: %s",data); + /* Since important, report to stderr as well */ + fprintf(stderr,"Server error: %s",data); + return 1; + } + return 0; +} diff --git a/extern/src_netcdf4/occontent.h b/extern/src_netcdf4/occontent.h new file mode 100644 index 0000000..0c6f9dc --- /dev/null +++ b/extern/src_netcdf4/occontent.h @@ -0,0 +1,35 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCCONTENT_H +#define OCCONTENT_H + +/*! Specifies the OCcontent*/ +typedef struct OCcontent { + unsigned int magic; + OCmode mode; + struct OCstate* state; + struct OCnode* node; + struct OCtree* tree; + int packed; /* track OC_Char and OC_Byte specially*/ + struct OCCACHE { + int valid; + ocindex_t index; /* index corresponding to offset */ + ocindex_t maxindex; /* max allowable index, if known0 => max unknown */ + ocoffset_t offset; /* location of this content in the xdr data */ + } cache; /* track last xdr position and index of this content */ + struct OCcontent* next; +} OCcontent; + +extern OCcontent* ocnewcontent(OCstate* state); +extern void ocfreecontent(OCstate* state, OCcontent* content); +extern OCmode ocgetmode(OCcontent* content); + +extern int ocdataith(struct OCstate*, OCcontent*, size_t, OCcontent*); +extern int ocdatacount(struct OCstate*, OCcontent*, size_t*); + +extern int ocrootdata(struct OCstate*, struct OCnode*, struct OCcontent*); +extern int ocgetcontent(struct OCstate*, struct OCcontent*, void* memory, + size_t memsize, size_t start, size_t count); + +#endif /*OCCONTENT_H*/ diff --git a/extern/src_netcdf4/occurlfunctions.c b/extern/src_netcdf4/occurlfunctions.c new file mode 100644 index 0000000..bfc3b82 --- /dev/null +++ b/extern/src_netcdf4/occurlfunctions.c @@ -0,0 +1,206 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include "ocinternal.h" +#include "ocdebug.h" +#include "ocdata.h" +#include "occontent.h" + +#include "ocrc.h" + +/* Condition on libcurl version */ +/* Set up an alias as needed */ +#ifndef HAVE_CURLOPT_KEYPASSWD +#define CURLOPT_KEYPASSWD CURLOPT_SSLKEYPASSWD +#endif + +static char* combinecredentials(const char* user, const char* pwd); + + +/* Set various general curl flags */ +int +ocset_curl_flags(OCstate* state) +{ + CURLcode cstat = CURLE_OK; + CURL* curl = state->curl; + struct OCcurlflags* flags = &state->curlflags; + +#ifdef CURLOPT_ENCODING + if (flags->compress) { + cstat = curl_easy_setopt(curl, CURLOPT_ENCODING,"deflate, gzip"); + if(cstat != CURLE_OK) goto done; + OCDBG(1,"CURLOPT_ENCODING=deflate, gzip"); + } +#endif + if (flags->cookiejar || flags->cookiefile) { + cstat = curl_easy_setopt(curl, CURLOPT_COOKIESESSION, 1); + if (cstat != CURLE_OK) goto done; + OCDBG(1,"CURLOPT_COOKIESESSION=1"); + } + if (flags->cookiejar) { + cstat = curl_easy_setopt(curl, CURLOPT_COOKIEJAR, flags->cookiejar); + if (cstat != CURLE_OK) goto done; + OCDBG1(1,"CURLOPT_COOKIEJAR=%s",flags->cookiejar); + } + if (flags->cookiefile) { + cstat = curl_easy_setopt(curl, CURLOPT_COOKIEFILE, flags->cookiefile); + if (cstat != CURLE_OK) goto done; + OCDBG1(1,"CURLOPT_COOKIEFILE=%s",flags->cookiefile); + } + if (flags->verbose) { + cstat = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + if (cstat != CURLE_OK) goto done; + OCDBG1(1,"CURLOPT_VERBOSE=%ld",1L); + } + + if (flags->timeout) { + cstat = curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)flags->timeout); + if (cstat != CURLE_OK) goto done; + OCDBG1(1,"CURLOPT_TIMEOUT=%ld",1L); + } + + /* Following are always set */ + cstat = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + OCDBG1(1,"CURLOPT_FOLLOWLOCATION=%ld",1L); + cstat = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10L); + OCDBG1(1,"CURLOPT_FOLLOWLOCATION=%ld",1L); + + cstat = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, state->error.curlerrorbuf); + OCDBG1(1,"CURLOPT_ERRORBUFFER",0); + +done: + return cstat; +} + +int +ocset_proxy(OCstate* state) +{ + CURLcode cstat; + CURL* curl = state->curl; + struct OCproxy *proxy = &state->proxy; + struct OCcredentials *creds = &state->creds; + + cstat = curl_easy_setopt(curl, CURLOPT_PROXY, proxy->host); + if (cstat != CURLE_OK) return OC_ECURL; + OCDBG1(1,"CURLOPT_PROXY=%s",proxy->host); + + cstat = curl_easy_setopt(curl, CURLOPT_PROXYPORT, proxy->port); + if (cstat != CURLE_OK) return OC_ECURL; + OCDBG1(1,"CURLOPT_PROXYPORT=%d",proxy->port); + + if (creds->username) { + char *combined = combinecredentials(creds->username,creds->password); + if (!combined) return OC_ENOMEM; + cstat = curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, combined); + if (cstat != CURLE_OK) return OC_ECURL; + OCDBG1(1,"CURLOPT_PROXYUSERPWD=%s",combined); +#ifdef CURLOPT_PROXYAUTH + cstat = curl_easy_setopt(curl, CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_PROXYAUTH=%ld",(long)CURLAUTH_ANY); +#endif + free(combined); + } + return OC_NOERR; +} + +int +ocset_ssl(OCstate* state) +{ + CURLcode cstat = CURLE_OK; + CURL* curl = state->curl; + struct OCSSL* ssl = &state->ssl; + long verify = (ssl->validate?1L:0L); + cstat=curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, verify); + if (cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_SSL_VERIFYPEER=%ld",verify); + cstat=curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, (verify?2L:0L)); + if (cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_SSL_VERIFYHOST=%ld",(verify?2L:0L)); +#ifdef OCIGNORE + if(verify) +#endif + { + if(ssl->certificate) { + cstat = curl_easy_setopt(curl, CURLOPT_SSLCERT, ssl->certificate); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_SSLCERT=%s",ssl->certificate); + } + if(ssl->key) { + cstat = curl_easy_setopt(curl, CURLOPT_SSLKEY, ssl->key); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_SSLKEY=%s",ssl->key); + } + if(ssl->keypasswd) { + /* libcurl prior to 7.16.4 used 'CURLOPT_SSLKEYPASSWD' */ + cstat = curl_easy_setopt(curl, CURLOPT_KEYPASSWD, ssl->keypasswd); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_SSLKEY=%s",ssl->key); + } + if(ssl->cainfo) { + cstat = curl_easy_setopt(curl, CURLOPT_CAINFO, ssl->cainfo); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_CAINFO=%s",ssl->cainfo); + } + if(ssl->capath) { + cstat = curl_easy_setopt(curl, CURLOPT_CAPATH, ssl->capath); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_CAPATH=%s",ssl->capath); + } + { + cstat = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, ssl->verifypeer); + if(cstat != CURLE_OK) goto fail; + OCDBG1(1,"CURLOPT_SSL_VERIFYPEER=%d",ssl->verifypeer); + } + } + return OC_NOERR; + +fail: + return OC_ECURL; +} + +/* This is called with arguments while the other functions in this file are + * used with global values read from the.dodsrc file. The reason is that + * we may have multiple password sources. + */ +int +ocset_user_password(OCstate* state) +{ + CURLcode cstat; + CURL* curl = state->curl; + char* combined = NULL; + const char* userC = state->creds.username; + const char* passwordC = state->creds.password; + + if(userC == NULL || passwordC == NULL) return OC_NOERR; + + combined = combinecredentials(userC,passwordC); + if (!combined) return OC_ENOMEM; + cstat = curl_easy_setopt(curl, CURLOPT_USERPWD, combined); + if (cstat != CURLE_OK) goto done; + OCDBG1(1,"CURLOPT_USERPWD=%s",combined); + cstat = curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long) CURLAUTH_ANY); + if (cstat != CURLE_OK) goto done; + OCDBG1(1,"CURLOPT_HTTPAUTH=%ld",(long)CURLAUTH_ANY); + +done: + if(combined != NULL) free(combined); + return (cstat == CURLE_OK?OC_NOERR:OC_ECURL); +} + + +static char* +combinecredentials(const char* user, const char* pwd) +{ + int userPassSize = strlen(user) + strlen(pwd) + 2; + char *userPassword = malloc(sizeof(char) * userPassSize); + if (!userPassword) { + oc_log(LOGERR,"Out of Memory\n"); + return NULL; + } + strcpy(userPassword, user); + strcat(userPassword, ":"); + strcat(userPassword, pwd); + return userPassword; +} diff --git a/extern/src_netcdf4/occurlfunctions.h b/extern/src_netcdf4/occurlfunctions.h new file mode 100644 index 0000000..17d2805 --- /dev/null +++ b/extern/src_netcdf4/occurlfunctions.h @@ -0,0 +1,19 @@ +/* + * rc.h + * + * Created on: Mar 5, 2009 + * Author: rikki + */ + +#ifndef _CURLFUNCTION_H_ +#define _CURLFUNCTION_H_ + +extern int ocset_curl_flags(OCstate*); +extern int ocset_user_password(OCstate*); +extern int ocset_proxy(OCstate*); +extern int ocset_ssl(OCstate*); + +#endif /*_CURLFUNCTION_H_*/ + + + diff --git a/extern/src_netcdf4/ocdata.h b/extern/src_netcdf4/ocdata.h new file mode 100644 index 0000000..5a3ca41 --- /dev/null +++ b/extern/src_netcdf4/ocdata.h @@ -0,0 +1,28 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCDATA_H +#define OCDATA_H + +typedef struct OCdimcounter { + int rank; + size_t index[OC_MAX_DIMS]; + size_t size[OC_MAX_DIMS]; +} OCdimcounter; + +extern const char StartOfSequence; +extern const char EndOfSequence; + +/*Forward */ +struct OCcontent; + +/* Skip arbitrary dimensioned instance; Handles dimensioning.*/ +extern int ocskip(OCnode* node, XXDR* xdrs); + +extern int occountrecords(OCnode* node, XXDR* xdrs, size_t* nrecordsp); + +extern int ocxdrread(struct OCcontent*, XXDR*, char* memory, size_t, ocindex_t index, ocindex_t count); + +extern int ocskipinstance(OCnode* node, XXDR* xdrs, int state, int* tagp); + +#endif /*OCDATA_H*/ diff --git a/extern/src_netcdf4/ocdatatypes.h b/extern/src_netcdf4/ocdatatypes.h new file mode 100644 index 0000000..d34c508 --- /dev/null +++ b/extern/src_netcdf4/ocdatatypes.h @@ -0,0 +1,61 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCDATATYPES_H +#define OCDATATYPES_H + +/* Define some useful info about the supported + primitive datatypes*/ + +#define DCHAR char +#define DBYTE signed char +#define DUBYTE unsigned char +#define DINT16 short +#define DUINT16 unsigned short +#define DINT32 int +#define DUINT32 unsigned int +#define DINT64 int +#define DUINT64 unsigned int +#define DFLOAT32 float +#define DFLOAT64 double + +#define OC_CHAR_MIN ((char)0x00) +#define OC_CHAR_MAX ((char)0xff) +#define OC_BYTE_MIN -128 +#define OC_BYTE_MAX 127 +#define OC_UBYTE_MIN 0 +#define OC_UBYTE_MAX 255U +#define OC_INT16_MIN -32768 +#define OC_INT16_MAX 32767 +#define OC_UINT16_MIN 0 +#define OC_UINT16_MAX 65535U +#define OC_INT32_MIN (-2147483647 - 1) +#define OC_INT32_MAX 2147483647 +#define OC_UINT32_MIN 0 +#define OC_UINT32_MAX 4294967295U +#define OC_INT64_MIN (-9223372036854775807LL-1) +#define OC_INT64_MAX (9223372036854775807LL) +#define OC_UINT64_MIN 0LL +#define OC_UINT64_MAX (18446744073709551615ULL) +#define OC_FLOAT32_MAX 3.402823466E+38F /* max decimal value of a "float" */ +#define OC_FLOAT32_MIN (-OC_FLOAT_MAX) +#define OC_FLOAT64_MAX 1.7976931348623157E+308 /* max decimal value of a double */ +#define OC_FLOAT64_MIN (-OC_FLOAT64_MAX) + +/* Similar to netcdf*/ +#define OC_FILL_CHAR ((char)0) +#define OC_FILL_BYTE ((signed char)-127) +#define OC_FILL_UBYTE (255) +#define OC_FILL_INT16 ((short)-32767) +#define OC_FILL_UINT16 (65535) +#define OC_FILL_INT32 (-2147483647L) +#define OC_FILL_UINT32 (4294967295U) +#define OC_FILL_INT64 ((long long)-9223372036854775806LL) +#define OC_FILL_UINT64 ((unsigned long long)18446744073709551614ULL) +#define OC_FILL_FLOAT32 (9.9692099683868690e+36f) /* near 15 * 2^119 */ +#define OC_FILL_FLOAT64 (9.9692099683868690e+36) +#define OC_FILL_STRING "" +#define OC_FILL_URL "" + + +#endif /*OCDATATYPES_H*/ diff --git a/extern/src_netcdf4/ocdebug.c b/extern/src_netcdf4/ocdebug.c new file mode 100644 index 0000000..ef51f09 --- /dev/null +++ b/extern/src_netcdf4/ocdebug.c @@ -0,0 +1,67 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include +#include "ocinternal.h" +#include "ocdebug.h" + +int ocdebug; + +#ifdef OCCATCHERROR +/* Place breakpoint here to catch errors close to where they occur*/ +int +ocbreakpoint(int err) {return err;} + +int +octhrow(int err) +{ + if(err == 0) return err; + return ocbreakpoint(err); +} +#endif + +int +xdrerror(void) +{ + oc_log(LOGERR,"xdr failure"); + return OCTHROW(OC_EDATADDS); +} + + +void* +occalloc(size_t size, size_t nelems) +{ + return ocmalloc(size*nelems); +} + +void* +ocmalloc(size_t size) +{ + void* memory = calloc(size,1); /* use calloc to zero memory*/ + if(memory == NULL) oc_log(LOGERR,"ocmalloc: out of memory"); + return memory; +} + +void +ocfree(void* mem) +{ + if(mem != NULL) free(mem); +} + +int +ocpanic(const char* fmt, ...) +{ + va_list args; + if(fmt != NULL) { + va_start(args, fmt); + vfprintf(stderr, fmt, args); + fprintf(stderr, "\n" ); + va_end( args ); + } else { + fprintf(stderr, "panic" ); + } + fprintf(stderr, "\n" ); + fflush(stderr); + return 0; +} diff --git a/extern/src_netcdf4/ocdebug.h b/extern/src_netcdf4/ocdebug.h new file mode 100644 index 0000000..1d2dff7 --- /dev/null +++ b/extern/src_netcdf4/ocdebug.h @@ -0,0 +1,93 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCOCDBG_H +#define OCOCDBG_H + +#include + +#if 0 +#define OCDEBUG +#define DAPDEBUG 1 +#endif + +#ifdef OCDEBUG +#define OCVERBOSE +#endif + +/* OCCATCHERROR is used to detect errors as close + to their point of origin as possible. When + enabled, one can set a breakpoint in ocbreakpoint() + to catch the failure. Turing it on incurs a significant + performance penalty, so it is off by default.*/ + +#define OCCATCHERROR + +#define OCPANIC(msg) assert(ocpanic(msg)) +#define OCPANIC1(msg,arg) assert(ocpanic(msg,arg)) +#define OCPANIC2(msg,arg1,arg2) assert(ocpanic(msg,arg1,arg2)) + +/* Make it possible to catch assertion failures by breakpointing ocpanic*/ +#define OCASSERT(expr) if(!(expr)) {OCPANIC((#expr));} else {} + +/* Need some syntactic trickery to make these macros work*/ +#ifdef OCDEBUG +#define OCDBG(l,msg) {oc_log(LOGDBG,msg);} +#define OCDBG1(l,msg,arg) {oc_log(LOGDBG,msg,arg);} +#define OCDBG2(l,msg,arg1,arg2) {oc_log(LOGDBG,msg,arg1,arg2);} +#define OCDBGTEXT(l,text) {oc_logtext(LOGNOTE,text);} else {} +#define OCDBGCODE(l,code) {code;} + +#else +#define OCDBG(l,msg) +#define OCDBG1(l,msg,arg) +#define OCDBG2(l,msg,arg1,arg2) +#define OCDBGTEXT(l,text) +#define OCDBGCODE(l,code) +#endif + + +/* +OCPROGRESS attempts to provide some info +about how IO is getting along. +*/ +#undef OCPROGRESS + +extern int ocdebug; +extern int cedebug; + +/*extern char* dent2(int n);*/ +/*/extern char* dent(int n);*/ +extern int ocpanic(const char* fmt, ...); + +extern int xdrerror(void); + +/* +Provide wrapped versions of calloc and malloc. +The wrapped version panics if memory +is exhausted. It also guarantees that the +memory has been zero'd. +*/ + +extern void* occalloc(size_t size, size_t nelems); +extern void* ocmalloc(size_t size); +extern void ocfree(void*); + +#define MEMCHECK(var,throw) {if((var)==NULL) return (throw);} + +#ifdef OCCATCHERROR +/* Place breakpoint on ocbreakpoint to catch errors close to where they occur*/ +#define OCTHROW(e) octhrow(e) +#define OCTHROWCHK(e) (void)octhrow(e) +#define OCGOTO(label) {ocbreakpoint(-1); goto label;} +extern int ocbreakpoint(int err); +extern int octhrow(int err); +#else +#define OCTHROW(e) (e) +#define OCTHROWCHK(e) +#define OCGOTO(label) goto label +#endif + + +#endif /*OCOCDBG_H*/ + diff --git a/extern/src_netcdf4/ocdrno.c b/extern/src_netcdf4/ocdrno.c new file mode 100644 index 0000000..05eea02 --- /dev/null +++ b/extern/src_netcdf4/ocdrno.c @@ -0,0 +1,62 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include "oc.h" +#include "ocinternal.h" +#include "ocdebug.h" + +/* +This file exports procedures +that access the internals of +oc. They are intended to be called +by the drno code to avoid at least +the appearance of breaking the oc +encapsulation. +*/ + +#if 0 + +OCerror +oc_svcerrordata(OCconnection conn, char** codep, char** msgp, long* httpp) +{ + OCstate* state = (OCstate*)conn; + if(codep) *codep = state->error.code; + if(msgp) *msgp = state->error.message; + if(httpp) *httpp = state->error.httpcode; + return OC_NOERR; +} + +/* DRNO need to explicitly get and walk string values*/ +int +oc_stringcontent(OCstate* state, OCcontent* content, char** stringp, size_t* slenp) +{ + int stat = OC_NOERR; + XDR* xdrs; + unsigned int slen; + char* stringmemory; + + if(state == NULL || content == NULL) return OCTHROW(OC_EINVAL); + + if(content->node->octype != OC_Primitive) return OCTHROW(OC_EINVAL); + if(content->node->etype != OC_String + && content->node->etype != OC_URL) return OCTHROW(OC_EINVAL); + + xdrs = state->dap.xdrs; + if(xdrs == NULL) return OCTHROW(OC_EXDR); + + if(oc_contentmode(state,content) != Datamode) return OCTHROW(OC_EINVAL); + /* We are at a single instance of a string data type*/ + if(!xdr_setpos(xdrs,content->xdroffset)) return xdrerror(); + if(!xdr_u_int(xdrs,&slen)) return xdrerror(); + stringmemory = (char*)ocmalloc(slen+1); + MEMCHECK(stringmemory,OC_ENOMEM); + if(!xdr_opaque(xdrs,stringmemory,slen)) return xdrerror(); + stringmemory[slen] = '\0'; + /* restore location*/ + if(!xdr_setpos(xdrs,content->xdroffset)) return xdrerror(); + if(stringp != NULL) *stringp = stringmemory; + if(slenp != NULL) *slenp = slen; + return OCTHROW(stat); +} +#endif diff --git a/extern/src_netcdf4/ocdrno.h b/extern/src_netcdf4/ocdrno.h new file mode 100644 index 0000000..6948081 --- /dev/null +++ b/extern/src_netcdf4/ocdrno.h @@ -0,0 +1,18 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCDRNO_H +#define OCDRNO_H +/* +This file exports procedures +that access the internals of +oc. They are intended to be called +by the drno code to avoid at least +the appearance of breaking the oc +encapsulation. +*/ + +/* DO NOT FREE THE RETURNED STRINGS */ +extern OCerror ocdaperrorcode(OCconnection,char**,char**,long*); + +#endif /*OCDRNO_H*/ diff --git a/extern/src_netcdf4/ocdump.c b/extern/src_netcdf4/ocdump.c new file mode 100644 index 0000000..f3d1c68 --- /dev/null +++ b/extern/src_netcdf4/ocdump.c @@ -0,0 +1,482 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. +*/ + +#include "config.h" +#include + +#ifdef NETINET_IN_H +#include +#endif + +#include "ocinternal.h" +#include "ocdata.h" +#include "ocdebug.h" + +#define MAXLEVEL 1 + +/*Forward*/ +static void dumpocnode1(OCnode* node, int depth); +static void dumpdimensions(OCnode* node); +static void dumpattvalue(OCtype nctype, char** aset, int index); + +static char* sindent = NULL; + +static char* +dent(int n) +{ + if(sindent == NULL) { + sindent = (char*)ocmalloc(102); + MEMCHECK(sindent,NULL); + memset((void*)sindent,(int)' ',(size_t)101); + sindent[101] = '\0'; + } + if(n > 100) n = 100; + return sindent+(100-n); +} + +/* support [dd] leader*/ +static char* +dent2(int n) {return dent(n+4);} + +void +ocdumpnode(OCnode* node) +{ + if(node != NULL) { + dumpocnode1(node,0); + } else { + fprintf(stdout,"\n"); + } + fflush(stdout); +} + +static void +dumpskip(OCnode* node) +{ + char tmpc[64]; + char tmpi[64]; + char tmpt[64]; + char tmpo[64]; + if(node->skip.count == OCINDETERMINATE) + strcpy(tmpc,"?"); + else + snprintf(tmpc,sizeof(tmpc),"%lu",(unsigned long)node->skip.count); + if(node->skip.instancesize == OCINDETERMINATE) + strcpy(tmpi,"?"); + else + snprintf(tmpi,sizeof(tmpi),"%lu",(unsigned long)node->skip.instancesize); + if(node->skip.totalsize == OCINDETERMINATE) + strcpy(tmpt,"?"); + else + snprintf(tmpt,sizeof(tmpt),"%lu",(unsigned long)node->skip.totalsize); + if(node->skip.offset == OCINDETERMINATE) + strcpy(tmpo,"?"); + else + snprintf(tmpo,sizeof(tmpo),"%lu",(unsigned long)node->skip.offset); + + fprintf(stdout," [(%s*%s)/%s@%s]",tmpi,tmpc,tmpt,tmpo); +} + +static void +dumpocnode1(OCnode* node, int depth) +{ + unsigned int n; + switch (node->octype) { + case OC_Primitive: { + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + if(node->name == NULL) OCPANIC("prim without name"); + fprintf(stdout,"%s %s",octypetostring(node->etype),node->name); + dumpdimensions(node); +#ifdef OCIGNORE + if(node->cache.cacheable) fprintf(stdout," [cached]"); +#endif + dumpskip(node); + fprintf(stdout," &%lx",(unsigned long)node); + fprintf(stdout,"\n"); + } break; + + case OC_Dataset: { + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + fprintf(stdout,"dataset %s\n", + (node->name?node->name:"")); + for(n=0;nsubnodes);n++) { + dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1); + } + } break; + + case OC_Structure: { + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + fprintf(stdout,"struct %s", + (node->name?node->name:"")); + dumpdimensions(node); + dumpskip(node); + fprintf(stdout," &%lx",(unsigned long)node); + fprintf(stdout,"\n"); + for(n=0;nsubnodes);n++) { + dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1); + } + } break; + + case OC_Sequence: { + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + fprintf(stdout,"sequence %s", + (node->name?node->name:"")); + dumpdimensions(node); + dumpskip(node); + fprintf(stdout," &%lx",(unsigned long)node); + fprintf(stdout,"\n"); + for(n=0;nsubnodes);n++) { + dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1); + } + } break; + + case OC_Grid: { + unsigned int i; + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + fprintf(stdout,"grid %s", + (node->name?node->name:"")); + dumpdimensions(node); + dumpskip(node); + fprintf(stdout," &%lx",(unsigned long)node); + fprintf(stdout,"\n"); + fprintf(stdout,"%sarray:\n",dent2(depth+1)); + dumpocnode1((OCnode*)oclistget(node->subnodes,0),depth+2); + fprintf(stdout,"%smaps:\n",dent2(depth+1)); + for(i=1;isubnodes);i++) { + dumpocnode1((OCnode*)oclistget(node->subnodes,i),depth+2); + } + } break; + + case OC_Attribute: { + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + if(node->name == NULL) OCPANIC("Attribute without name"); + fprintf(stdout,"%s %s",octypetostring(node->etype),node->name); + for(n=0;natt.values);n++) { + char* value = (char*)oclistget(node->att.values,n); + if(n > 0) fprintf(stdout,","); + fprintf(stdout," %s",value); + } + fprintf(stdout," &%lx",(unsigned long)node); + fprintf(stdout,"\n"); + } break; + + case OC_Attributeset: { + fprintf(stdout,"[%2d]%s ",depth,dent(depth)); + fprintf(stdout,"%s:\n",node->name?node->name:"Attributes"); + for(n=0;nsubnodes);n++) { + dumpocnode1((OCnode*)oclistget(node->subnodes,n),depth+1); + } + } break; + + default: + OCPANIC1("encountered unexpected node type: %x",node->octype); + } + + if(node->attributes != NULL) { + unsigned int i; + for(i=0;iattributes);i++) { + OCattribute* att = (OCattribute*)oclistget(node->attributes,i); + fprintf(stdout,"%s[%s=",dent2(depth+2),att->name); + if(att->nvalues == 0) + OCPANIC("Attribute.nvalues == 0"); + if(att->nvalues == 1) { + dumpattvalue(att->etype,att->values,0); + } else { + unsigned int j; + fprintf(stdout,"{"); + for(j=0;jnvalues;j++) { + if(j>0) fprintf(stdout,", "); + dumpattvalue(att->etype,att->values,j); + } + fprintf(stdout,"}"); + } + fprintf(stdout,"]\n"); + } + } +} + +static void +dumpdimensions(OCnode* node) +{ + unsigned int i; + for(i=0;iarray.rank;i++) { + OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i); + fprintf(stdout,"[%s=%lu]", + (dim->name?dim->name:"?"), + (unsigned long)dim->dim.declsize); + } +} + +static void +dumpattvalue(OCtype nctype, char** strings, int index) +{ + if(nctype == OC_String || nctype == OC_URL) { + fprintf(stdout,"\"%s\"",strings[index]); + } else { + fprintf(stdout,"%s",strings[index]); + } +} + +void +ocdumpslice(OCslice* slice) +{ + fprintf(stdout,"["); + fprintf(stdout,"%lu",(unsigned long)slice->first); + if(slice->stride > 1) fprintf(stdout,":%lu",(unsigned long)slice->stride); + fprintf(stdout,":%lu",(unsigned long)(slice->first+slice->count)-1); + fprintf(stdout,"]"); +} + +void +ocdumpclause(OCprojectionclause* ref) +{ + unsigned int i; + OClist* path = oclistnew(); + occollectpathtonode(ref->node,path); + for(i=0;itree != NULL) continue; /* leave off the root node*/ + fprintf(stdout,"%s%s",(i>0?PATHSEPARATOR:""),node->name); + sliceset = (OClist*)oclistget(ref->indexsets,i); + if(sliceset != NULL) { + unsigned int j; + for(j=0;j 0) strcat(line," "); +} + +static void +dumpfield(int index, char* n8, int isxdr) +{ + char line[1024]; + char tmp[32]; + + union { + unsigned int uv; + int sv; + char cv[4]; + float fv; + } form; + union { + char cv[8]; + unsigned long long ll; + double d; + } dform; + + line[0] = '\0'; + + /* offset */ + sprintf(tmp,"%6d",index); + addfield(tmp,line,5); + + memcpy(form.cv,n8,4); + + /* straight hex*/ + sprintf(tmp,"%08x",form.uv); + addfield(tmp,line,8); + + if(isxdr) {swapinline32(&form.uv);} + + /* unsigned integer */ + sprintf(tmp,"%12u",form.uv); + addfield(tmp,line,12); + + /* signed integer */ + sprintf(tmp,"%12d",form.sv); + addfield(tmp,line,12); + + /* float */ + sprintf(tmp,"%#g",form.fv); + addfield(tmp,line,12); + + /* char[4] */ + { + /* use raw form (i.e. n8)*/ + int i; + tmp[0] = '\0'; + for(i=0;i<4;i++) { + char stmp[64]; + unsigned int c = (n8[i] & 0xff); + if(c < ' ' || c > 126) + sprintf(stmp,"\\%02x",c); + else + sprintf(stmp,"%c",c); + strcat(tmp,stmp); + } + } + + addfield(tmp,line,16); + + /* double */ + memcpy(dform.cv,n8,2*XDRUNIT); + if(isxdr) xxdrntohdouble(dform.cv,&dform.d); + sprintf(tmp,"%#g",dform.d); + addfield(tmp,line,12); + + fprintf(stdout,"%s\n",line); +} + +static void +typedmemorydump(char* memory, size_t len, int fromxdr) +{ + unsigned int i,count,rem; + char line[1024]; + char* pmem; + char mem[8]; + + assert(memory[len] == 0); + + /* build the header*/ + line[0] = '\0'; + addfield("offset",line,6); + addfield("hex",line,8); + addfield("uint",line,12); + addfield("int",line,12); + addfield("float",line,12); + addfield("char[4]",line,16); + addfield("double",line,12); + strcat(line,"\n"); + fprintf(stdout,"%s",line); + + count = (len / sizeof(int)); + rem = (len % sizeof(int)); + + for(pmem=memory,i=0;i 0) { + memset(mem,0,8); + memcpy(mem,pmem,4); + dumpfield(i*sizeof(unsigned int),mem,fromxdr); + } + fflush(stdout); +} + +static void +simplememorydump(char* memory, size_t len, int fromxdr) +{ + unsigned int i,count,rem; + int* imemory; + char tmp[32]; + char line[1024]; + + assert(memory[len] == 0); + + /* build the header*/ + line[0] = '\0'; + addfield("offset",line,6); + addfield("XDR (hex)",line,9); + addfield("!XDR (hex)",line,10); + fprintf(stdout,"%s\n",line); + + count = (len / sizeof(int)); + rem = (len % sizeof(int)); + if(rem != 0) + fprintf(stderr,"ocdump: |mem|%%4 != 0\n"); + imemory = (int*)memory; + + for(i=0;i MAXLEVEL) level = MAXLEVEL; + switch (level) { + case 1: /* Do a multi-type dump */ + typedmemorydump(memory,len,xdrencoded); + break; + case 0: /* Dump a simple linear list of the contents of the memory as 32-bit hex and decimal */ + default: + simplememorydump(memory,len,xdrencoded); + break; + } +} + +static int +ocreadfile(FILE* file, int datastart, char** memp, size_t* lenp) +{ + char* mem; + size_t len; + size_t pos; + size_t red; + struct stat stats; + + pos = ftell(file); + fseek(file,0,SEEK_SET); + fseek(file,datastart,SEEK_SET); + + fstat(fileno(file),&stats); + len = stats.st_size; + len -= datastart; + + mem = (char*)calloc(len+1,1); + if(mem == NULL) return 0; + + /* Read only the data part */ + red = fread(mem,1,len,file); + if(red < len) { + fprintf(stderr,"ocreadfile: short file\n"); + return 0; + } + fseek(file,pos,SEEK_SET); /* leave it as we found it*/ + if(memp) *memp = mem; + if(lenp) *lenp = len; + return 1; +} + +void +ocdd(OCstate* state, OCnode* root, int xdrencoded, int level) +{ + char* mem; + size_t len; + if(root->tree->data.file != NULL) { + if(!ocreadfile(root->tree->data.file,root->tree->data.bod,&mem,&len)) { + fprintf(stderr,"ocdd could not read data file\n"); + return; + } + ocdumpmemory(mem,len,xdrencoded,level); + free(mem); + } else { + mem = root->tree->data.memory; + mem += root->tree->data.bod; + len = root->tree->data.datasize; + len -= root->tree->data.bod; + ocdumpmemory(mem,len,xdrencoded,level); + } +} + diff --git a/extern/src_netcdf4/ocdump.h b/extern/src_netcdf4/ocdump.h new file mode 100644 index 0000000..eabd28a --- /dev/null +++ b/extern/src_netcdf4/ocdump.h @@ -0,0 +1,16 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCDUMP_H +#define OCDUMP_H + +extern void ocdumpnode(OCnode* node); + +extern void ocdumpslice(OCslice* slice); +extern void ocdumpclause(OCprojectionclause* ref); + +extern void ocdumpmemory(char* memory, size_t len, int xdrencoded, int level); + +extern void ocdd(OCstate*,OCnode*,int xdrencoded, int level); + +#endif /*OCDUMP_H*/ diff --git a/extern/src_netcdf4/ochttp.c b/extern/src_netcdf4/ochttp.c new file mode 100644 index 0000000..099525b --- /dev/null +++ b/extern/src_netcdf4/ochttp.c @@ -0,0 +1,338 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include "ocinternal.h" +#include "ocdebug.h" +#include "ochttp.h" +#include "ocrc.h" + +static size_t WriteFileCallback(void*, size_t, size_t, void*); +static size_t WriteMemoryCallback(void*, size_t, size_t, void*); + +struct Fetchdata { + FILE* stream; + size_t size; +}; + +long +ocfetchhttpcode(CURL* curl) +{ + long httpcode; + CURLcode cstat = CURLE_OK; + /* Extract the http code */ + cstat = curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&httpcode); + if(cstat != CURLE_OK) httpcode = 0; + return httpcode; +} + +int +ocfetchurl_file(CURL* curl, const char* url, FILE* stream, + unsigned long* sizep, long* filetime) +{ + int stat = OC_NOERR; + CURLcode cstat = CURLE_OK; + struct Fetchdata fetchdata; + + /* Set the URL */ + cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url); + if (cstat != CURLE_OK) + goto fail; + + /* send all data to this function */ + cstat = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFileCallback); + if (cstat != CURLE_OK) + goto fail; + + /* we pass our file to the callback function */ + cstat = curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&fetchdata); + if (cstat != CURLE_OK) + goto fail; + + /* One last thing; always try to get the last modified time */ + cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1); + if (cstat != CURLE_OK) + goto fail; + + fetchdata.stream = stream; + fetchdata.size = 0; + cstat = curl_easy_perform(curl); + if (cstat != CURLE_OK) + goto fail; + + if (stat == OC_NOERR) { + /* return the file size*/ +#ifdef OCDEBUG + oc_log(LOGNOTE,"filesize: %lu bytes",fetchdata.size); +#endif + if (sizep != NULL) + *sizep = fetchdata.size; + /* Get the last modified time */ + if(filetime != NULL) + cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime); + if(cstat != CURLE_OK) goto fail; + } + return OCTHROW(stat); + +fail: + oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); + return OCTHROW(OC_ECURL); +} + +int +ocfetchurl(CURL* curl, const char* url, OCbytes* buf, long* filetime) +{ + int stat = OC_NOERR; + CURLcode cstat = CURLE_OK; + size_t len; + + /* Set the URL */ + cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url); + if (cstat != CURLE_OK) + goto fail; + + /* send all data to this function */ + cstat = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + if (cstat != CURLE_OK) + goto fail; + + /* we pass our file to the callback function */ + cstat = curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)buf); + if (cstat != CURLE_OK) + goto fail; + + /* One last thing; always try to get the last modified time */ + cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1); + + cstat = curl_easy_perform(curl); + if(cstat == CURLE_PARTIAL_FILE) { + /* Log it but otherwise ignore */ + oc_log(LOGWARN, "curl error: %s; ignored", + curl_easy_strerror(cstat)); + cstat = CURLE_OK; + } + if(cstat != CURLE_OK) goto fail; + + /* Get the last modified time */ + if(filetime != NULL) + cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime); + if(cstat != CURLE_OK) goto fail; + + /* Null terminate the buffer*/ + len = ocbyteslength(buf); + ocbytesappend(buf, '\0'); + ocbytessetlength(buf, len); /* dont count null in buffer size*/ +#ifdef OCDEBUG + oc_log(LOGNOTE,"buffersize: %lu bytes",(unsigned long)ocbyteslength(buf)); +#endif + + return OCTHROW(stat); + +fail: + oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); + return OCTHROW(OC_ECURL); +} + +static size_t +WriteFileCallback(void* ptr, size_t size, size_t nmemb, void* data) +{ + size_t realsize = size * nmemb; + size_t count; + struct Fetchdata* fetchdata; + fetchdata = (struct Fetchdata*) data; + if(realsize == 0) + oc_log(LOGWARN,"WriteFileCallback: zero sized chunk"); + count = fwrite(ptr, size, nmemb, fetchdata->stream); + if (count > 0) { + fetchdata->size += (count * size); + } else { + oc_log(LOGWARN,"WriteFileCallback: zero sized write"); + } +#ifdef OCPROGRESS + oc_log(LOGNOTE,"callback: %lu bytes",(unsigned long)realsize); +#endif + return count; +} + +static size_t +WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) +{ + size_t realsize = size * nmemb; + OCbytes* buf = (OCbytes*) data; + if(realsize == 0) + oc_log(LOGWARN,"WriteMemoryCallback: zero sized chunk"); + /* Optimize for reading potentially large dods datasets */ + if(!ocbytesavail(buf,realsize)) { + /* double the size of the packet */ + ocbytessetalloc(buf,2*ocbytesalloc(buf)); + } + ocbytesappendn(buf, ptr, realsize); +#ifdef OCPROGRESS + oc_log(LOGNOTE,"callback: %lu bytes",(unsigned long)realsize); +#endif + return realsize; +} + +#if 0 +static void +assembleurl(DAPURL* durl, OCbytes* buf, int what) +{ + encodeurltext(durl->url,buf); + if(what & WITHPROJ) { + ocbytescat(buf,"?"); + encodeurltext(durl->projection,buf); + } + if(what & WITHSEL) encodeurltext(durl->selection,buf); + +} + +static char mustencode=""; +static char hexchars[16] = { + '0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'a', 'b', + 'c', 'd', 'e', 'f', +}; + +static void +encodeurltext(char* text, OCbytes* buf) +{ + /* Encode the URL to handle illegal characters */ + len = strlen(url); + encoded = ocmalloc(len*4+1); /* should never be larger than this*/ + if(encoded==NULL) return; + p = url; q = encoded; + while((c=*p++)) { + if(strchr(mustencode,c) != NULL) { + char tmp[8]; + int hex1, hex2; + hex1 = (c & 0x0F); + hex2 = (c & 0xF0) >> 4; + tmp[0] = '0'; tmp[1] = 'x'; + tmp[2] = hexchars[hex2]; tmp[3] = hexchars[hex1]; + tmp[4] = '\0'; + ocbytescat(buf,tmp); + } else *q++ = (char)c; + } + +} + +#endif + +int +occurlopen(CURL** curlp) +{ + int stat = OC_NOERR; + CURLcode cstat = CURLE_OK; + CURL* curl; + /* initialize curl*/ + curl = curl_easy_init(); + if (curl == NULL) + stat = OC_ECURL; + else { + cstat = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); + if (cstat != CURLE_OK) + stat = OC_ECURL; + /* some servers don't like requests that are made without a user-agent */ + cstat = curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + if (cstat != CURLE_OK) + stat = OC_ECURL; + } + if (curlp) + *curlp = curl; + return OCTHROW(stat); +} + +void +occurlclose(CURL* curl) +{ + if (curl != NULL) + curl_easy_cleanup(curl); +} + +int +ocfetchlastmodified(CURL* curl, char* url, long* filetime) +{ + int stat = OC_NOERR; + CURLcode cstat = CURLE_OK; + + /* Set the URL */ + cstat = curl_easy_setopt(curl, CURLOPT_URL, (void*)url); + if (cstat != CURLE_OK) + goto fail; + + /* Ask for head */ + cstat = curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30); /* 30sec timeout*/ + cstat = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2); + cstat = curl_easy_setopt(curl, CURLOPT_HEADER, 1); + cstat = curl_easy_setopt(curl, CURLOPT_NOBODY, 1); + cstat = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); + cstat = curl_easy_setopt(curl, CURLOPT_FILETIME, (long)1); + + cstat = curl_easy_perform(curl); + if(cstat != CURLE_OK) goto fail; + if(filetime != NULL) + cstat = curl_easy_getinfo(curl,CURLINFO_FILETIME,filetime); + if(cstat != CURLE_OK) goto fail; + + return OCTHROW(stat); + +fail: + oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); + return OCTHROW(OC_ECURL); +} + +int +ocping(const char* url) +{ + int stat = OC_NOERR; + CURLcode cstat = CURLE_OK; + CURL* curl = NULL; + OCbytes* buf = NULL; + + /* Create a CURL instance */ + stat = occurlopen(&curl); + if(stat != OC_NOERR) return stat; + + /* use a very short timeout: 10 seconds */ + cstat = curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)10); + if (cstat != CURLE_OK) + goto done; + + /* fail on HTTP 400 code errors */ + cstat = curl_easy_setopt(curl, CURLOPT_FAILONERROR, (long)1); + if (cstat != CURLE_OK) + goto done; + + /* Try to get the file */ + buf = ocbytesnew(); + stat = ocfetchurl(curl,url,buf,NULL); + if(stat == OC_NOERR) { + /* Don't trust curl to return an error when request gets 404 */ + long http_code = 0; + cstat = curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, &http_code); + if (cstat != CURLE_OK) + goto done; + if(http_code >= 400) { + cstat = CURLE_HTTP_RETURNED_ERROR; + goto done; + } + } else + goto done; + +done: + ocbytesfree(buf); + occurlclose(curl); + if(cstat != CURLE_OK) { + oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); + stat = OC_EDAPSVC; + } + return OCTHROW(stat); +} + + diff --git a/extern/src_netcdf4/ochttp.h b/extern/src_netcdf4/ochttp.h new file mode 100644 index 0000000..a0e26f9 --- /dev/null +++ b/extern/src_netcdf4/ochttp.h @@ -0,0 +1,22 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef HTTP_H +#define HTTP_H 1 + +extern int curlopen(CURL** curlp); +extern void curlclose(CURL*); + +extern int ocfetchurl(CURL*, const char*, OCbytes*, long*); +extern int ocfetchurl_file(CURL*, const char*, FILE*, unsigned long*, long*); + +extern long ocfetchhttpcode(CURL* curl); + +extern int ocfetchlastmodified(CURL* curl, char* url, long* filetime); + +extern int occurlopen(CURL** curlp); +extern void occurlclose(CURL* curlp); + +extern int ocping(const char* url); + +#endif /*HTTP_H*/ diff --git a/extern/src_netcdf4/ocinternal.c b/extern/src_netcdf4/ocinternal.c new file mode 100644 index 0000000..e817e39 --- /dev/null +++ b/extern/src_netcdf4/ocinternal.c @@ -0,0 +1,574 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "ocinternal.h" +#include "ocdebug.h" +#include "ocdata.h" +#include "occontent.h" +#include "occlientparams.h" +#include "ocrc.h" +#include "occurlfunctions.h" + +#include "ochttp.h" +#include "ocread.h" + +/* Note: TMPPATH must end in '/' */ +#ifdef __CYGWIN__ +#define TMPPATH1 "/cygdrive/c/temp/" +#define TMPPATH2 "./" +#elifdef WIN32 +#define TMPPATH1 "c:\\temp/" +#define TMPPATH2 ".\\" +#else +#define TMPPATH1 "/tmp/" +#define TMPPATH2 "./" +#endif + +/* Define default rc files and aliases*/ +static char* rcfilenames[3] = {".dodsrc",".ocrc",NULL}; + +static int ocextractddsinmemory(OCstate*,OCtree*,int); +static int ocextractddsinfile(OCstate*,OCtree*,int); +static char* constraintescape(const char* url); +static OCerror createtempfile(OCstate*,OCtree*); +static int createtempfile1(char*,char**); + +static void ocsetcurlproperties(OCstate*); + +extern OCnode* makeunlimiteddimension(void); + +#ifdef WIN32 +#include +#define _S_IREAD 256 +#define _S_IWRITE 128 +#else +#include +#endif + +/* Global flags*/ +int oc_curl_file_supported; +int oc_curl_https_supported; + +int +ocinternalinitialize(void) +{ + int stat = OC_NOERR; + + /* Compute some xdr related flags */ + xxdr_init(); + + oc_loginit(); + + /* Determine if this version of curl supports + "file://..." &/or "https://..." urls. + */ + { + const char* const* proto; /*weird*/ + curl_version_info_data* curldata; + curldata = curl_version_info(CURLVERSION_NOW); + oc_curl_file_supported = 0; + oc_curl_https_supported = 0; + for(proto=curldata->protocols;*proto;proto++) { + if(strcmp("file",*proto)==0) {oc_curl_file_supported=1;break;} + if(strcmp("https",*proto)==0) {oc_curl_https_supported=1;break;} + } + if(ocdebug > 0) { + oc_log(LOGNOTE,"Curl file:// support = %d",oc_curl_file_supported); + oc_log(LOGNOTE,"Curl https:// support = %d",oc_curl_file_supported); + } + } + + /* compile the .dodsrc, if any */ + { + char* path = NULL; + char* homepath = NULL; + char** alias; + FILE* f = NULL; + /* locate the configuration files: . first in '.', then $HOME */ + for(alias=rcfilenames;*alias;alias++) { + path = (char*)malloc(strlen("./")+strlen(*alias)+1); + if(path == NULL) return OC_ENOMEM; + strcpy(path,"./"); + strcat(path,*alias); + /* see if file is readable */ + f = fopen(path,"r"); + if(f != NULL) break; + if(path != NULL) {free(path); path = NULL;} /* cleanup */ + } + if(f == NULL) { /* try $HOME */ + OCASSERT(path == NULL); + homepath = getenv("HOME"); + if (homepath!= NULL) { + for(alias=rcfilenames;*alias;alias++) { + path = (char*)malloc(strlen(homepath)+1+strlen(*alias)+1); + if(path == NULL) return OC_ENOMEM; + strcpy(path,homepath); + strcat(path,"/"); + strcat(path,*alias); + f = fopen(path,"r"); + if(f != NULL) break; + if(path != NULL) {free(path); path=NULL;} + } + } + } + if(f == NULL) { + oc_log(LOGDBG,"Cannot find runtime configuration file"); + } else { + OCASSERT(path != NULL); + fclose(f); + if(ocdebug > 1) + fprintf(stderr, "DODS RC file: %s\n", path); + if(ocdodsrc_read(*alias,path) == 0) + oc_log(LOGERR, "Error parsing %s\n",path); + } + if(path != NULL) free(path); + } + return OCTHROW(stat); +} + +/**************************************************/ +OCerror +ocopen(OCstate** statep, const char* url) +{ + int stat = OC_NOERR; + OCstate * state = NULL; + OCURI* tmpurl = NULL; + CURL* curl = NULL; /* curl handle*/ + + if(!ocuriparse(url,&tmpurl)) {OCTHROWCHK(stat=OC_EBADURL); goto fail;} + + stat = occurlopen(&curl); + if(stat != OC_NOERR) {OCTHROWCHK(stat); goto fail;} + + state = (OCstate*)ocmalloc(sizeof(OCstate)); /* ocmalloc zeros memory*/ + if(state == NULL) {OCTHROWCHK(stat=OC_ENOMEM); goto fail;} + + /* Setup DAP state*/ + state->magic = OCMAGIC; + state->curl = curl; + state->trees = oclistnew(); + state->uri = tmpurl; + if(!ocuridecodeparams(state->uri)) { + oc_log(LOGWARN,"Could not parse client parameters"); + } + state->packet = ocbytesnew(); + ocbytessetalloc(state->packet,DFALTPACKETSIZE); /*initial reasonable size*/ + + /* set curl properties for this link */ + ocsetcurlproperties(state); + + /* Set up list to support reuse/reclamation of OCcontent objects. */ + state->contentlist = NULL; + + if(statep) *statep = state; + return OCTHROW(stat); + +fail: + ocurifree(tmpurl); + if(state != NULL) ocfree(state); + if(curl != NULL) occurlclose(curl); + return OCTHROW(stat); +} + +OCerror +ocfetchf(OCstate* state, const char* constraint, OCdxd kind, OCflags flags, + OCnode** rootp) +{ + OCtree* tree = NULL; + OCnode* root = NULL; + OCerror stat = OC_NOERR; + + tree = (OCtree*)ocmalloc(sizeof(OCtree)); + MEMCHECK(tree,OC_ENOMEM); + memset((void*)tree,0,sizeof(OCtree)); + tree->dxdclass = kind; + tree->state = state; + tree->constraint = constraintescape(constraint); + if(tree->constraint == NULL) + tree->constraint = nulldup(constraint); + + /* Set curl properties: pwd, flags, proxies, ssl */ + if((stat=ocset_user_password(state))!= OC_NOERR) goto fail; + if((stat=ocset_curl_flags(state)) != OC_NOERR) goto fail; + if((stat=ocset_proxy(state)) != OC_NOERR) goto fail; + if((stat=ocset_ssl(state)) != OC_NOERR) goto fail; + + ocbytesclear(state->packet); + + switch (kind) { + case OCDAS: + stat = readDAS(state,tree); + if(stat == OC_NOERR) { + tree->text = ocbytesdup(state->packet); + if(tree->text == NULL) stat = OC_EDAS; + } + break; + case OCDDS: + stat = readDDS(state,tree); + if(stat == OC_NOERR) { + tree->text = ocbytesdup(state->packet); + if(tree->text == NULL) stat = OC_EDDS; + } + break; + case OCDATADDS: + if((flags & OCONDISK) != 0) {/* store in file */ + /* Create the datadds file immediately + so that DRNO can reference it*/ + /* Make the tmp file*/ + stat = createtempfile(state,tree); + if(stat) {OCTHROWCHK(stat); goto unwind;} + stat = readDATADDS(state,tree,flags); + if(stat == OC_NOERR) { + /* Separate the DDS from data and return the dds; + will modify packet */ + stat = ocextractddsinfile(state,tree,flags); + } + } else { /*in memory*/ + stat = readDATADDS(state,tree,flags); + if(stat == OC_NOERR) { + /* Separate the DDS from data and return the dds; + will modify packet */ + stat = ocextractddsinmemory(state,tree,flags); + } + } + break; + }/*switch*/ + if(stat != OC_NOERR) { + /* Obtain any http code */ + state->error.httpcode = ocfetchhttpcode(state->curl); + if(state->error.httpcode >= 400) { + oc_log(LOGWARN,"oc_open: Could not read url; http error = %l",state->error.httpcode); + } else { + oc_log(LOGWARN,"oc_open: Could not read url"); + } + return OCTHROW(stat); + } + + tree->nodes = NULL; + stat = DAPparse(state,tree,tree->text); + /* Check and report on an error return from the server */ + if(stat == OC_EDAPSVC && state->error.code != NULL) { + oc_log(LOGERR,"oc_open: server error retrieving url: code=%s message=\"%s\"", + state->error.code, + (state->error.message?state->error.message:"")); + } + if(stat) {OCTHROWCHK(stat); goto unwind;} + root = tree->root; + /* make sure */ + tree->root = root; + root->tree = tree; + + /* Verify the parse */ + switch (kind) { + case OCDAS: + if(root->octype != OC_Attributeset) + {OCTHROWCHK(stat=OC_EDAS); goto unwind;} + break; + case OCDDS: + if(root->octype != OC_Dataset) + {OCTHROWCHK(stat=OC_EDDS); goto unwind;} + break; + case OCDATADDS: + if(root->octype != OC_Dataset) + {OCTHROWCHK(stat=OC_EDATADDS); goto unwind;} + /* Modify the tree kind */ + tree->dxdclass = OCDATADDS; + break; + default: return OC_EINVAL; + } + + if(kind != OCDAS) { + /* Process ocnodes to assign offsets and sizes where possible */ + occomputeskipdata(state,root); + /* Process ocnodes to mark those that are cacheable */ + ocmarkcacheable(state,root); + /* Process ocnodes to handle various semantic issues*/ + occomputesemantics(tree->nodes); + } + + /* Process ocnodes to compute name info*/ + occomputefullnames(tree->root); + + if(kind == OCDATADDS) { + if((flags & OCONDISK) != 0) { + tree->data.xdrs = xxdr_filecreate(tree->data.file,tree->data.bod); + } else { + /* Switch to zero based memory */ + tree->data.xdrs + = xxdr_memcreate(tree->data.memory,tree->data.datasize,tree->data.bod); + } + MEMCHECK(tree->data.xdrs,OC_ENOMEM); + } + + /* Put root into the state->trees list */ + oclistpush(state->trees,(ocelem)root); + + if(rootp) *rootp = root; + return stat; + +unwind: + ocfreetree(tree); +fail: + return OCTHROW(stat); +} + +void +occlose(OCstate* state) +{ + unsigned int i; + if(state == NULL) return; + + /* Warning: ocfreeroot will attempt to remove the root from state->trees */ + /* Ok in this case because we are popping the root out of state->trees */ + for(i=0;itrees);i++) { + OCnode* root = (OCnode*)oclistpop(state->trees); + ocfreeroot(root); + } + oclistfree(state->trees); + ocurifree(state->uri); + ocbytesfree(state->packet); + ocfree(state->error.code); + ocfree(state->error.message); + if(state->contentlist != NULL) { + struct OCcontent* next; + struct OCcontent* curr = state->contentlist; + while(curr != NULL) { + next = curr->next; + ocfree(curr); + curr = next; + } + } + ocfree(state->curlflags.useragent); + ocfree(state->curlflags.cookiejar); + ocfree(state->curlflags.cookiefile); + ocfree(state->ssl.certificate); + ocfree(state->ssl.key); + ocfree(state->ssl.keypasswd); + ocfree(state->ssl.cainfo); + ocfree(state->ssl.capath); + ocfree(state->proxy.host); + ocfree(state->creds.username); + ocfree(state->creds.password); + if(state->curl != NULL) occurlclose(state->curl); + ocfree(state); +} + +static OCerror +ocextractddsinmemory(OCstate* state, OCtree* tree, OCflags flags) +{ + OCerror stat = OC_NOERR; + size_t ddslen, bod, bodfound; + /* Read until we find the separator (or EOF)*/ + bodfound = findbod(state->packet,&bod,&ddslen); + if(!bodfound) {/* No BOD; pretend */ + bod = tree->data.bod; + ddslen = tree->data.datasize; + } + tree->data.bod = bod; + tree->data.ddslen = ddslen; + /* copy out the dds */ + if(ddslen > 0) { + tree->text = (char*)ocmalloc(ddslen+1); + memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen); + tree->text[ddslen] = '\0'; + } else + tree->text = NULL; + /* Extract the inmemory contents */ + tree->data.memory = ocbytesextract(state->packet); +#ifdef OCIGNORE + /* guarantee the data part is on an 8 byte boundary */ + if(tree->data.bod % 8 != 0) { + unsigned long count = tree->data.datasize - tree->data.bod; + memcpy(tree->xdrmemory,tree->xdrmemory+tree->data.bod,count); + tree->data.datasize = count; + tree->data.bod = 0; + tree->data.ddslen = 0; + } +#endif + if(tree->text == NULL) stat = OC_EDATADDS; + return OCTHROW(stat); +} + +static OCerror +ocextractddsinfile(OCstate* state, OCtree* tree, OCflags flags) +{ + OCerror stat = OC_NOERR; + size_t ddslen, bod, bodfound; + + /* Read until we find the separator (or EOF)*/ + ocbytesclear(state->packet); + rewind(tree->data.file); + bodfound = 0; + do { + char chunk[1024]; + size_t count; + /* read chunks of the file until we find the separator*/ + count = fread(chunk,1,sizeof(chunk),tree->data.file); + if(count <= 0) break; /* EOF;*/ + ocbytesappendn(state->packet,chunk,count); + bodfound = findbod(state->packet,&bod,&ddslen); + } while(!bodfound); + if(!bodfound) {/* No BOD; pretend */ + bod = tree->data.bod; + ddslen = tree->data.datasize; + } + tree->data.bod = bod; + tree->data.ddslen = ddslen; + /* copy out the dds */ + if(ddslen > 0) { + tree->text = (char*)ocmalloc(ddslen+1); + memcpy((void*)tree->text,(void*)ocbytescontents(state->packet),ddslen); + tree->text[ddslen] = '\0'; + } else + tree->text = NULL; + /* reset the position of the tmp file*/ + fseek(tree->data.file,tree->data.bod,SEEK_SET); + if(tree->text == NULL) stat = OC_EDATADDS; + return OCTHROW(stat); +} + +static OCerror +createtempfile(OCstate* state, OCtree* tree) +{ + int fd; + char* name = NULL; + fd = createtempfile1(TMPPATH1,&name); + if(fd < 0) + fd = createtempfile1(TMPPATH2,&name); + if(fd < 0) { + oc_log(LOGERR,"oc_open: attempt to open tmp file failed: %s",name); + return errno; + } +#ifdef OCDEBUG + oc_log(LOGNOTE,"oc_open: using tmp file: %s",name); +#endif + tree->data.filename = name; /* remember our tmp file name */ + tree->data.file = fdopen(fd,"w+"); + if(tree->data.file == NULL) return OC_EOPEN; + /* unlink the temp file so it will automatically be reclaimed */ + if(ocdebug == 0) unlink(tree->data.filename); + return OC_NOERR; +} + +int +createtempfile1(char* tmppath, char** tmpnamep) +{ + int fd = 0; + char* tmpname = NULL; + tmpname = (char*)malloc(strlen(tmppath)+strlen("dataddsXXXXXX")+1); + if(tmpname == NULL) return -1; + strcpy(tmpname,tmppath); +#ifdef HAVE_MKSTEMP + strcat(tmpname,"dataddsXXXXXX"); + /* Note Potential problem: old versions of this function + leave the file in mode 0666 instead of 0600 */ + fd = mkstemp(tmpname); +#else /* !HAVE_MKSTEMP */ + /* Need to simulate by using some kind of pseudo-random number */ + strcat(tmpname,"datadds"); + { + int rno = rand(); + char spid[7]; + if(rno < 0) rno = -rno; + sprintf(spid,"%06d",rno); + strcat(tmpname,spid); +# ifdef WIN32 + fd=open(tmpname,O_RDWR|O_BINARY|O_CREAT|O_EXCL|FILE_ATTRIBUTE_TEMPORARY, _S_IREAD|_S_IWRITE); +# else + fd=open(tmpname,O_RDWR|O_CREAT|O_EXCL, S_IRWXU); +# endif + } +#endif /* !HAVE_MKSTEMP */ + if(tmpname == NULL) return -1; + if(tmpnamep) *tmpnamep = tmpname; + return fd; +} + +/* Allow these (non-alpha-numerics) to pass thru */ +static char okchars[] = "&/:;,.=?@'\"<>{}!|\\^[]`~"; +static char hexdigits[] = "0123456789abcdef"; + + +/* Modify constraint to use %XX escapes */ +static char* +constraintescape(const char* url) +{ + size_t len; + char* p; + int c; + char* eurl; + + if(url == NULL) return NULL; + len = strlen(url); + eurl = ocmalloc(1+3*len); /* worst case: c -> %xx */ + MEMCHECK(eurl,NULL); + p = eurl; + *p = '\0'; + while((c=*url++)) { + if(c >= '0' && c <= '9') {*p++ = c;} + else if(c >= 'a' && c <= 'z') {*p++ = c;} + else if(c >= 'A' && c <= 'Z') {*p++ = c;} + else if(strchr(okchars,c) != NULL) {*p++ = c;} + else { + *p++ = '%'; + *p++ = hexdigits[(c & 0xf0)>>4]; + *p++ = hexdigits[(c & 0xf)]; + } + } + *p = '\0'; + return eurl; +} + +OCerror +ocupdatelastmodifieddata(OCstate* state) +{ + OCerror status = OC_NOERR; + long lastmodified; + char* base = NULL; + base = ocuribuild(state->uri,NULL,NULL,OCURIENCODE); + status = ocfetchlastmodified(state->curl, base, &lastmodified); + free(base); + if(status == OC_NOERR) { + state->datalastmodified = lastmodified; + } + return status; +} + +/* + Set curl properties for link based on rc files +*/ +static void +ocsetcurlproperties(OCstate* state) +{ + CURLcode cstat = CURLE_OK; + + /* process the triple store wrt to this state */ + if(ocdodsrc_process(state) != OC_NOERR) { + oc_log(LOGERR,"Malformed .opendaprc configuration file"); + goto fail; + } + if(state->creds.username == NULL && state->creds.password == NULL) { + if(state->uri->user != NULL && state->uri->password != NULL) { + /* this overrides .dodsrc */ + if(state->creds.password) free(state->creds.password); + state->creds.password = nulldup(state->uri->password); + if(state->creds.username) free(state->creds.username); + state->creds.username = nulldup(state->uri->user); + } + } + return; + +fail: + if(cstat != CURLE_OK) + oc_log(LOGERR, "curl error: %s", curl_easy_strerror(cstat)); + return; +} diff --git a/extern/src_netcdf4/ocinternal.h b/extern/src_netcdf4/ocinternal.h new file mode 100644 index 0000000..ccb6c33 --- /dev/null +++ b/extern/src_netcdf4/ocinternal.h @@ -0,0 +1,198 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCINTERNAL_H +#define OCINTERNAL_H + +#include "config.h" + +#ifdef _AIX +#include +#endif + +#include +#include +#include +#ifndef WIN32 +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#define CURL_DISABLE_TYPECHECK 1 +#include + +#include "oclist.h" +#include "ocbytes.h" +#include "ocuri.h" + +#define OCCACHEPOS + +#include "oc.h" +#include "ocdatatypes.h" +#include "occonstraints.h" +#include "ocnode.h" +#include "ocutil.h" +#include "oclog.h" +#include "xxdr.h" +#include "ocdata.h" + +#ifndef nulldup +#define nulldup(s) (s==NULL?NULL:strdup(s)) +#endif + +#define nullstring(s) (s==NULL?"(null)":s) +#define PATHSEPARATOR "." + +/* Default initial memory packet size */ +#define DFALTPACKETSIZE 0x20000 /*approximately 100k bytes*/ + +/* Default maximum memory packet size */ +#define DFALTMAXPACKETSIZE 0x3000000 /*approximately 50M bytes*/ + +/* Extend the OCdxd type */ +#define OCVER 3 + +/* Define a magic number to mark externally visible oc objects */ +#define OCMAGIC ((unsigned int)0x0c0c0c0c) /*clever, huh?*/ + +/*! Specifies the OCstate. */ +typedef struct OCstate +{ + unsigned int magic; /* Mark each structure type */ + CURL* curl; /* curl handle*/ + OClist* trees; /* list ; all root objects */ + OCURI* uri; /* base URI*/ + OCbytes* packet; /* shared by all trees during construction */ + /* OCContent information */ + struct OCcontent* contentlist; + struct OCerrdata {/* Hold info for an error return from server */ + char* code; + char* message; + long httpcode; + char curlerrorbuf[CURL_ERROR_SIZE]; /* to get curl error message */ + } error; + /* Store .rc file info */ + struct OCcurlflags { + int compress; + int verbose; + int timeout; + int followlocation; + int maxredirs; + char* useragent; + char* cookiejar; + char* cookiefile; + } curlflags; + struct OCSSL { + int validate; + char* certificate; + char* key; + char* keypasswd; + char* cainfo; /* certificate authority */ + char* capath; + int verifypeer; + } ssl; + struct OCproxy { + char *host; + int port; + } proxy; + struct OCcredentials { + char *username; + char *password; + } creds; + long ddslastmodified; + long datalastmodified; +} OCstate; + + +/*! Specifies all the info about a particular DAP tree + i.e. DAS, DDS, or DATADDS as obtained from a fetch response + This is associated with the root object. +*/ +typedef struct OCtree +{ + OCdxd dxdclass; + char* constraint; + char* text; + struct OCnode* root; /* cross link */ + struct OCstate* state; /* cross link */ + OClist* nodes; /* all nodes in tree*/ + /* when dxdclass == OCDATADDS */ + struct { + char* memory; /* allocated memory if OC_INMEMORY is set */ + char* filename; + FILE* file; + unsigned long datasize; /* xdr size on disk or in memory */ + unsigned long bod; /* offset of the beginning of packet data */ + unsigned long ddslen; /* length of ddslen (assert(ddslen <= bod)) */ + XXDR* xdrs; /* access either memory or file */ + } data; +} OCtree; + +/* (Almost) All shared procedure definitions are kept here + except for: ocdebug.h ocutil.h + The true external interface is defined in oc.h +*/ + +/* Location: ocnode.c */ +extern OCnode* ocmakenode(char* name, OCtype ptype, OCnode* root); +extern void occollectpathtonode(OCnode* node, OClist* path); +extern void occomputefullnames(OCnode* root); +extern void occomputesemantics(OClist*); +extern void ocaddattribute(OCattribute* attr, OCnode* parent); +extern OCattribute* ocmakeattribute(char* name, OCtype ptype, OClist* values); +extern size_t ocsetsize(OCnode* node); +extern OCerror occorrelate(OCnode*,OCnode*); +extern OCerror occomputeskipdata(OCstate*, OCnode*); +extern void ocmarkcacheable(OCstate* state, OCnode* ddsroot); + +/* Location: dapparselex.c*/ +extern int dapdebug; +extern OCerror DAPparse(OCstate*, struct OCtree*, char*); +extern char* dimnameanon(char* basename, unsigned int index); + +/* Location: ceparselex.c*/ +extern int cedebug; +extern OClist* CEparse(OCstate*,char* input); + +/* Location: ocinternal.c*/ +extern OCerror ocopen(OCstate** statep, const char* url); +extern void occlose(OCstate* state); + +extern OCerror ocfetchf(OCstate*, const char*, OCdxd, OCflags, OCnode**); + +/* Location: ocinternal.c */ +extern int oc_network_order; +extern int oc_invert_xdr_double; +extern int ocinternalinitialize(void); + +/* Location: ocnode.c */ +extern void ocfreetree(OCtree* tree); +extern void ocfreeroot(OCnode* root); +extern void ocfreenodes(OClist*); + +extern void ocddsclear(struct OCstate*); +extern void ocdasclear(struct OCstate*); +extern void ocdataddsclear(struct OCstate*); +extern void* oclinearize(OCtype etype, unsigned int, char**); + +/* Merge DAS with DDS or DATADDS*/ +extern int ocddsdasmerge(struct OCstate*, OCnode* das, OCnode* dds); + +extern OCerror ocupdatelastmodifieddata(OCstate* state); + +extern int ocinternalinitialize(void); + + +extern OCerror ocsetrcfile(char* rcfile); + +/* Global stateflags */ +extern int oc_curl_file_supported; +extern int oc_curl_https_supported; + +#endif /*COMMON_H*/ diff --git a/extern/src_netcdf4/oclist.c b/extern/src_netcdf4/oclist.c new file mode 100644 index 0000000..e4860da --- /dev/null +++ b/extern/src_netcdf4/oclist.c @@ -0,0 +1,171 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" + +#include +#include +#include + +#include "oclist.h" + +static ocelem ocDATANULL = (ocelem)0; +/*static int ocinitialized=0;*/ + +int oclistnull(ocelem e) {return e == ocDATANULL;} + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define DEFAULTALLOC 16 +#define ALLOCINCR 16 + +OClist* oclistnewn(int prealloc) +{ + OClist* l; +/* + if(!ocinitialized) { + memset((void*)&ocDATANULL,0,sizeof(ocelem)); + ocinitialized = 1; + } +*/ + if(prealloc < 0) prealloc = 0; + l = (OClist*)malloc(sizeof(OClist)); + if(l) { + l->alloc=prealloc; + l->length=prealloc; + l->content=(prealloc==0?NULL:(ocelem*)calloc(prealloc,sizeof(ocelem))); + if(l == NULL) {free(l);return 0;} + } + return l; +} + +int +oclistfree(OClist* l) +{ + if(l) { + l->alloc = 0; + if(l->content != NULL) {free(l->content); l->content = NULL;} + free(l); + } + return TRUE; +} + +int +oclistsetalloc(OClist* l, unsigned int sz) +{ + ocelem* newcontent; + if(l == NULL) return FALSE; + if(sz <= 0) {sz = (l->length?2*l->length:DEFAULTALLOC);} + if(l->alloc >= sz) {return TRUE;} + newcontent=(ocelem*)calloc(sz,sizeof(ocelem)); + if(l->alloc > 0 && l->length > 0 && l->content != NULL) { + memcpy((void*)newcontent,(void*)l->content,sizeof(ocelem)*l->length); + free(l->content); + } + l->content=newcontent; + l->alloc=sz; + return TRUE; +} + +int +oclistsetlength(OClist* l, unsigned int sz) +{ + if(l == NULL) return FALSE; + if(sz > l->alloc && !oclistsetalloc(l,sz)) return FALSE; + l->length = sz; + return TRUE; +} + +ocelem +oclistget(OClist* l, unsigned int index) +{ + if(l == NULL || l->length == 0) return ocDATANULL; + if(index >= l->length) return ocDATANULL; + return l->content[index]; +} + +int +oclistset(OClist* l, unsigned int index, ocelem elem) +{ + if(l == NULL) return FALSE; + if(index >= l->length) return FALSE; + l->content[index] = elem; + return TRUE; +} + +/* Insert at position i of l; will push up elements i..|seq|. */ +int +oclistinsert(OClist* l, unsigned int index, ocelem elem) +{ + unsigned int i; + if(l == NULL) return FALSE; + if(index > l->length) return FALSE; + oclistsetalloc(l,0); + for(i=l->length;i>index;i--) l->content[i] = l->content[i-1]; + l->content[index] = elem; + l->length++; + return TRUE; +} + +int +oclistpush(OClist* l, ocelem elem) +{ + if(l == NULL) return FALSE; + if(l->length >= l->alloc) oclistsetalloc(l,0); + l->content[l->length] = elem; + l->length++; + return TRUE; +} + +ocelem +oclistpop(OClist* l) +{ + if(l == NULL || l->length == 0) return ocDATANULL; + l->length--; + return l->content[l->length]; +} + +ocelem +oclisttop(OClist* l) +{ + if(l == NULL || l->length == 0) return ocDATANULL; + return l->content[l->length - 1]; +} + +ocelem +oclistremove(OClist* l, unsigned int i) +{ + unsigned int len; + ocelem elem; + if(l == NULL || (len=l->length) == 0) return ocDATANULL; + if(i >= len) return ocDATANULL; + elem = l->content[i]; + for(i++;icontent[i-1] = l->content[i]; + l->length--; + return elem; +} + +/* Duplicate and return the content (null terminate) */ +ocelem* +oclistdup(OClist* l) +{ + ocelem* result = (ocelem*)malloc(sizeof(ocelem)*(l->length+1)); + memcpy((void*)result,(void*)l->content,sizeof(ocelem)*l->length); + result[l->length] = (ocelem)0; + return result; +} + +int +oclistcontains(OClist* list, ocelem elem) +{ + unsigned int i; + for(i=0;ialloc)) +#define oclistcontents(l) ((l)->content) +#define oclistlength(l) ((l)?(l)->length:0U) + +#endif /*OCLIST_H*/ + diff --git a/extern/src_netcdf4/oclog.c b/extern/src_netcdf4/oclog.c new file mode 100644 index 0000000..e58861c --- /dev/null +++ b/extern/src_netcdf4/oclog.c @@ -0,0 +1,132 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" + +#include "ocinternal.h" +#include +#include + +#define PREFIXLEN 8 + +#define ENVFLAG "OCLOGFILE" + +static int ocloginit = 0; +static int oclogging = 0; +static char* oclogfile = NULL; +static FILE* oclogstream = NULL; + +void +oc_loginit(void) +{ + ocloginit = 1; + oc_setlogging(0); + oclogfile = NULL; + oclogstream = NULL; + /* Use environment variables to preset oclogging state*/ + /* I hope this is portable*/ + if(getenv(ENVFLAG) != NULL) { + const char* file = getenv(ENVFLAG); + oc_setlogging(1); + oc_logopen(file); + } +} + +void +oc_setlogging(int tf) +{ + if(!ocloginit) oc_loginit(); + oclogging = tf; +} + +void +oc_logopen(const char* file) +{ + if(!ocloginit) oc_loginit(); + if(oclogfile != NULL) { + fclose(oclogstream); + free(oclogfile); + oclogfile = NULL; + } + if(file == NULL || strlen(file) == 0) { + /* use stderr*/ + oclogstream = stderr; + oclogfile = NULL; + } else { + int fd; + oclogfile = (char*)malloc(strlen(file)+1); + strcpy(oclogfile,file); + oclogstream = NULL; + /* We need to deal with this file carefully + to avoid unauthorized access*/ + fd = open(oclogfile,O_WRONLY|O_APPEND|O_CREAT,0600); + if(fd >= 0) { + oclogstream = fdopen(fd,"a"); + } else { + free(oclogfile); + oclogfile = NULL; + oc_setlogging(0); + } + } +} + +void +oc_logclose(void) +{ + if(oclogfile != NULL && oclogstream != NULL) { + fclose(oclogstream); + oclogstream = NULL; + if(oclogfile != NULL) free(oclogfile); + oclogfile = NULL; + } +} + +void +oc_log(int tag, const char* fmt, ...) +{ + va_list args; + char* prefix; + if(!oclogging || oclogstream == NULL) return; + + switch (tag) { + case LOGWARN: prefix = "Warning:"; break; + case LOGERR: prefix = "Error: "; break; + case LOGNOTE: prefix = "Note: "; break; + case LOGDBG: prefix = "Debug: "; break; + default: + fprintf(oclogstream,"Error: Bad log prefix: %d\n",tag); + prefix = "Error: "; + break; + } + fprintf(oclogstream,"%s:",prefix); + + if(fmt != NULL) { + va_start(args, fmt); + vfprintf(oclogstream, fmt, args); + va_end( args ); + } + fprintf(oclogstream, "\n" ); + fflush(oclogstream); +} + +void +oc_logtext(int tag, const char* text) +{ + char line[1024]; + size_t delta = 0; + const char* eol = text; + + if(!oclogging || oclogstream == NULL) return; + + while(*text) { + eol = strchr(text,'\n'); + if(eol == NULL) + delta = strlen(text); + else + delta = (eol - text); + if(delta > 0) memcpy(line,text,delta); + line[delta] = '\0'; + fprintf(oclogstream," %s\n",line); + text = eol+1; + } +} diff --git a/extern/src_netcdf4/oclog.h b/extern/src_netcdf4/oclog.h new file mode 100644 index 0000000..0dd3707 --- /dev/null +++ b/extern/src_netcdf4/oclog.h @@ -0,0 +1,20 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCLOG_H +#define OCLOG_H + +#define LOGNOTE 0 +#define LOGWARN 1 +#define LOGERR 2 +#define LOGDBG 3 + +extern void oc_loginit(void); +extern void oc_setlogging(int tf); +extern void oc_logopen(const char* file); +extern void oc_logclose(void); + +extern void oc_log(int tag, const char* fmt, ...); +extern void oc_logtext(int tag, const char* text); + +#endif /*OCLOG_H*/ diff --git a/extern/src_netcdf4/ocnode.c b/extern/src_netcdf4/ocnode.c new file mode 100644 index 0000000..27983fb --- /dev/null +++ b/extern/src_netcdf4/ocnode.c @@ -0,0 +1,757 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#include "ocinternal.h" +#include "ocdebug.h" + +static const unsigned int MAX_UINT = 0xffffffff; + +static OCerror occomputeskipdatar(OCstate*, OCnode*, ocoffset_t offset); +static int mergedas1(OCnode* dds, OCnode* das); +static int converttype(OCtype etype, char* value, char* memory); +static char* pathtostring(OClist* path, char* separator, int usecdfname); +static void computefullname(OCnode* node); + +/* Process ocnodes to fix various semantic issues*/ +void +occomputesemantics(OClist* ocnodes) +{ + unsigned int i; + OCASSERT((ocnodes != NULL)); + for(i=0;ioctype == OC_Dimension && node->dim.array != NULL) { + node->container = node->dim.array->container; + } + } +} + +void +occomputefullnames(OCnode* root) +{ + unsigned int i; + if(root->name != NULL) computefullname(root); + if(root->subnodes != NULL) { /* recurse*/ + for(i=0;isubnodes);i++) { + OCnode* node = (OCnode*)oclistget(root->subnodes,i); + occomputefullnames(node); + } + } +} + +static void +computefullname(OCnode* node) +{ + char* tmp; + char* fullname; + OClist* path; + + OCASSERT((node->name != NULL)); + path = oclistnew(); + occollectpathtonode(node,path); + tmp = pathtostring(path,PATHSEPARATOR,1); + if(tmp == NULL) { + fullname = nulldup(node->name); + } else { + fullname = tmp; + } + node->fullname = fullname; + oclistfree(path); +} + +/* Convert path to a string; leave off the dataset name*/ +static char* +pathtostring(OClist* path, char* separator, int usecdfname) +{ + int slen,i,len; + char* pathname; + if(path == NULL || (len = oclistlength(path))==0) return NULL; + for(slen=0,i=0;icontainer == NULL || node->name == NULL) continue; + slen += strlen(node->name); + } + slen += ((len-1)*strlen(separator)); + slen += 1; /* for null terminator*/ + pathname = (char*)ocmalloc(slen); + MEMCHECK(pathname,NULL); + pathname[0] = '\0'; + for(i=0;icontainer == NULL || node->name == NULL) continue; + if(strlen(pathname) > 0) strcat(pathname,separator); + strcat(pathname,node->name); + } + return pathname; +} + +/* Collect the set of nodes ending in "node"*/ +void +occollectpathtonode(OCnode* node, OClist* path) +{ + if(node == NULL) return; + occollectpathtonode(node->container,path); + oclistpush(path,(ocelem)node); +} + +OCnode* +ocmakenode(char* name, OCtype ptype, OCnode* root) +{ + OCnode* cdf = (OCnode*)ocmalloc(sizeof(OCnode)); + MEMCHECK(cdf,(OCnode*)NULL); + memset((void*)cdf,0,sizeof(OCnode)); + cdf->magic = OCMAGIC; + cdf->name = (name?nulldup(name):NULL); + cdf->octype = ptype; + cdf->array.dimensions = NULL; + cdf->root = root; + return cdf; +} + +OCattribute* +makeattribute(char* name, OCtype ptype, OClist* values) +{ + OCattribute* att = (OCattribute*)ocmalloc(sizeof(OCattribute)); /* ocmalloc zeros*/ + MEMCHECK(att,(OCattribute*)NULL); + att->name = nulldup(name); + att->etype = ptype; + att->nvalues = oclistlength(values); + att->values = NULL; + if(att->nvalues > 0) { + int i; + att->values = (char**)ocmalloc(sizeof(char*)*att->nvalues); + for(i=0;invalues;i++) + att->values[i] = nulldup((char*)oclistget(values,i)); + } + return att; +} + +static void +marklostattribute(OCnode* att) +{ + oc_log(LOGWARN,"Lost attribute: %s",att->name); +} + +void* +oclinearize(OCtype etype, unsigned int nstrings, char** strings) +{ + int i; + size_t typesize; + char* memp; + char* memory; + + if(nstrings == 0) return NULL; + typesize = octypesize(etype); + memory = (char*)ocmalloc(nstrings*typesize); + MEMCHECK(memory,NULL); + memp = memory; + for(i=0;i OC_BYTE_MAX || iv < OC_BYTE_MIN) {iv = OC_BYTE_MAX; outofrange = 1;} + *((signed char*)memory) = (signed char)iv; + break; + case OC_UByte: + if(sscanf(value,"%lu",&uiv) != 1) goto fail; + else if(uiv > OC_UBYTE_MAX) {uiv = OC_UBYTE_MAX; outofrange = 1;} + *((unsigned char*)memory) = (unsigned char)uiv; + break; + case OC_Int16: + if(sscanf(value,"%ld",&iv) != 1) goto fail; + else if(iv > OC_INT16_MAX || iv < OC_INT16_MIN) {iv = OC_INT16_MAX; outofrange = 1;} + *((signed short*)memory) = (signed short)iv; + break; + case OC_UInt16: + if(sscanf(value,"%lu",&uiv) != 1) goto fail; + else if(uiv > OC_UINT16_MAX) {uiv = OC_UINT16_MAX; outofrange = 1;} + *((unsigned short*)memory) = (unsigned short)uiv; + break; + case OC_Int32: + if(sscanf(value,"%ld",&iv) != 1) goto fail; + else if(iv > OC_INT32_MAX || iv < OC_INT32_MIN) {iv = OC_INT32_MAX; outofrange = 1;} + *((signed int*)memory) = (signed int)iv; + break; + case OC_UInt32: + if(sscanf(value,"%lu",&uiv) != 1) goto fail; + else if(uiv > OC_UINT32_MAX) {uiv = OC_UINT32_MAX; outofrange = 1;} + *((unsigned char*)memory) = (unsigned int)uiv; + break; +#ifdef HAVE_LONG_LONG_INT + case OC_Int64: + if(sscanf(value,"%lld",&llv) != 1) goto fail; + /*else if(iv > OC_INT64_MAX || iv < OC_INT64_MIN) goto fail;*/ + *((signed long long*)memory) = (signed long long)llv; + break; + case OC_UInt64: + if(sscanf(value,"%llu",&ullv) != 1) goto fail; + *((unsigned long long*)memory) = (unsigned long long)ullv; + break; +#endif + case OC_Float32: + if(sscanf(value,"%lf",&dv) != 1) goto fail; + *((float*)memory) = (float)dv; + break; + case OC_Float64: + if(sscanf(value,"%lf",&dv) != 1) goto fail; + *((double*)memory) = (double)dv; + break; + case OC_String: case OC_URL: + *((char**)memory) = nulldup(value); + break; + default: + goto fail; + } + if(outofrange) + oc_log(LOGWARN,"converttype range failure: %d: %s",etype,value); + return 1; +fail: + oc_log(LOGERR,"converttype bad value: %d: %s",etype,value); + return 0; +} + + +void +ocfreeroot(OCnode* root) +{ + OCtree* tree; + OCstate* state; + int i; + + if(root == NULL || root->tree == NULL) return; + + tree = root->tree; + /* Remove the root from the state->trees list */ + state = tree->state; + for(i=0;itrees);i++) { + OCnode* node = (OCnode*)oclistget(state->trees,i); + if(root == node) + oclistremove(state->trees,i); + } + /* Note: it is ok if state->trees does not contain this root */ + ocfreetree(tree); +} + +void +ocfreetree(OCtree* tree) +{ + if(tree == NULL) return; + ocfreenodes(tree->nodes); + ocfree(tree->constraint); + ocfree(tree->text); + if(tree->data.xdrs != NULL) { + xxdr_free(tree->data.xdrs); + } + ocfree(tree->data.filename); /* may be null */ + if(tree->data.file != NULL) fclose(tree->data.file); + ocfree(tree->data.memory); + ocfree(tree); +} + +void +ocfreenodes(OClist* nodes) +{ + unsigned int i,j; + for(i=0;iname); + ocfree(node->fullname); + while(oclistlength(node->att.values) > 0) { + char* value = (char*)oclistpop(node->att.values); + ocfree(value); + } + while(oclistlength(node->attributes) > 0) { + OCattribute* attr = (OCattribute*)oclistpop(node->attributes); + ocfree(attr->name); + /* If the attribute type is string, then we need to free them*/ + if(attr->etype == OC_String || attr->etype == OC_URL) { + char** strings = (char**)attr->values; + for(j=0;jnvalues;j++) {ocfree(*strings); strings++;} + } + ocfree(attr->values); + ocfree(attr); + } + if(node->array.dimensions != NULL) oclistfree(node->array.dimensions); + if(node->subnodes != NULL) oclistfree(node->subnodes); + if(node->att.values != NULL) oclistfree(node->att.values); + if(node->attributes != NULL) oclistfree(node->attributes); + ocfree(node); + } + oclistfree(nodes); +} + +/* +In order to be as compatible as possible with libdap, +we try to use the same algorithm for DAS->DDS matching. +As described there, the algorithm is as follows. + If the [attribute] name contains one or + more field separators then look for a [DDS]variable whose + name matches exactly. If the name contains no field separators then + the look first in the top level [of the DDS] and then in all subsequent + levels and return the first occurrence found. In general, this + searches constructor types in the order in which they appear + in the DDS, but there is no requirement that it do so. + + Note: If a dataset contains two constructor types which have field names + that are the same (say point.x and pair.x) one should use fully qualified + names to get each of those variables. +*/ + +int +ocddsdasmerge(OCstate* state, OCnode* dasroot, OCnode* ddsroot) +{ + OClist* dasglobals = oclistnew(); + OClist* dasnodes = oclistnew(); + OClist* varnodes = oclistnew(); + OClist* ddsnodes; + unsigned int i,j; + + if(dasroot->tree == NULL || dasroot->tree->dxdclass != OCDAS) + return OCTHROW(OC_EINVAL); + if(ddsroot->tree == NULL || (ddsroot->tree->dxdclass != OCDDS + && ddsroot->tree->dxdclass != OCDATADDS)) + return OCTHROW(OC_EINVAL); + + ddsnodes = ddsroot->tree->nodes; + + /* 1. collect all the relevant DAS nodes; + namely those that contain at least one + attribute value. + Simultaneously look for potential ambiguities + if found; complain but continue: result are indeterminate. + also collect globals separately*/ + for(i=0;itree->nodes);i++) { + OCnode* das = (OCnode*)oclistget(dasroot->tree->nodes,i); + int hasattributes = 0; + if(das->octype == OC_Attribute) continue; /* ignore these for now*/ + if(das->name == NULL || das->att.isglobal) { + oclistpush(dasglobals,(ocelem)das); + continue; + } + for(j=0;jsubnodes);j++) { + OCnode* subnode = (OCnode*)oclistget(das->subnodes,j); + if(subnode->octype == OC_Attribute) {hasattributes = 1; break;} + } + if(hasattributes) { + /* Look for previously collected nodes with same name*/ + for(j=0;jname == NULL || das2->name == NULL) continue; + if(strcmp(das->name,das2->name)==0) { + oc_log(LOGWARN,"oc_mergedas: potentially ambiguous DAS name: %s",das->name); + } + } + oclistpush(dasnodes,(ocelem)das); + } + } + + /* 2. collect all the leaf DDS nodes (of type OC_Primitive)*/ + for(i=0;ioctype == OC_Primitive) oclistpush(varnodes,(ocelem)dds); + } + + /* 3. For each das node, locate matching DDS node(s) and attach + attributes to the DDS node(s). + Match means: + 1. DAS->fullname :: DDS->fullname + 2. DAS->name :: DDS->fullname (support DAS names with embedded '.' + 3. DAS->name :: DDS->name + */ + for(i=0;ifullname,dds->fullname)==0 + || strcmp(das->name,dds->fullname)==0 + || strcmp(das->name,dds->name)==0) { + mergedas1(dds,das); + /* remove from dasnodes list*/ + oclistset(dasnodes,i,(ocelem)NULL); + } + } + } + + /* 4. If there are attributes left, then complain about them being lost.*/ + for(i=0;iattributes == NULL) dds->attributes = oclistnew(); + /* assign the simple attributes in the das set to this dds node*/ + for(i=0;isubnodes);i++) { + OCnode* attnode = (OCnode*)oclistget(das->subnodes,i); + if(attnode->octype == OC_Attribute) { + OCattribute* att = makeattribute(attnode->name, + attnode->etype, + attnode->att.values); + oclistpush(dds->attributes,(ocelem)att); + } + } + return OCTHROW(stat); +} + + + +#ifdef OCIGNORE + +int +ocddsdasmerge(OCstate* state, OCnode* ddsroot, OCnode* dasroot) +{ + int i,j; + int stat = OC_NOERR; + OClist* globals = oclistnew(); + if(dasroot == NULL) return OCTHROW(stat); + /* Start by looking for global attributes*/ + for(i=0;isubnodes);i++) { + OCnode* node = (OCnode*)oclistget(dasroot->subnodes,i); + if(node->att.isglobal) { + for(j=0;jsubnodes);j++) { + OCnode* attnode = (OCnode*)oclistget(node->subnodes,j); + Attribute* att = makeattribute(attnode->name, + attnode->etype, + attnode->att.values); + oclistpush(globals,(ocelem)att); + } + } + } + ddsroot->attributes = globals; + /* Now try to match subnode names with attribute set names*/ + for(i=0;isubnodes);i++) { + OCnode* das = (OCnode*)oclistget(dasroot->subnodes,i); + int match = 0; + if(das->att.isglobal) continue; + if(das->octype == OC_Attributeset) { + for(j=0;jsubnodes) && !match;j++) { + OCnode* dds = (OCnode*)oclistget(ddsroot->subnodes,j); + if(strcmp(das->name,dds->name) == 0) { + match = 1; + stat = mergedas1(dds,das); + if(stat != OC_NOERR) break; + } + } + } + if(!match) {marklostattribute(das);} + } + if(stat == OC_NOERR) ddsroot->attributed = 1; + return OCTHROW(stat); +} + +/* Merge das attributes into the dds node*/ + +static int +mergedas1(OCnode* dds, OCnode* das) +{ + int i,j; + int stat = OC_NOERR; + if(dds->attributes == NULL) dds->attributes = oclistnew(); + /* assign the simple attributes in the das set to this dds node*/ + for(i=0;isubnodes);i++) { + OCnode* attnode = (OCnode*)oclistget(das->subnodes,i); + if(attnode->octype == OC_Attribute) { + Attribute* att = makeattribute(attnode->name, + attnode->etype, + attnode->att.values); + oclistpush(dds->attributes,(ocelem)att); + } + } + /* Try to merge any enclosed sets with subnodes of dds*/ + for(i=0;isubnodes);i++) { + OCnode* dasnode = (OCnode*)oclistget(das->subnodes,i); + int match = 0; + if(dasnode->octype == OC_Attribute) continue; /* already dealt with above*/ + for(j=0;jsubnodes) && !match;j++) { + OCnode* ddsnode = (OCnode*)oclistget(dds->subnodes,j); + if(strcmp(dasnode->name,ddsnode->name) == 0) { + match = 1; + stat = mergedas1(ddsnode,dasnode); + if(stat != OC_NOERR) break; + } + } + if(!match) {marklostattribute(dasnode);} + } + return OCTHROW(stat); +} +#endif + +static void +ocuncorrelate(OCnode* root) +{ + OCtree* tree = root->tree; + unsigned int i; + if(tree == NULL) return; + for(i=0;inodes);i++) { + OCnode* node = (OCnode*)oclistget(tree->nodes,i); + node->datadds = NULL; + } +} + +static OCerror +occorrelater(OCnode* dds, OCnode* dxd) +{ + int i,j; + OCerror ocstat = OC_NOERR; + + if(dds->octype != dxd->octype) { + OCTHROWCHK((ocstat = OC_EINVAL)); goto fail; + } + if(dxd->name != NULL && dxd->name != NULL + && strcmp(dxd->name,dds->name) != 0) { + OCTHROWCHK((ocstat = OC_EINVAL)); goto fail; + } else if(dxd->name != dxd->name) { /* test NULL==NULL */ + OCTHROWCHK((ocstat = OC_EINVAL)); goto fail; + } + + if(dxd->array.rank != dds->array.rank) { + OCTHROWCHK((ocstat = OC_EINVAL)); goto fail; + } + + dds->datadds = dxd; + + switch (dds->octype) { + case OC_Dataset: + case OC_Structure: + case OC_Grid: + case OC_Sequence: + /* Remember: there may be fewer datadds fields than dds fields */ + for(i=0;isubnodes);i++) { + OCnode* dxd1 = (OCnode*)oclistget(dxd->subnodes,i); + for(j=0;jsubnodes);j++) { + OCnode* dds1 = (OCnode*)oclistget(dds->subnodes,j); + if(strcmp(dxd1->name,dds1->name) == 0) { + ocstat = occorrelater(dds1,dxd1); + if(ocstat != OC_NOERR) {OCTHROWCHK(ocstat); goto fail;} + break; + } + } + } + break; + case OC_Dimension: + case OC_Primitive: + break; + default: OCPANIC1("unexpected node type: %d",dds->octype); + } + /* Correlate the dimensions */ + if(dds->array.rank > 0) { + for(i=0;isubnodes);i++) { + OCnode* ddsdim = (OCnode*)oclistget(dds->array.dimensions,i); + OCnode* dxddim = (OCnode*)oclistget(dxd->array.dimensions,i); + ocstat = occorrelater(ddsdim,dxddim); + if(!ocstat) goto fail; + } + } + +fail: + return OCTHROW(ocstat); + +} + +OCerror +occorrelate(OCnode* dds, OCnode* dxd) +{ + if(dds == NULL || dxd == NULL) return OC_EINVAL; + ocuncorrelate(dds); + return occorrelater(dds,dxd); +} + +/* +Mark cacheable those primitive String/URL typed nodes +that are contained only in structures with rank > 0. +*/ +void +ocmarkcacheable(OCstate* state, OCnode* ddsroot) +{ + int i,j; +#ifdef OCIGNORE + int ok; +#endif + OClist* treenodes = ddsroot->tree->nodes; + OClist* path = oclistnew(); + for(i=0;ioctype != OC_Primitive) continue; + if(node->etype != OC_String && node->etype != OC_URL) continue; + /* collect node path */ + oclistclear(path); + occollectpathtonode(node,path); +#ifdef OCIGNORE + ok = 1; +#endif + for(j=1;joctype != OC_Structure + || pathnode->array.rank > 0) { +#ifdef OCIGNORE + ok=0; +#endif + break; + } + } +#ifdef OCIGNORE + if(ok) { + node->cache.cacheable = 1; + node->cache.valid = 0; + } +#endif + } + oclistfree(path); +} + + +/* +Fill in the OCnode.skip fields +*/ +OCerror +occomputeskipdata(OCstate* state, OCnode* ddsroot) +{ + OCerror stat = OC_NOERR; + OCASSERT(ddsroot->octype == OC_Dataset); + stat = occomputeskipdatar(state,ddsroot,0); + return stat; +} + +/* Recursive helper for computeskipdata */ +static OCerror +occomputeskipdatar(OCstate* state, OCnode* xnode, ocoffset_t offset) +{ + OCerror stat = OC_NOERR; + int i,nfields; + int scalar = 0; + ocoffset_t instancesize = 0; + ocoffset_t totalsize = 0; + + scalar = (xnode->array.rank == 0 ? 1 : 0); + + /* Set skip count and offset*/ + if(xnode->octype == OC_Sequence) + xnode->skip.count = OCINDETERMINATE; + else + xnode->skip.count = totaldimsize(xnode); + + xnode->skip.offset = offset; /* possibly overridden below */ + + switch (xnode->octype) { + + case OC_Primitive: + switch(xnode->etype) { + case OC_String: case OC_URL: + instancesize = OCINDETERMINATE; + totalsize = OCINDETERMINATE; + break; + case OC_Char: case OC_Byte: case OC_UByte: + if(!scalar) {/*=>packed*/ + instancesize = octypesize(xnode->etype); + totalsize = instancesize * xnode->skip.count; + totalsize = RNDUP(totalsize); + totalsize += 2*XDRUNIT; /* overhead is double count */ + break; + } + /* !packed => singleton char object */ + /* fall thru */ + case OC_Int16: case OC_UInt16: + case OC_Int32: case OC_UInt32: + case OC_Int64: case OC_UInt64: + case OC_Float32: case OC_Float64: + instancesize = octypesize(xnode->etype); + instancesize = RNDUP(instancesize); /* make multiple of XDRUNIT */ + totalsize = (instancesize*xnode->skip.count); /* overhead is double count */ + if(!scalar) + totalsize += 2*XDRUNIT; /* overhead is double count */ + break; + + default: + OCPANIC("unexpected etype"); /* better not happen */ + } + break; + + case OC_Sequence: + offset = (xnode->skip.offset = OCINDETERMINATE); /* do not know field offsets for arbitrary record */ + case OC_Dataset: + case OC_Grid: + case OC_Structure: + /* Compute size of each field and sum */ + nfields = oclistlength(xnode->subnodes); + instancesize = 0; /* of structure as a whole */ + for(i=0;isubnodes,i); + ocoffset_t fieldsize; + if(offset == OCINDETERMINATE || instancesize == OCINDETERMINATE) + stat = occomputeskipdatar(state,subnode,OCINDETERMINATE); + else + stat = occomputeskipdatar(state,subnode,offset+instancesize); + if(stat != OC_NOERR) goto done; + fieldsize = subnode->skip.totalsize; + if(instancesize == OCINDETERMINATE || fieldsize == OCINDETERMINATE) + instancesize = OCINDETERMINATE; + else + instancesize += fieldsize; + } + if(instancesize != OCINDETERMINATE) { + instancesize = RNDUP(instancesize); /* make multiple of XDRUNIT */ + totalsize = (instancesize*xnode->skip.count); /* overhead is single count */ + if(!scalar) + totalsize += XDRUNIT; /* overhead is single count */ + } else { + totalsize = OCINDETERMINATE; + } + if(xnode->octype == OC_Sequence) { + totalsize = OCINDETERMINATE; + offset = OCINDETERMINATE; + } + break; + + default: OCPANIC("unexpected octype"); /* better not happen */ + } + + xnode->skip.offset = offset; + xnode->skip.instancesize = instancesize; + xnode->skip.totalsize = totalsize; + +done: + return stat; +} diff --git a/extern/src_netcdf4/ocnode.h b/extern/src_netcdf4/ocnode.h new file mode 100644 index 0000000..544b9ea --- /dev/null +++ b/extern/src_netcdf4/ocnode.h @@ -0,0 +1,81 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCNODE_H +#define OCNODE_H + +/*! Specifies the Diminfo. */ +/* Track info purely about declared dimensions. + More information is included in the Dimdata structure (dim.h) +*/ +typedef struct OCdiminfo { + struct OCnode* array; /* defining array node (if known)*/ + unsigned int arrayindex;/* rank position ofthis dimension in the array*/ + ocindex_t declsize; /* from DDS*/ +} OCdiminfo; + +/*! Specifies the Arrayinfo.*/ +typedef struct OCarrayinfo { + /* The complete set of dimension info applicable to this node*/ + OClist* dimensions; + /* convenience (because they are computed so often*/ + unsigned int rank; /* == |dimensions|*/ +} OCarrayinfo; + +/*! Specifies Attribute info */ +typedef struct OCattribute { + char* name; + OCtype etype; /* type of the attribute */ + size_t nvalues; + char** values; /* |values| = nvalues*sizeof(char**)*/ +} OCattribute; + +/*! Specifies the Attinfo.*/ +/* This is the form as it comes out of the DAS parser*/ +typedef struct OCattinfo { + int isglobal; /* is this supposed to be a global attribute set?*/ + OClist* values; /* oclist*/ +} OCattinfo; + +/*! Specifies the OCnode. */ +typedef struct OCnode { + unsigned int magic; + OCtype octype; + OCtype etype; /* essentially the dap type from the dds*/ + char* name; + char* fullname; + struct OCnode* container; /* this node is subnode of container */ + struct OCnode* root; /* root node of tree containing this node */ + struct OCtree* tree; /* !NULL iff this is a root node */ + struct OCnode* datadds; /* correlated datadds node, if any */ + OCdiminfo dim; /* octype == OC_Dimension*/ + OCarrayinfo array; /* octype == {OC_Structure, OC_Primitive}*/ + OCattinfo att; /* octype == OC_Attribute */ + /* primary edge info*/ + OClist* subnodes; /*oclist*/ + /*int attributed;*/ /* 1 if merge was done*/ + OClist* attributes; /* oclist*/ + struct OCSKIP {/* Support fast skipping ; in following, 0 => undefined */ + ocindex_t count; /* no. instances (== dimension cross product); may be indeterminate*/ + ocoffset_t instancesize;/*size of single instance; may be indeterminate*/ + ocoffset_t totalsize; /* usually: count*instancesize + overhead; may be indeterminate */ + ocoffset_t offset; /* mostly for debugging */ + } skip; +#ifdef OCIGNORE + struct {/* do simple index cache */ + int cacheable; /* is this object cacheable? */ + int valid; /* is this cache valid */ + ocindex_t index; /* last index */ + ocoffset_t offset; /* position of the last indexed instance */ + } cache; +#endif +} OCnode; + +#if SIZEOF_SIZE_T == 4 +#define OCINDETERMINATE ((size_t)0xffffffff) +#endif +#if SIZEOF_SIZE_T == 8 +#define OCINDETERMINATE ((size_t)0xffffffffffffffff) +#endif + +#endif /*OCNODE_H*/ diff --git a/extern/src_netcdf4/ocrc.c b/extern/src_netcdf4/ocrc.c new file mode 100644 index 0000000..27465e6 --- /dev/null +++ b/extern/src_netcdf4/ocrc.c @@ -0,0 +1,548 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include "ocinternal.h" +#include "ocdebug.h" +#include "ocdata.h" +#include "occontent.h" +#include "oclog.h" + +#include "ocrc.h" + +#define RTAG ']' +#define LTAG '[' + +#define TRIMCHARS " \t\r\n" + +#define TRIM(x) rctrimright(rctrimleft((x),TRIMCHARS),TRIMCHARS) + +#define HTTPPREFIXDEPRECATED "CURL." +#define HTTPPREFIX "HTTP." + +/* the .dodsrc triple store */ +struct OCTriplestore* ocdodsrc = NULL; + +static int parseproxy(OCstate* state, char* v); +static int rcreadline(FILE* f, char* more, int morelen); +static char* rctrimright(char* more, char* trimchars); +static char* rctrimleft(char* more, char* trimchars); + +static void ocdodsrcdump(char* msg, struct OCTriple*, int ntriples); + +static char* curllookup(char* suffix,char* url); + +/* The Username and password are in the URL if the URL is of the form: + * http://:@/.... + */ +int +occredentials_in_url(const char *url) +{ + char *pos = strstr(url, "http://"); + if (!pos) + return 0; + pos += 7; + if (strchr(pos, '@') && strchr(pos, ':')) + return 1; + + return 0; +} + +int +ocextract_credentials(const char *url, char **name, char **pw, char **result_url) +{ + char *pos; + char *end; + char *middle; + int up_len = 0; + int mid_len = 0; + int midpas_len = 0; + int url_len = 0; + + if (strchr(url, '@')) { + pos = strstr(url, "http://"); + if (pos) + pos += 7; + middle = strchr(pos, ':'); + mid_len = middle - pos; + *name = malloc(sizeof(char) * (mid_len + 1)); + strncpy(*name, pos, mid_len); + (*name)[mid_len] = '\0'; + + if (middle) + middle += 1; + + end = strchr(middle, '@'); + midpas_len = end - middle; + *pw = malloc(sizeof(char) * (midpas_len + 1)); + strncpy(*pw, middle, midpas_len); + (*pw)[midpas_len] = '\0'; + + up_len = end - pos; + url_len = strlen(url) - up_len; + + *result_url = malloc(sizeof(char) * (url_len + 1)); + if (!result_url) + return OC_ENOMEM; + + strncpy(*result_url, url, pos - url); + strncpy(*result_url + (pos - url), end + 1, url_len - (pos - url)); + +#if 0 + fprintf(stderr, "URL without username and password: %s:%d\n", sURL, url_len ); + fprintf(stderr, "URL username and password: %s:%d\n", sUP, up_len); + fprintf(stderr, "URL username: %s:%d\n", sUser, mid_len); + fprintf(stderr, "URL password: %s:%d\n", sPassword, midpas_len); +#endif + (*result_url)[url_len] = '\0'; + + return OC_NOERR; + } + else { + return OC_EIO; + } +} + +static int +rcreadline(FILE* f, char* more, int morelen) +{ + int i = 0; + int c = getc(f); + if(c < 0) return 0; + for(;;) { + if(i < morelen) /* ignore excess characters */ + more[i++]=c; + c = getc(f); + if(c < 0) break; /* eof */ + if(c == '\n') break; /* eol */ + } + /* null terminate more */ + more[i] = '\0'; + return 1; +} + +/* Trim specified characters from front/left */ +static char* +rctrimleft(char* more, char* trimchars) +{ + char* p = more; + int c; + while((c=*p) != '\0') {if(strchr(trimchars,c) != NULL) p++; else break;} + return p; +} + +/* Trim specified characters from end/right */ +static char* +rctrimright(char* more, char* trimchars) +{ + int len = strlen(more); + char* p = more + (len - 1); + while(p != more) {if(strchr(trimchars,*p) != NULL) p--; else break;} + /* null terminate */ + p[1] = '\0'; + return more; +} + +static int +parseproxy(OCstate* state, char* v) +{ + char *host_pos = NULL; + char *port_pos = NULL; + + if(strlen(v) == 0) return OC_NOERR; /* nothing there*/ + if (occredentials_in_url(v)) { + char *result_url = NULL; + ocextract_credentials(v, &state->creds.username, + &state->creds.password, + &result_url); + v = result_url; + } + /* allocating a bit more than likely needed ... */ + host_pos = strstr(v, "http://"); + if (host_pos) + host_pos += strlen("http://"); + else + host_pos = v; + port_pos = strchr(host_pos, ':'); + if (port_pos) { + int host_len; + char *port_sep = port_pos; + port_pos++; + *port_sep = '\0'; + host_len = strlen(host_pos); + state->proxy.host = malloc(sizeof(char) * host_len + 1); + if (!state->proxy.host) + return OC_ENOMEM; + + strncpy(state->proxy.host, host_pos, host_len); + state->proxy.host[host_len + 1] = '\0'; + + state->proxy.port = atoi(port_pos); + } else { + int host_len = strlen(host_pos); + state->proxy.host = malloc(sizeof(char) * host_len + 1); + if (!state->proxy.host) + return OC_ENOMEM; + + strncpy(state->proxy.host, host_pos, host_len); + state->proxy.host[host_len + 1] = '\0'; + + state->proxy.port = 80; + } +#if 0 + state->proxy.host[v_len] = '\0'; + state->proxy.port = atoi(v); + s_len = strlen(v); + state->proxy.user = malloc(sizeof(char) * s_len + 1); + if (!state->proxy.user) + return OC_ENOMEM; + strncpy(state->proxy.user, v, s_len); + state->proxy.user[s_len] = '\0'; + p_len = strlen(v); + state->proxy.password = malloc(sizeof(char) * p_len + 1); + if (!state->proxy.password) + return OC_ENOMEM; + strncpy(state->proxy.password, v, p_len); + state->proxy.password[p_len] = '\0'; +#endif /*0*/ + if (ocdebug > 1) { + oc_log(LOGNOTE,"host name: %s", state->proxy.host); + oc_log(LOGNOTE,"user name: %s", state->creds.username); +#ifdef INSECURE + oc_log(LOGNOTE,"password: %s", state->creds.password); +#endif + oc_log(LOGNOTE,"port number: %d", state->proxy.port); + } + if(v) free(v); + return OC_NOERR; +} + +/* insertion sort the triplestore based on url */ +static void +sorttriplestore(void) +{ + int i, nsorted; + struct OCTriple* sorted = NULL; + + if(ocdodsrc->ntriples <= 1) return; /* nothing to sort */ + if(ocdebug > 2) + ocdodsrcdump("initial:",ocdodsrc->triples,ocdodsrc->ntriples); + + sorted = (struct OCTriple*)malloc(sizeof(struct OCTriple)*ocdodsrc->ntriples); + if(sorted == NULL) { + oc_log(LOGERR,"sorttriplestore: out of memory"); + return; + } + + nsorted = 0; + while(nsorted < ocdodsrc->ntriples) { + int largest; + /* locate first non killed entry */ + for(largest=0;largestntriples;largest++) { + if(ocdodsrc->triples[largest].key[0] != '\0') break; + } + OCASSERT(ocdodsrc->triples[largest].key[0] != '\0'); + for(i=0;intriples;i++) { + if(ocdodsrc->triples[i].key[0] != '\0') { /* avoid empty slots */ + int lexorder = strcmp(ocdodsrc->triples[i].url,ocdodsrc->triples[largest].url); + int leni = strlen(ocdodsrc->triples[i].url); + int lenlarge = strlen(ocdodsrc->triples[largest].url); + /* this defines the ordering */ + if(leni == 0 && lenlarge == 0) continue; /* if no urls, then leave in order */ + if(leni != 0 && lenlarge == 0) largest = i; + else if(lexorder > 0) largest = i; + } + } + /* Move the largest entry */ + OCASSERT(ocdodsrc->triples[largest].key[0] != 0); + sorted[nsorted] = ocdodsrc->triples[largest]; + ocdodsrc->triples[largest].key[0] = '\0'; /* kill entry */ + nsorted++; + if(ocdebug > 2) + ocdodsrcdump("pass:",sorted,nsorted); + } + + memcpy((void*)ocdodsrc->triples,(void*)sorted,sizeof(struct OCTriple)*nsorted); + free(sorted); + + if(ocdebug > 0) + ocdodsrcdump("final .dodsrc order:",ocdodsrc->triples,ocdodsrc->ntriples); +} + +/* Create a triple store from a file */ +int +ocdodsrc_read(char* basename, char* path) +{ + char line0[MAXRCLINESIZE]; + FILE *in_file = NULL; + int linecount = 0; + + if(ocdodsrc == NULL) { + ocdodsrc = (struct OCTriplestore*)malloc(sizeof(struct OCTriplestore)); + if(ocdodsrc == NULL) { + oc_log(LOGERR,"ocdodsrc_read: out of memory"); + return 0; + } + } + ocdodsrc->ntriples = 0; + + in_file = fopen(path, "r"); /* Open the file to read it */ + if (in_file == NULL) { + oc_log(LOGERR, "Could not open configuration file: %s",basename); + return OC_EPERM; + } + + for(;;) { + char *line,*key,*value; + if(!rcreadline(in_file,line0,sizeof(line0))) break; + linecount++; + if(linecount >= MAXRCLINES) { + oc_log(LOGERR, ".dodsrc has too many lines"); + return 0; + } + line = line0; + /* check for comment */ + if (line[0] == '#') continue; + /* trim leading blanks */ + line = rctrimleft(line,TRIMCHARS); + if(strlen(line) >= MAXRCLINESIZE) { + oc_log(LOGERR, "%s line too long: %s",basename,line0); + return 0; + } + /* parse the line */ + ocdodsrc->triples[ocdodsrc->ntriples].url[0] = '\0'; /*assume no url*/ + if(line[0] == LTAG) { + char* url = ++line; + char* rtag = strchr(line,RTAG); + if(rtag == NULL) { + oc_log(LOGERR, "Malformed [url] in %s entry: %s",basename,line); + continue; + } + line = rtag + 1; + *rtag = '\0'; + /* trim again */ + line = rctrimleft(line,TRIMCHARS); + /* save the url */ + strcpy(ocdodsrc->triples[ocdodsrc->ntriples].url,TRIM(url)); + } + if(strlen(line)==0) continue; /* empty line */ + /* split off key and value */ + key=line; + value = strchr(line, '='); + if(value == NULL) { + /* add fake '=1' */ + if(strlen(line) + strlen("=1") >= MAXRCLINESIZE) { + oc_log(LOGERR, "%s entry too long: %s",basename,line); + continue; + } + strcat(line,"=1"); + value = strchr(line,'='); + } + *value = '\0'; + value++; + strcpy(ocdodsrc->triples[ocdodsrc->ntriples].key,TRIM(key)); + strcpy(ocdodsrc->triples[ocdodsrc->ntriples].value,TRIM(value)); + ocdodsrc->ntriples++; + } + fclose(in_file); + sorttriplestore(); + return 1; +} + + +int +ocdodsrc_process(OCstate* state) +{ + int stat = 0; + char* value; + char* url = ocuribuild(state->uri,NULL,NULL,OCURIENCODE); + if(ocdodsrc == NULL) goto done; + value = curllookup("DEFLATE",url); + if(value != NULL) { + if(atoi(value)) state->curlflags.compress = 1; + if(ocdebug > 0) + oc_log(LOGNOTE,"Compression: %ld", state->curlflags.compress); + } + if((value = curllookup("VERBOSE",url)) != NULL) { + if(atoi(value)) state->curlflags.verbose = 1; + if(ocdebug > 0) + oc_log(LOGNOTE,"curl.verbose: %ld", state->curlflags.verbose); + } + if((value = curllookup("TIMEOUT",url)) != NULL) { + if(atoi(value)) state->curlflags.timeout = atoi(value); + if(ocdebug > 0) + oc_log(LOGNOTE,"curl.timeout: %ld", state->curlflags.timeout); + } + + if((value = curllookup("COOKIEFILE",url)) != NULL) { + state->curlflags.cookiefile = strdup(TRIM(value)); + if(!state->curlflags.cookiefile) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"COOKIEFILE: %s", state->curlflags.cookiefile); + } + if((value = curllookup("COOKIEJAR",url)) + || (value = curllookup("COOKIE_JAR",url))) { + state->curlflags.cookiejar = strdup(TRIM(value)); + if(!state->curlflags.cookiejar) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"COOKIEJAR: %s", state->curlflags.cookiejar); + } + + /* Some servers (e.g. thredds) appear to require a place + to put cookies in order for some security functions to work + */ + if(state->curlflags.cookiejar == NULL + && state->curlflags.cookiefile == NULL) { + state->curlflags.cookiefile = strdup(""); + } + + if((value = curllookup("PROXY_SERVER",url)) != NULL) { + stat = parseproxy(state,TRIM(value)); + if(stat != OC_NOERR) goto done; + } + + if((value = curllookup("SSL.VALIDATE",url)) != NULL) { + if(atoi(value)) state->ssl.validate = 1; + if(ocdebug > 0) + oc_log(LOGNOTE,"CURL.SSL.VALIDATE: %ld", state->ssl.validate); + } + + if((value = curllookup("SSL.CERTIFICATE",url)) != NULL) { + state->ssl.certificate = strdup(TRIM(value)); + if(!state->ssl.certificate) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"CREDENTIALS.SSL.CERTIFICATE: %s", state->ssl.certificate); + } + + if((value = curllookup("SSL.KEY",url)) != NULL) { + state->ssl.key = strdup(TRIM(value)); + if(!state->ssl.key) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"CREDENTIALS.SSL.KEY: %s", state->ssl.key); + } + + if((value = curllookup("SSL.KEYPASSWORD",url)) != NULL) { + state->ssl.keypasswd = strdup(TRIM(value)); + if(!state->ssl.keypasswd) {stat = OC_ENOMEM; goto done;} +#ifdef INSECURE + if(ocdebug > 0) + oc_log(LOGNOTE,"CREDENTIALS.SSL.KEYPASSWORD: %s", state->ssl.keypasswd); +#endif + } + + if((value = curllookup("SSL.CAINFO",url)) != NULL) { + state->ssl.cainfo = strdup(TRIM(value)); + if(!state->ssl.cainfo) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"SSL.CAINFO: %s", state->ssl.cainfo); + } + + if((value = curllookup("SSL.CAPATH",url)) != NULL) { + state->ssl.capath = strdup(TRIM(value)); + if(!state->ssl.capath) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"SSL.CAPATH: %s", state->ssl.capath); + } + + if((value = curllookup("SSL.VERIFYPEER",url)) != NULL) { + char* s = strdup(TRIM(value)); + int tf = 0; + if(s == NULL || strcmp(s,"0")==0 || strcasecmp(s,"false")==0) + tf = 0; + else if(strcmp(s,"1")==0 || strcasecmp(s,"true")==0) + tf = 1; + else + tf = 1; /* default if not null */ + state->ssl.verifypeer = tf; + if(ocdebug > 0) + oc_log(LOGNOTE,"SSL.VERIFYPEER: %d", state->ssl.verifypeer); + } + + if((value = curllookup("CREDENTIALS.USER",url)) != NULL) { + state->creds.username = strdup(TRIM(value)); + if(!state->creds.username) {stat = OC_ENOMEM; goto done;} + if(ocdebug > 0) + oc_log(LOGNOTE,"CREDENTIALS.USER: %s", state->creds.username); + } + + if((value = curllookup("CREDENTIALS.PASSWORD",url)) != NULL) { + state->creds.password = strdup(TRIM(value)); + if(!state->creds.password) {stat = OC_ENOMEM; goto done;} + } + /* else ignore */ + +done: + if(url != NULL) free(url); + return stat; +} + +char* +ocdodsrc_lookup(char* key, char* url) +{ + int i,found; + struct OCTriple* triple = ocdodsrc->triples; + if(key == NULL || ocdodsrc == NULL) return NULL; + if(url == NULL) url = ""; + /* Assume that the triple store has been properly sorted */ + for(found=0,i=0;intriples;i++,triple++) { + int triplelen = strlen(triple->url); + int t; + if(strcmp(key,triple->key) != 0) continue; /* keys do not match */ + /* If the triple entry has no url, then use it (because we have checked all other cases)*/ + if(triplelen == 0) {found=1;break;} + /* do url prefix comparison */ + t = ocstrncmp(url,triple->url,triplelen); + if(t == 0) {found=1; break;} + } + if(ocdebug > 2) + { + if(found) { + fprintf(stderr,"lookup %s: [%s]%s = %s\n",url,triple->url,triple->key,triple->value); + } + } + return (found ? triple->value : NULL); +} + + +static void +ocdodsrcdump(char* msg, struct OCTriple* triples, int ntriples) +{ + int i; + if(msg != NULL) fprintf(stderr,"%s\n",msg); + if(ocdodsrc == NULL) { + fprintf(stderr,"\n"); + return; + } + if(triples == NULL) triples= ocdodsrc->triples; + if(ntriples < 0 ) ntriples= ocdodsrc->ntriples; + for(i=0;i +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#include "ocinternal.h" +#include "ocdebug.h" +#include "ochttp.h" +#include "ocread.h" +#include "ocrc.h" +#include "occurlfunctions.h" + +extern int oc_curl_file_supported; + +/*Forward*/ +static int readpacket(CURL*, OCURI*, OCbytes*, OCdxd, long*); +static int readfile(char* path, char* suffix, OCbytes* packet); +static int readfiletofile(char* path, char* suffix, FILE* stream, unsigned long*); + +int +readDDS(OCstate* state, OCtree* tree) +{ + int stat = OC_NOERR; + long lastmodified = -1; + + + ocurisetconstraints(state->uri,tree->constraint); + +ocset_user_password(state); + + stat = readpacket(state->curl,state->uri,state->packet,OCDDS, + &lastmodified); + if(stat == OC_NOERR) state->ddslastmodified = lastmodified; + + return stat; +} + +int +readDAS(OCstate* state, OCtree* tree) +{ + int stat = OC_NOERR; + + ocurisetconstraints(state->uri,tree->constraint); + stat = readpacket(state->curl,state->uri,state->packet,OCDAS,NULL); + + return stat; +} + +int +readversion(CURL* curl, OCURI* url, OCbytes* packet) +{ + return readpacket(curl,url,packet,OCVER,NULL); +} + +static +char* ocdxdextension[] ={ +".dds", /*OCDDS*/ +".das", /*OCDAS*/ +".dods", /*OCDATADDS*/ +".vers", /*OCVERS*/ +}; + +static int +readpacket(CURL* curl,OCURI* url,OCbytes* packet,OCdxd dxd,long* lastmodified) +{ + int stat = OC_NOERR; + int fileprotocol = 0; + char* suffix = ocdxdextension[dxd]; + char* fetchurl = NULL; + + fileprotocol = (strcmp(url->protocol,"file")==0); + + if(fileprotocol && !oc_curl_file_supported) { + /* Short circuit file://... urls*/ + /* We do this because the test code always needs to read files*/ + fetchurl = ocuribuild(url,NULL,NULL,0); + stat = readfile(fetchurl,suffix,packet); + } else { + int flags = 0; + if(!fileprotocol) flags |= OCURICONSTRAINTS; + flags |= OCURIENCODE; + fetchurl = ocuribuild(url,NULL,suffix,flags); + MEMCHECK(fetchurl,OC_ENOMEM); + if(ocdebug > 0) + {fprintf(stderr,"fetch url=%s\n",fetchurl); fflush(stderr);} + stat = ocfetchurl(curl,fetchurl,packet,lastmodified); + if(ocdebug > 0) + {fprintf(stderr,"fetch complete\n"); fflush(stderr);} + } + free(fetchurl); + return OCTHROW(stat); +} + +int +readDATADDS(OCstate* state, OCtree* tree, OCflags flags) +{ + int stat = OC_NOERR; + long lastmod = -1; + + if((flags & OCONDISK) == 0) { + ocurisetconstraints(state->uri,tree->constraint); + stat = readpacket(state->curl,state->uri,state->packet,OCDATADDS,&lastmod); + if(stat == OC_NOERR) + state->datalastmodified = lastmod; + tree->data.datasize = ocbyteslength(state->packet); + } else { + OCURI* url = state->uri; + int fileprotocol = 0; + char* readurl = NULL; + + fileprotocol = (strcmp(url->protocol,"file")==0); + + if(fileprotocol && !oc_curl_file_supported) { + readurl = ocuribuild(url,NULL,NULL,0); + stat = readfiletofile(readurl, ".dods", tree->data.file, &tree->data.datasize); + } else { + int flags = 0; + if(!fileprotocol) flags |= OCURICONSTRAINTS; + flags |= OCURIENCODE; + ocurisetconstraints(url,tree->constraint); + readurl = ocuribuild(url,NULL,".dods",flags); + MEMCHECK(readurl,OC_ENOMEM); + if (ocdebug > 0) + {fprintf(stderr, "fetch url=%s\n", readurl);fflush(stderr);} + stat = ocfetchurl_file(state->curl, readurl, tree->data.file, + &tree->data.datasize, &lastmod); + if(stat == OC_NOERR) + state->datalastmodified = lastmod; + if (ocdebug > 0) + {fprintf(stderr,"fetch complete\n"); fflush(stderr);} + } + free(readurl); + } + return OCTHROW(stat); +} + +static int +readfiletofile(char* path, char* suffix, FILE* stream, unsigned long* sizep) +{ + int stat = OC_NOERR; + OCbytes* packet = ocbytesnew(); + size_t len; + /* check for leading file:/// */ + if(ocstrncmp(path,"file:///",8)==0) path += 7; /* assume absolute path*/ + stat = readfile(path,suffix,packet); + if(stat != OC_NOERR) goto unwind; + len = oclistlength(packet); + if(stat == OC_NOERR) { + size_t written; + fseek(stream,0,SEEK_SET); + written = fwrite(ocbytescontents(packet),1,len,stream); + if(written != len) stat = OC_EIO; + } + if(sizep != NULL) *sizep = len; +unwind: + ocbytesfree(packet); + return OCTHROW(stat); +} + +static int +readfile(char* path, char* suffix, OCbytes* packet) +{ + int stat = OC_NOERR; + char buf[1024]; + char filename[1024]; + int count,size,fd; + /* check for leading file:/// */ + if(ocstrncmp(path,"file://",7)==0) path += 7; /* assume absolute path*/ + strcpy(filename,path); + if(suffix != NULL) strcat(filename,suffix); + fd = open(filename,O_RDONLY); + if(fd < 0) { + oc_log(LOGERR,"open failed:%s",filename); + return OCTHROW(OC_EOPEN); + } + size=0; + stat = OC_NOERR; + for(;;) { + count = read(fd,buf,sizeof(buf)); + if(count <= 0) + break; + else if(count < 0) { + stat = OC_EIO; + oc_log(LOGERR,"read failed: %s",filename); + break; + } + ocbytesappendn(packet,buf,count); + size += count; + } + close(fd); + return OCTHROW(stat); +} + + diff --git a/extern/src_netcdf4/ocread.h b/extern/src_netcdf4/ocread.h new file mode 100644 index 0000000..8f302ce --- /dev/null +++ b/extern/src_netcdf4/ocread.h @@ -0,0 +1,15 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef READ_H +#define READ_H + + +extern int readDDS(OCstate*, OCtree*); +extern int readDAS(OCstate*, OCtree*); + +extern int readDATADDS(OCstate*, OCtree*, int inmemory); + +extern int readversion(CURL*, OCURI*, OCbytes*); + +#endif /*READ_H*/ diff --git a/extern/src_netcdf4/ocuri.c b/extern/src_netcdf4/ocuri.c new file mode 100644 index 0000000..8ef9872 --- /dev/null +++ b/extern/src_netcdf4/ocuri.c @@ -0,0 +1,737 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + * $Header$ + *********************************************************************/ + +#include "config.h" + +#include +#include +#include + +#include "oc.h" +#include "ocuri.h" + +#define OCURIDEBUG + +#define LBRACKET '[' +#define RBRACKET ']' + +#ifndef FIX +#define FIX(s) ((s)==NULL?"":(s)) +#endif + +#ifndef NILLEN +#define NILLEN(s) ((s)==NULL?0:strlen(s)) +#endif + +#ifdef HAVE_STRDUP +# ifndef nulldup +# define nulldup(s) ((s)==NULL?NULL:strdup(s)) +# endif +#endif + +#ifndef HAVE_STRDUP +static char* nulldup(char* s) +{ + char* dup = NULL; + if(s != NULL) { + dup = (char*)malloc(strlen(s)+1); + if(dup != NULL) + strcpy(dup,s); + } + return dup; +} +#endif + +#ifdef OCIGNORE +/* Not all systems have strndup, so provide one*/ +static char* +ocstrndup(const char* s, size_t len) +{ + char* dup; + if(s == NULL) return NULL; + dup = (char*)ocmalloc(len+1); + MEMCHECK(dup,NULL); + memcpy((void*)dup,s,len); + dup[len] = '\0'; + return dup; +} +#endif + +/* Do not trust strncmp */ +static int +ocuristrncmp(const char* s1, const char* s2, size_t len) +{ + const char *p,*q; + if(s1 == s2) return 0; + if(s1 == NULL) return -1; + if(s2 == NULL) return +1; + for(p=s1,q=s2;len > 0;p++,q++,len--) { + if(*p != *q) + return (*p - *q); + if(*p == 0) return 0; /* *p == *q == 0 */ + } + /* 1st len chars are same */ + return 0; +} + +static char* legalprotocols[] = { +"file:", +"http:", +"https:", +"ftp:", +NULL /* NULL terminate*/ +}; + +/* Allowable character sets for encode */ +static char* fileallow = +"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&'()*+,-./:;=?@_~"; + +static char* queryallow = +"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&'()*+,-./:;=?@_~"; + +static void ocparamfree(char** params); +static int ocfind(char** params, const char* key); + +/* Do a simple uri parse: return 0 if fail, 1 otherwise*/ +int +ocuriparse(const char* uri0, OCURI** ocurip) +{ + OCURI* ocuri = NULL; + char* uri; + char** pp; + char* p; + char* p1; + int c; + + /* accumulate parse points*/ + char* protocol = NULL; + char* params = NULL; + char* host = NULL; + char* port = NULL; + char* constraint = NULL; + char* user = NULL; + char* pwd = NULL; + char* file = NULL; + + if(uri0 == NULL) + return OC_EBADURL; + + ocuri = (OCURI*)calloc(1,sizeof(OCURI)); + if(ocuri == NULL) return 0; + + /* make local copy of uri */ + uri = nulldup(uri0); + + /* remove all whitespace*/ + p = uri; + p1 = uri; + while((c=*p1++)) {if(c != ' ' && c != '\t') *p++ = c;} + + p = uri; + + /* break up the uri string into pieces*/ + + /* 1. leading bracketed parameters */ + if(*p == LBRACKET) { + params = p+1; + /* find end of the clientparams*/ + for(;*p;p++) {if(p[0] == RBRACKET && p[1] != LBRACKET) break;} + if(*p == 0) goto fail; /* malformed client params*/ + *p = '\0'; /* leave off the trailing rbracket for now */ + p++; /* move past the params*/ + } + + /* verify that the uri starts with an acceptable protocol*/ + for(pp=legalprotocols;*pp;pp++) { + if(ocuristrncmp(p,*pp,strlen(*pp))==0) break; + } + if(*pp == NULL) goto fail; /* illegal protocol*/ + /* save the protocol */ + protocol = *pp; + + /* 4. skip protocol */ + p += strlen(protocol); + + /* 5. skip // */ + if(*p != '/' && *(p+1) != '/') + goto fail; + p += 2; + + /* 6. Mark the end of the host section */ + file = strchr(p,'/'); + if(file) { + *file++ = '\0'; /* warning: we just overwrote the leading / */ + } else + goto fail; + + /* 7. extract any user:pwd */ + p1 = strchr(p,'@'); + if(p1) {/* Assume we have user:pwd@ */ + *p1 = '\0'; + user = p; + pwd = strchr(p,':'); + if(!pwd) goto fail; /* malformed */ + *pwd++ = '\0'; + p = pwd+strlen(pwd)+1; + } + + /* 8. extract host and port */ + host = p; + port = strchr(p,':'); + if(port) { + *port++ = '\0'; + } + + /* 9. Look for '?' */ + constraint = strchr(file,'?'); + if(constraint) { + *constraint++ = '\0'; + } + + /* assemble the component pieces*/ + if(uri0 && strlen(uri0) > 0) + ocuri->uri = nulldup(uri0); + if(protocol && strlen(protocol) > 0) { + ocuri->protocol = nulldup(protocol); + /* remove trailing ':' */ + ocuri->protocol[strlen(protocol)-1] = '\0'; + } + if(user && strlen(user) > 0) + ocuri->user = nulldup(user); + if(pwd && strlen(pwd) > 0) + ocuri->password = nulldup(pwd); + if(host && strlen(host) > 0) + ocuri->host = nulldup(host); + if(port && strlen(port) > 0) + ocuri->port = nulldup(port); + if(file && strlen(file) > 0) { + /* Add back the leading / */ + ocuri->file = malloc(strlen(file)+2); + strcpy(ocuri->file,"/"); + strcat(ocuri->file,file); + } + if(constraint && strlen(constraint) > 0) + ocuri->constraint = nulldup(constraint); + ocurisetconstraints(ocuri,constraint); + if(params != NULL && strlen(params) > 0) { + ocuri->params = (char*)malloc(1+2+strlen(params)); + strcpy(ocuri->params,"["); + strcat(ocuri->params,params); + strcat(ocuri->params,"]"); + } + +#ifdef OCXDEBUG + { + fprintf(stderr,"ocuri:"); + fprintf(stderr," params=|%s|",FIX(ocuri->params)); + fprintf(stderr," protocol=|%s|",FIX(ocuri->protocol)); + fprintf(stderr," host=|%s|",FIX(ocuri->host)); + fprintf(stderr," port=|%s|",FIX(ocuri->port)); + fprintf(stderr," file=|%s|",FIX(ocuri->file)); + fprintf(stderr," constraint=|%s|",FIX(ocuri->constraint)); + fprintf(stderr,"\n"); + } +#endif + free(uri); + if(ocurip != NULL) *ocurip = ocuri; + return 1; + +fail: + if(ocuri) ocurifree(ocuri); + if(uri != NULL) free(uri); + return 0; +} + +void +ocurifree(OCURI* ocuri) +{ + if(ocuri == NULL) return; + if(ocuri->uri != NULL) {free(ocuri->uri);} + if(ocuri->protocol != NULL) {free(ocuri->protocol);} + if(ocuri->user != NULL) {free(ocuri->user);} + if(ocuri->password != NULL) {free(ocuri->password);} + if(ocuri->host != NULL) {free(ocuri->host);} + if(ocuri->port != NULL) {free(ocuri->port);} + if(ocuri->file != NULL) {free(ocuri->file);} + if(ocuri->constraint != NULL) {free(ocuri->constraint);} + if(ocuri->projection != NULL) {free(ocuri->projection);} + if(ocuri->selection != NULL) {free(ocuri->selection);} + if(ocuri->params != NULL) {free(ocuri->params);} + if(ocuri->paramlist != NULL) ocparamfree(ocuri->paramlist); + free(ocuri); +} + +/* Replace the constraints */ +void +ocurisetconstraints(OCURI* duri,const char* constraints) +{ + char* proj = NULL; + char* select = NULL; + const char* p; + + if(duri->constraint == NULL) free(duri->constraint); + if(duri->projection != NULL) free(duri->projection); + if(duri->selection != NULL) free(duri->selection); + duri->constraint = NULL; + duri->projection = NULL; + duri->selection = NULL; + + if(constraints == NULL || strlen(constraints)==0) return; + + duri->constraint = nulldup(constraints); + if(*duri->constraint == '?') + strcpy(duri->constraint,duri->constraint+1); + + p = duri->constraint; + proj = (char*) p; + select = strchr(proj,'&'); + if(select != NULL) { + size_t plen = (select - proj); + if(plen == 0) { + proj = NULL; + } else { + proj = (char*)malloc(plen+1); + memcpy((void*)proj,p,plen); + proj[plen] = '\0'; + } + select = nulldup(select); + } else { + proj = nulldup(proj); + select = NULL; + } + duri->projection = proj; + duri->selection = select; +} + + +/* Construct a complete OC URI without the client params + and optionally with the constraints; + caller frees returned string. + Optionally encode the pieces. +*/ + +char* +ocuribuild(OCURI* duri, const char* prefix, const char* suffix, int flags) +{ + size_t len = 0; + char* newuri; + char* tmpfile; + char* tmpsuffix; + char* tmpquery; + + int withparams = ((flags&OCURIPARAMS) + && duri->params != NULL); + int withuserpwd = ((flags&OCURIUSERPWD) + && duri->user != NULL && duri->password != NULL); + int withconstraints = ((flags&OCURICONSTRAINTS) + && duri->constraint != NULL); +#ifdef NEWESCAPE + int encode = (flags&OCURIENCODE); +#else + int encode = 0; +#endif + + if(prefix != NULL) len += NILLEN(prefix); + if(withparams) { + len += NILLEN("[]"); + len += NILLEN(duri->params); + } + len += (NILLEN(duri->protocol)+NILLEN("://")); + if(withuserpwd) { + len += (NILLEN(duri->user)+NILLEN(duri->password)+NILLEN(":@")); + } + len += (NILLEN(duri->host)); + if(duri->port != NULL) { + len += (NILLEN(":")+NILLEN(duri->port)); + } + + tmpfile = duri->file; + if(encode) + tmpfile = ocuriencode(tmpfile,fileallow); + len += (NILLEN(tmpfile)); + + if(suffix != NULL) { + tmpsuffix = (char*)suffix; + if(encode) + tmpsuffix = ocuriencode(tmpsuffix,fileallow); + len += (NILLEN(tmpsuffix)); + } + + if(withconstraints) { + tmpquery = duri->constraint; + if(encode) + tmpquery = ocuriencode(tmpquery,queryallow); + len += (NILLEN("?")+NILLEN(tmpquery)); + } + + len += 1; /* null terminator */ + + newuri = (char*)malloc(len); + if(newuri == NULL) return NULL; + + newuri[0] = '\0'; + if(prefix != NULL) strcat(newuri,prefix); + if(withparams) { + strcat(newuri,"["); + strcat(newuri,duri->params); + strcat(newuri,"]"); + } + if(duri->protocol != NULL) + strcat(newuri,duri->protocol); + strcat(newuri,"://"); + if(withuserpwd) { + strcat(newuri,duri->user); + strcat(newuri,":"); + strcat(newuri,duri->password); + strcat(newuri,"@"); + } + if(duri->host != NULL) { /* may be null if using file: protocol */ + strcat(newuri,duri->host); + } + if(duri->port != NULL) { + strcat(newuri,":"); + strcat(newuri,duri->port); + } + + strcat(newuri,tmpfile); + if(suffix != NULL) strcat(newuri,tmpsuffix); + if(withconstraints) { + strcat(newuri,"?"); + strcat(newuri,tmpquery); + } + return newuri; +} + +/**************************************************/ +/* Parameter support */ + +/* +Client parameters are assumed to be +one or more instances of bracketed pairs: +e.g "[...][...]...". +The bracket content in turn is assumed to be a +comma separated list of = pairs. +e.g. x=y,z=,a=b. +If the same parameter is specifed more than once, +then the first occurrence is used; this is so that +is possible to forcibly override user specified +parameters by prefixing. +IMPORTANT: client parameter string is assumed to +have blanks compress out. +Returns 1 if parse suceeded, 0 otherwise; +*/ + +int +ocuridecodeparams(OCURI* ocuri) +{ + char* cp; + char* cq; + int c; + int i; + int nparams; + char* params0; + char* params; + char* params1; + char** plist; + + if(ocuri == NULL) return 0; + if(ocuri->params == NULL) return 1; + + params0 = ocuri->params; + + /* Pass 1 to replace beginning '[' and ending ']' */ + if(params0[0] == '[') + params = nulldup(params0+1); + else + params = nulldup(params0); + + if(params[strlen(params)-1] == ']') + params[strlen(params)-1] = '\0'; + + /* Pass 2 to replace "][" pairs with ','*/ + params1 = nulldup(params); + cp=params; cq = params1; + while((c=*cp++)) { + if(c == RBRACKET && *cp == LBRACKET) {cp++; c = ',';} + *cq++ = c; + } + *cq = '\0'; + free(params); + params = params1; + + /* Pass 3 to break string into pieces and count # of pairs */ + nparams=0; + for(cp=params;(c=*cp);cp++) { + if(c == ',') {*cp = '\0'; nparams++;} + } + nparams++; /* for last one */ + + /* plist is an env style list */ + plist = (char**)calloc(1,sizeof(char*)*(2*nparams+1)); /* +1 for null termination */ + + /* Pass 4 to break up each pass into a (name,value) pair*/ + /* and insert into the param list */ + /* parameters of the form name name= are converted to name=""*/ + cp = params; + for(i=0;iparamlist != NULL) + ocparamfree(ocuri->paramlist); + ocuri->paramlist = plist; + return 1; +} + +const char* +ocurilookup(OCURI* uri, const char* key) +{ + int i; + if(uri == NULL || key == NULL || uri->params == NULL) return NULL; + if(uri->paramlist == NULL) { + i = ocuridecodeparams(uri); + if(!i) return 0; + } + i = ocfind(uri->paramlist,key); + if(i >= 0) + return uri->paramlist[(2*i)+1]; + return NULL; +} + +int +ocurisetparams(OCURI* uri, const char* newparams) +{ + if(uri == NULL) return 0; + if(uri->paramlist != NULL) ocparamfree(uri->paramlist); + uri->paramlist = NULL; + if(uri->params != NULL) free(uri->params); + uri->params = nulldup(newparams); + return 1; +} + +/* Internal version of lookup; returns the paired index of the key */ +static int +ocfind(char** params, const char* key) +{ + int i; + char** p; + for(i=0,p=params;*p;p+=2,i++) { + if(strcmp(key,*p)==0) return i; + } + return -1; +} + +static void +ocparamfree(char** params) +{ + char** p; + if(params == NULL) return; + for(p=params;*p;p+=2) { + free(*p); + if(p[1] != NULL) free(p[1]); + } + free(params); +} + +#ifdef OCIGNORE +/* +Delete the entry. +return value = 1 => found and deleted; + 0 => param not found +*/ +int +ocparamdelete(char** params, const char* key) +{ + int i; + char** p; + char** q; + if(params == NULL || key == NULL) return 0; + i = ocfind(params,key); + if(i < 0) return 0; + p = params+(2*i); + for(q=p+2;*q;) { + *p++ = *q++; + } + *p = NULL; + return 1; +} + +static int +oclength(char** params) +{ + int i = 0; + if(params != NULL) { + while(*params) {params+=2; i++;} + } + return i; +} + +/* +Insert new client param (name,value); +return value = 1 => not already defined + 0 => param already defined (no change) +*/ +char** +ocparaminsert(char** params, const char* key, const char* value) +{ + int i; + char** newp; + size_t len; + if(params == NULL || key == NULL) return 0; + i = ocfind(params,key); + if(i >= 0) return 0; + /* not found, append */ + i = oclength(params); + len = sizeof(char*)*((2*i)+1); + newp = realloc(params,len+2*sizeof(char*)); + memcpy(newp,params,len); + newp[2*i] = nulldup(key); + newp[2*i+1] = (value==NULL?NULL:nulldup(value)); + return newp; +} + +/* +Replace new client param (name,value); +return value = 1 => replacement performed + 0 => key not found (no change) +*/ +int +ocparamreplace(char** params, const char* key, const char* value) +{ + int i; + if(params == NULL || key == NULL) return 0; + i = ocfind(params,key); + if(i < 0) return 0; + if(params[2*i+1] != NULL) free(params[2*i+1]); + params[2*i+1] = nulldup(value); + return 1; +} +#endif + + +/* Provide % encoders and decoders */ + + +static char* hexchars = "0123456789abcdefABCDEF"; + +static void +toHex(unsigned int b, char hex[2]) +{ + hex[0] = hexchars[(b >> 4) & 0xff]; + hex[1] = hexchars[(b) & 0xff]; +} + + +static unsigned int +fromHex(int c) +{ + if(c >= '0' && c <= '9') return (c - '0'); + if(c >= 'a' && c <= 'f') return (10 + (c - 'a')); + if(c >= 'A' && c <= 'F') return (10 + (c - 'A')); + return -1; +} + + +/* Return a string representing encoding of input; caller must free; + watch out: will encode whole string, so watch what you give it. + Allowable argument specifies characters that do not need escaping. + */ + +char* +ocuriencode(char* s, char* allowable) +{ + size_t slen; + char* encoded; + char* inptr; + char* outptr; + + if(s == NULL) return NULL; + + slen = strlen(s); + encoded = (char*)malloc((3*slen) + 1); /* max possible size */ + + for(inptr=s,outptr=encoded;*inptr;) { + int c = *inptr++; + if(c == ' ') { + *outptr++ = '+'; + } else { + /* search allowable */ + int c2; + char* a = allowable; + while((c2=*a++)) { + if(c == c2) break; + } + if(c2) {*outptr++ = c;} + else { + char hex[2]; + toHex(c,hex); + *outptr++ = '%'; + *outptr++ = hex[0]; + *outptr++ = hex[1]; + } + } + } + *outptr = '\0'; + return encoded; +} + +/* Return a string representing decoding of input; caller must free;*/ +char* +ocuridecode(char* s) +{ + return ocuridecodeonly(s,NULL); +} + +/* Return a string representing decoding of input only for specified + characters; caller must free +*/ +char* +ocuridecodeonly(char* s, char* only) +{ + size_t slen; + char* decoded; + char* outptr; + char* inptr; + unsigned int c; + + if (s == NULL) return NULL; + if(only == NULL) only = ""; + + slen = strlen(s); + decoded = (char*)malloc(slen+1); /* Should be max we need */ + + outptr = decoded; + inptr = s; + while((c = *inptr++)) { + if(c == '+' && strchr(only,'+') != NULL) + *outptr++ = ' '; + else if(c == '%') { + /* try to pull two hex more characters */ + if(inptr[0] != '\0' && inptr[1] != '\0' + && strchr(hexchars,inptr[0]) != NULL + && strchr(hexchars,inptr[1]) != NULL) { + /* test conversion */ + int xc = (fromHex(inptr[0]) << 4) | (fromHex(inptr[1])); + if(strchr(only,xc) != NULL) { + inptr += 2; /* decode it */ + c = xc; + } + } + } + *outptr++ = c; + } + *outptr = '\0'; + return decoded; +} + diff --git a/extern/src_netcdf4/ocuri.h b/extern/src_netcdf4/ocuri.h new file mode 100644 index 0000000..d528120 --- /dev/null +++ b/extern/src_netcdf4/ocuri.h @@ -0,0 +1,52 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCURI_H +#define OCURI_H + +/*! This is an open structure meaning + it is ok to directly access its fields*/ +typedef struct OCURI { + char* uri; /* as passed by the caller */ + char* protocol; + char* user; /* from user:password@ */ + char* password; /* from user:password@ */ + char* host; /*!< host*/ + char* port; /*!< host */ + char* file; /*!< file */ + char* constraint; /*!< projection+selection */ + char* projection; /*!< without leading '?'*/ + char* selection; /*!< with leading '&'*/ + char* params; /* all params */ + char** paramlist; /*! entry not found. + Empty value should be represented as a zero length string */ +extern const char* ocurilookup(OCURI*, const char* param); + +extern char* ocuriencode(char* s, char* allowable); +extern char* ocuridecode(char* s); +extern char* ocuridecodeonly(char* s, char*); + +#endif /*OCURI_H*/ diff --git a/extern/src_netcdf4/ocutil.c b/extern/src_netcdf4/ocutil.c new file mode 100644 index 0000000..d8eb240 --- /dev/null +++ b/extern/src_netcdf4/ocutil.c @@ -0,0 +1,442 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include "ocinternal.h" +#include "ocdebug.h" + +#ifdef WIN32 +#define snprintf _snprintf +#endif + +/* Order is important: longest first */ +static char* DDSdatamarks[3] = {"Data:\r\n","Data:\n",(char*)NULL}; + +/* Not all systems have strndup, so provide one*/ +char* +ocstrndup(const char* s, size_t len) +{ + char* dup; + if(s == NULL) return NULL; + dup = (char*)ocmalloc(len+1); + MEMCHECK(dup,NULL); + memcpy((void*)dup,s,len); + dup[len] = '\0'; + return dup; +} + +/* Do not trust strncmp semantics */ +int +ocstrncmp(const char* s1, const char* s2, size_t len) +{ + const char *p,*q; + if(s1 == s2) return 0; + if(s1 == NULL) return -1; + if(s2 == NULL) return +1; + for(p=s1,q=s2;len > 0;p++,q++,len--) { + if(*p == 0 && *q == 0) return 0; /* *p == *q == 0 */ + if(*p != *q) + return (*p - *q); + } + /* 1st len chars are same */ + return 0; +} + + +void +makedimlist(OClist* path, OClist* dims) +{ + unsigned int i,j; + for(i=0;iarray.rank; + for(j=0;jarray.dimensions,j); + oclistpush(dims,(ocelem)dim); + } + } +} + +void +ocfreeprojectionclause(OCprojectionclause* clause) +{ + if(clause->target != NULL) free(clause->target); + while(oclistlength(clause->indexsets) > 0) { + OClist* slices = (OClist*)oclistpop(clause->indexsets); + while(oclistlength(slices) > 0) { + OCslice* slice = (OCslice*)oclistpop(slices); + if(slice != NULL) free(slice); + } + oclistfree(slices); + } + oclistfree(clause->indexsets); + free(clause); +} + +static void +freeAttributes(OClist* attset) +{ + unsigned int i,j; + for(i=0;iname != NULL) free(att->name); + if(att->etype == OC_String || att->etype == OC_URL) { + for(j=0;jnvalues;j++) { + char* s = ((char**)att->values)[j]; + if(s != NULL) free(s); + } + } else { + free(att->values); + } + } +} + +void +freeOCnode(OCnode* cdf, int deep) +{ + unsigned int i; + if(cdf == NULL) return; + if(cdf->name != NULL) free(cdf->name); + if(cdf->fullname != NULL) free(cdf->fullname); + if(cdf->attributes != NULL) freeAttributes(cdf->attributes); + if(cdf->subnodes != NULL) { + if(deep) { + for(i=0;isubnodes);i++) { + OCnode* node = (OCnode*)oclistget(cdf->subnodes,i); + freeOCnode(node,deep); + } + } + oclistfree(cdf->subnodes); + } + free(cdf); +} + +int +findbod(OCbytes* buffer, size_t* bodp, size_t* ddslenp) +{ + unsigned int i; + char* content; + size_t len = ocbyteslength(buffer); + char** marks; + + content = ocbytescontents(buffer); + + for(marks = DDSdatamarks;*marks;marks++) { + char* mark = *marks; + int tlen = strlen(mark); + for(i=0;iarray.rank;i++) { + OCnode* dim = (OCnode*)oclistget(node->array.dimensions,i); + count *= (dim->dim.declsize); + } + return count; +} + +#ifdef OCIGNORE +size_t +totaldimsize(unsigned int rank, size_t* dimsizes) +{ + unsigned int i; + int unlim = 0; + unsigned long size = 1; + for(i=0;i"; +} + + +OCerror +octypeprint(OCtype etype, char* buf, size_t bufsize, void* value) +{ + if(buf == NULL || bufsize == 0 || value == NULL) return OC_EINVAL; + buf[0] = '\0'; + switch (etype) { + case OC_Char: + snprintf(buf,bufsize,"'%c'",*(char*)value); + break; + case OC_Byte: + snprintf(buf,bufsize,"%d",*(signed char*)value); + break; + case OC_UByte: + snprintf(buf,bufsize,"%u",*(unsigned char*)value); + break; + case OC_Int16: + snprintf(buf,bufsize,"%d",*(short*)value); + break; + case OC_UInt16: + snprintf(buf,bufsize,"%u",*(unsigned short*)value); + break; + case OC_Int32: + snprintf(buf,bufsize,"%d",*(int*)value); + break; + case OC_UInt32: + snprintf(buf,bufsize,"%u",*(unsigned int*)value); + break; + case OC_Float32: + snprintf(buf,bufsize,"%g",*(float*)value); + break; + case OC_Float64: + snprintf(buf,bufsize,"%g",*(double*)value); + break; +#ifdef HAVE_LONG_LONG_INT + case OC_Int64: + snprintf(buf,bufsize,"%lld",*(long long*)value); + break; + case OC_UInt64: + snprintf(buf,bufsize,"%llu",*(unsigned long long*)value); + break; +#endif + case OC_String: + case OC_URL: { + char* s = *(char**)value; + snprintf(buf,bufsize,"\"%s\"",s); + } break; + default: break; + } + return OC_NOERR; +} + +size_t +xxdrsize(OCtype etype) +{ + switch (etype) { + case OC_Char: + case OC_Byte: + case OC_UByte: + case OC_Int16: + case OC_UInt16: + case OC_Int32: + case OC_UInt32: + return XDRUNIT; + case OC_Int64: + case OC_UInt64: + return (2*XDRUNIT); + case OC_Float32: + return XDRUNIT; + case OC_Float64: + return (2*XDRUNIT); + case OC_String: + case OC_URL: + default: break; + } + return 0; +} + +/**************************************/ + +char* +ocerrstring(int err) +{ + if(err == 0) return "no error"; + if(err > 0) return strerror(err); + switch (err) { + case OC_EBADID: + return "OC_EBADID: Not a valid ID"; + case OC_EINVAL: + return "OC_EINVAL: Invalid argument"; + case OC_EPERM: + return "OC_EPERM: Write to read only"; + case OC_EINVALCOORDS: + return "OC_EINVALCOORDS: Index exceeds dimension bound"; + case OC_ENOTVAR: + return "OC_ENOTVAR: Variable not found"; + case OC_ECHAR: + return "OC_ECHAR: Attempt to convert between text & numbers"; + case OC_EEDGE: + return "OC_EEDGE: Start+count exceeds dimension bound"; + case OC_ESTRIDE: + return "OC_ESTRIDE: Illegal stride"; + case OC_ENOMEM: + return "OC_ENOMEM: Memory allocation (malloc) failure"; + case OC_EDIMSIZE: + return "OC_EDIMSIZE: Invalid dimension size"; + case OC_EDAP: + return "OC_EDAP: DAP failure"; + case OC_EXDR: + return "OC_EXDR: XDR failure"; + case OC_ECURL: + return "OC_ECURL: libcurl failure"; + case OC_EBADURL: + return "OC_EBADURL: malformed url"; + case OC_EBADVAR: + return "OC_EBADVAR: no such variable"; + case OC_EOPEN: + return "OC_EOPEN: temporary file open failed"; + case OC_EIO: + return "OC_EIO: I/O failure"; + case OC_ENODATA: + return "OC_ENODATA: Variable has no data in DAP request"; + case OC_EDAPSVC: + return "OC_EDAPSVC: DAP Server error"; + case OC_ENAMEINUSE: + return "OC_ENAMEINUSE: Duplicate name in DDS"; + case OC_EDAS: + return "OC_EDAS: Malformed or unreadable DAS"; + case OC_EDDS: + return "OC_EDDS: Malformed or unreadable DDS"; + case OC_EDATADDS: + return "OC_EDATADDS: Malformed or unreadable DATADDS"; + case OC_ERCFILE: + return "OC_ERCFILE: Malformed or unreadable run-time configuration file"; + case OC_ENOFILE: + return "OC_ENOFILE: cannot read content of URL"; + default: break; + } + return ""; +} + +OCerror +ocsvcerrordata(OCstate* state, char** codep, char** msgp, long* httpp) +{ + if(codep) *codep = state->error.code; + if(msgp) *msgp = state->error.message; + if(httpp) *httpp = state->error.httpcode; + return OC_NOERR; +} + +/* if we get OC_EDATADDS error, then try to capture any + error message and log it; assumes that in this case, + the datadds is not big. +*/ +void +ocdataddsmsg(OCstate* state, OCtree* tree) +{ +#define ERRCHUNK 1024 +#define ERRFILL ' ' +#define ERRTAG "Error {" + unsigned int i,j,len; + XXDR* xdrs; + char* contents; + off_t ckp; + + if(tree == NULL) return; + /* get available space */ + xdrs = tree->data.xdrs; + len = xxdr_length(xdrs); + if(len < strlen(ERRTAG)) + return; /* no room */ + ckp = xxdr_getpos(xdrs); + xxdr_setpos(xdrs,0); + /* read the whole thing */ + contents = (char*)malloc(len+1); + xxdr_getbytes(xdrs,contents,len); + contents[len] = '\0'; + /* Look for error tag */ + for(i=0;i 0 && (c < ' ' || c >= '\177')) + contents[i+j] = ERRFILL; + } + oc_log(LOGERR,"DATADDS failure, possible message: '%s'\n", + contents+i); + goto done; + } + } + xxdr_setpos(xdrs,ckp); +done: + return; +} diff --git a/extern/src_netcdf4/ocutil.h b/extern/src_netcdf4/ocutil.h new file mode 100644 index 0000000..fa5bd01 --- /dev/null +++ b/extern/src_netcdf4/ocutil.h @@ -0,0 +1,36 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +#ifndef OCUTIL_H +#define OCUTIL_H 1 + +/* Forward */ +struct OCstate; + +#define ocmax(x,y) ((x) > (y) ? (x) : (y)) + +extern char* ocstrndup(const char* s, size_t len); +extern int ocstrncmp(const char* s1, const char* s2, size_t len); + +extern size_t octypesize(OCtype etype); +extern char* octypetostring(OCtype octype); +extern char* octypetoddsstring(OCtype octype); +extern char* ocerrstring(int err); +extern OCerror ocsvcerrordata(struct OCstate*,char**,char**,long*); +extern OCerror octypeprint(OCtype etype, char* buf, size_t bufsize, void* value); +extern size_t xxdrsize(OCtype etype); + +extern size_t totaldimsize(OCnode*); + +extern void makedimlist(OClist* path, OClist* dims); + +extern int findbod(OCbytes* buffer, size_t*, size_t*); + +/* Reclaimers*/ +extern void freeOCnode(OCnode*,int); +extern void ocfreeprojectionclause(OCprojectionclause* clause); + +/* Misc. */ +extern void ocdataddsmsg(struct OCstate*, struct OCtree*); + +#endif /*UTIL_H*/ diff --git a/extern/src_netcdf4/onstack.h b/extern/src_netcdf4/onstack.h new file mode 100644 index 0000000..566fb99 --- /dev/null +++ b/extern/src_netcdf4/onstack.h @@ -0,0 +1,71 @@ +/* + * Copyright 1997, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: onstack.h,v 2.7 2006/09/15 20:40:39 ed Exp $ */ + +#ifndef _ONSTACK_H_ +#define _ONSTACK_H_ +/** + * This file provides definitions which allow us to + * "allocate" arrays on the stack where possible. + * (Where not possible, malloc and free are used.) + * + * The macro ALLOC_ONSTACK(name, type, nelems) is used to declare + * an array of 'type' named 'name' which is 'nelems' long. + * FREE_ONSTACK(name) is placed at the end of the scope of 'name' + * to call 'free' if necessary. + * + * The macro ALLOC_ONSTACK wraps a call to alloca() on most systems. + */ + +#if HAVE_ALLOCA +/* + * Implementation based on alloca() + */ + +#if defined(__GNUC__) +# if !defined(alloca) +# define alloca __builtin_alloca +# endif +#else +# if HAVE_ALLOCA_H +# include +# elif defined(_AIX) +# pragma alloca +# endif /* HAVE_ALLOCA_H */ +#endif /* __GNUC__ */ + +# if !defined(ALLOCA_ARG_T) +# define ALLOCA_ARG_T int /* the usual type of the alloca argument */ +# endif + +# define ALLOC_ONSTACK(name, type, nelems) \ + type *const name = (type *) alloca((ALLOCA_ARG_T)((nelems) * sizeof(type))) + +# define FREE_ONSTACK(name) + +#elif defined(_CRAYC) && !defined(__crayx1) && !__cplusplus && __STDC__ > 1 +/* + * Cray C allows sizing of arrays with non-constant values. + */ + +# define ALLOC_ONSTACK(name, type, nelems) \ + type name[nelems] + +# define FREE_ONSTACK(name) + +#else +/* + * Default implementation. When all else fails, use malloc/free. + */ + +# define ALLOC_ONSTACK(name, type, nelems) \ + type *const name = (type *) malloc((nelems) * sizeof(type)) + +# define FREE_ONSTACK(name) \ + free(name) + +#endif + +#endif /* _ONSTACK_H_ */ diff --git a/extern/src_netcdf4/posixio.c b/extern/src_netcdf4/posixio.c new file mode 100644 index 0000000..bd52bbe --- /dev/null +++ b/extern/src_netcdf4/posixio.c @@ -0,0 +1,1802 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: posixio.c,v 1.89 2010/05/22 21:59:08 dmh Exp $ */ + +/* For MinGW Build */ +#if defined(_WIN32) || defined(_WIN64) +#include +#include +#include +#define fstat64 fstat +#define lseek64 lseek +#endif + +#include +#include +#include +#include +#ifndef ENOERR +#define ENOERR 0 +#endif +#include +#include +#include +#include +#ifdef _MSC_VER /* Microsoft Compilers */ +#include +#else +#include +#endif +#ifndef HAVE_SSIZE_T +#define ssize_t int +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +#include "ncio.h" +#include "fbits.h" +#include "rnd.h" + +/* #define INSTRUMENT 1 */ +#if INSTRUMENT /* debugging */ +#undef NDEBUG +#include +/*#include "instr.h"*/ +#endif + +#undef MIN /* system may define MIN somewhere and complain */ +#define MIN(mm,nn) (((mm) < (nn)) ? (mm) : (nn)) + +#if !defined(NDEBUG) && !defined(X_INT_MAX) +#define X_INT_MAX 2147483647 +#endif + +#if 0 /* !defined(NDEBUG) && !defined(X_ALIGN) */ +#define X_ALIGN 4 +#else +#undef X_ALIGN +#endif + +/* These are needed on mingw to get a dll to compile. They really + * should be provided in sys/stats.h, but what the heck. Let's not be + * too picky! */ +#ifndef S_IRGRP +#define S_IRGRP 0000040 +#endif +#ifndef S_IROTH +#define S_IROTH 0000004 +#endif +#ifndef S_IWGRP +#define S_IWGRP 0000020 +#endif +#ifndef S_IWOTH +#define S_IWOTH 0000002 +#endif + +/*Forward*/ +static int ncio_px_filesize(ncio *nciop, off_t *filesizep); +static int ncio_px_pad_length(ncio *nciop, off_t length); +static int ncio_px_close(ncio *nciop, int doUnlink); +static int ncio_spx_close(ncio *nciop, int doUnlink); + + +/* + * Define the following for debugging. + */ +/* #define ALWAYS_NC_SHARE 1 */ + +/* Begin OS */ + +#ifndef POSIXIO_DEFAULT_PAGESIZE +#define POSIXIO_DEFAULT_PAGESIZE 4096 +#endif +/* + * What is the system pagesize? + */ +static size_t +pagesize(void) +{ + size_t pgsz; +#if defined(_WIN32) || defined(_WIN64) + SYSTEM_INFO info; +#endif +/* Hmm, aren't standards great? */ +#if defined(_SC_PAGE_SIZE) && !defined(_SC_PAGESIZE) +#define _SC_PAGESIZE _SC_PAGE_SIZE +#endif + + /* For MinGW Builds */ +#if defined(_WIN32) || defined(_WIN64) + GetSystemInfo(&info); + pgsz = (size_t)info.dwPageSize; +#elif defined(_SC_PAGESIZE) + pgsz = (size_t)sysconf(_SC_PAGESIZE); +#elif defined(HAVE_GETPAGESIZE) + pgsz = (size_t) getpagesize(); +#endif + if(pgsz > 0) + return (size_t) pgsz; + return (size_t)POSIXIO_DEFAULT_PAGESIZE; +} + +/* + * What is the preferred I/O block size? + */ +static size_t +blksize(int fd) +{ +#if defined(HAVE_ST_BLKSIZE) + struct stat sb; + if (fstat(fd, &sb) > -1) + { + if(sb.st_blksize >= 8192) + return (size_t) sb.st_blksize; + return 8192; + } + /* else, silent in the face of error */ +#endif + return (size_t) 2 * pagesize(); +} + + +/* + * Sortof like ftruncate, except won't make the + * file shorter. + */ +static int +fgrow(const int fd, const off_t len) +{ + struct stat sb; + if (fstat(fd, &sb) < 0) + return errno; + if (len < sb.st_size) + return ENOERR; + { + const long dumb = 0; + /* we don't use ftruncate() due to problem with FAT32 file systems */ + /* cache current position */ + const off_t pos = lseek(fd, 0, SEEK_CUR); + if(pos < 0) + return errno; + if (lseek(fd, len-sizeof(dumb), SEEK_SET) < 0) + return errno; + if(write(fd, &dumb, sizeof(dumb)) < 0) + return errno; + if (lseek(fd, pos, SEEK_SET) < 0) + return errno; + } + return ENOERR; +} + + +/* + * Sortof like ftruncate, except won't make the file shorter. Differs + * from fgrow by only writing one byte at designated seek position, if + * needed. + */ +static int +fgrow2(const int fd, const off_t len) +{ + struct stat sb; + if (fstat(fd, &sb) < 0) + return errno; + if (len <= sb.st_size) + return ENOERR; + { + const char dumb = 0; + /* we don't use ftruncate() due to problem with FAT32 file systems */ + /* cache current position */ + const off_t pos = lseek(fd, 0, SEEK_CUR); + if(pos < 0) + return errno; + if (lseek(fd, len-1, SEEK_SET) < 0) + return errno; + if(write(fd, &dumb, sizeof(dumb)) < 0) + return errno; + if (lseek(fd, pos, SEEK_SET) < 0) + return errno; + } + return ENOERR; +} +/* End OS */ +/* Begin px */ + +/* The px_ functions are for posix systems, when NC_SHARE is not in + effect. */ + +/* Write out a "page" of data to the file. The size of the page + (i.e. the extent) varies. + + nciop - pointer to the file metadata. + offset - where in the file should this page be written. + extent - how many bytes should be written. + vp - pointer to the data to write. + posp - pointer to current position in file, updated after write. +*/ +static int +px_pgout(ncio *const nciop, + off_t const offset, const size_t extent, + void *const vp, off_t *posp) +{ + ssize_t partial; + size_t nextent; + char *nvp; +#ifdef X_ALIGN + assert(offset % X_ALIGN == 0); +#endif + + assert(*posp == OFF_NONE || *posp == lseek(nciop->fd, 0, SEEK_CUR)); + + if(*posp != offset) + { + if(lseek(nciop->fd, offset, SEEK_SET) != offset) + { + return errno; + } + *posp = offset; + } + /* Old write, didn't handle partial writes correctly */ + /* if(write(nciop->fd, vp, extent) != (ssize_t) extent) */ + /* { */ + /* return errno; */ + /* } */ + nextent = extent; + nvp = vp; + while((partial = write(nciop->fd, nvp, nextent)) != -1) { + if(partial == nextent) + break; + nvp += partial; + nextent -= partial; + } + if(partial == -1) + return errno; + *posp += extent; + + return ENOERR; +} + +/* Read in a page of data. + + nciop - a pointer to the ncio struct for this file. + offset - byte offset in file where read starts. + extent - the size of the page that will be read. + vp - a pointer to where the data will end up. + nreadp - returned number of bytes actually read (may be less than extent). + posp - pointer to current position in file, updated after read. +*/ +static int +px_pgin(ncio *const nciop, + off_t const offset, const size_t extent, + void *const vp, size_t *nreadp, off_t *posp) +{ + int status; + ssize_t nread; + +#ifdef X_ALIGN + assert(offset % X_ALIGN == 0); + assert(extent % X_ALIGN == 0); +#endif + + assert(*posp == OFF_NONE || *posp == lseek(nciop->fd, 0, SEEK_CUR)); + + if(*posp != offset) + { + if(lseek(nciop->fd, offset, SEEK_SET) != offset) + { + status = errno; + return status; + } + *posp = offset; + } + + errno = 0; + nread = read(nciop->fd, vp, extent); + if(nread != (ssize_t) extent) + { + status = errno; + if(nread == -1 || status != ENOERR) + return status; + /* else it's okay we read less than asked for */ + (void) memset((char *)vp + nread, 0, (ssize_t)extent - nread); + } + *nreadp = nread; + *posp += nread; + + return ENOERR; +} + +/* This struct is for POSIX systems, with NC_SHARE not in effect. If + NC_SHARE is used, see ncio_spx. + + blksz - block size for reads and writes to file. + pos - current read/write position in file. + bf_offset - file offset corresponding to start of memory buffer + bf_extent - number of bytes in I/O request + bf_cnt - number of bytes available in buffer + bf_base - pointer to beginning of buffer. + bf_rflags - buffer region flags (defined in ncio.h) tell the lock + status, read/write permissions, and modification status of regions + of data in the buffer. + bf_refcount - buffer reference count. + slave - used in moves. +*/ +typedef struct ncio_px { + size_t blksz; + off_t pos; + /* buffer */ + off_t bf_offset; + size_t bf_extent; + size_t bf_cnt; + void *bf_base; + int bf_rflags; + int bf_refcount; + /* chain for double buffering in px_move */ + struct ncio_px *slave; +} ncio_px; + + +/*ARGSUSED*/ +/* This function indicates the file region starting at offset may be + released. + + This is for POSIX, without NC_SHARE. If called with RGN_MODIFIED + flag, sets the modified flag in pxp->bf_rflags and decrements the + reference count. + + pxp - pointer to posix non-share ncio_px struct. + + offset - file offset for beginning of to region to be + released. + + rflags - only RGN_MODIFIED is relevent to this function, others ignored +*/ +static int +px_rel(ncio_px *const pxp, off_t offset, int rflags) +{ + assert(pxp->bf_offset <= offset + && offset < pxp->bf_offset + (off_t) pxp->bf_extent); + assert(pIf(fIsSet(rflags, RGN_MODIFIED), + fIsSet(pxp->bf_rflags, RGN_WRITE))); + + if(fIsSet(rflags, RGN_MODIFIED)) + { + fSet(pxp->bf_rflags, RGN_MODIFIED); + } + pxp->bf_refcount--; + + return ENOERR; +} + +/* This function indicates the file region starting at offset may be + released. Each read or write to the file is bracketed by a call to + the "get" region function and a call to the "rel" region function. + If you only read from the memory region, release it with a flag of + 0, if you modify the region, release it with a flag of + RGN_MODIFIED. + + For POSIX system, without NC_SHARE, this becomes the rel function + pointed to by the ncio rel function pointer. It mearly checks for + file write permission, then calls px_rel to do everything. + + nciop - pointer to ncio struct. + offset - num bytes from beginning of buffer to region to be + released. + rflags - only RGN_MODIFIED is relevent to this function, others ignored +*/ +static int +ncio_px_rel(ncio *const nciop, off_t offset, int rflags) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + + if(fIsSet(rflags, RGN_MODIFIED) && !fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file */ + + return px_rel(pxp, offset, rflags); +} + +/* POSIX get. This will "make a region available." Since we're using + buffered IO, this means that if needed, we'll fetch a new page from + the file, otherwise, just return a pointer to what's in memory + already. + + nciop - pointer to ncio struct, containing file info. + pxp - pointer to ncio_px struct, which contains special metadate + for posix files without NC_SHARE. + offset - start byte of region to get. + extent - how many bytes to read. + rflags - One of the RGN_* flags defined in ncio.h. + vpp - pointer to pointer that will recieve data. + + NOTES: + + * For blkoffset round offset down to the nearest pxp->blksz. This + provides the offset (in bytes) to the beginning of the block that + holds the current offset. + + * diff tells how far into the current block we are. + + * For blkextent round up to the number of bytes at the beginning of + the next block, after the one that holds our current position, plus + whatever extra (i.e. the extent) that we are about to grab. + + * The blkextent can't be more than twice the pxp->blksz. That's + because the pxp->blksize is the sizehint, and in ncio_px_init2 the + buffer (pointed to by pxp->bf-base) is allocated with 2 * + *sizehintp. This is checked (unneccesarily) more than once in + asserts. + + * If this is called on a newly opened file, pxp->bf_offset will be + OFF_NONE and we'll jump to label pgin to immediately read in a + page. +*/ +static int +px_get(ncio *const nciop, ncio_px *const pxp, + off_t offset, size_t extent, + int rflags, + void **const vpp) +{ + int status = ENOERR; + + const off_t blkoffset = _RNDDOWN(offset, (off_t)pxp->blksz); + off_t diff = (size_t)(offset - blkoffset); + off_t blkextent = _RNDUP(diff + extent, pxp->blksz); + + assert(extent != 0); + assert(extent < X_INT_MAX); /* sanity check */ + assert(offset >= 0); /* sanity check */ + + if(2 * pxp->blksz < blkextent) + return E2BIG; /* TODO: temporary kludge */ + if(pxp->bf_offset == OFF_NONE) + { + /* Uninitialized */ + if(pxp->bf_base == NULL) + { + assert(pxp->bf_extent == 0); + assert(blkextent <= 2 * pxp->blksz); + pxp->bf_base = malloc(2 * pxp->blksz); + if(pxp->bf_base == NULL) + return ENOMEM; + } + goto pgin; + } + /* else */ + assert(blkextent <= 2 * pxp->blksz); + + if(blkoffset == pxp->bf_offset) + { + /* hit */ + if(blkextent > pxp->bf_extent) + { + /* page in upper */ + void *const middle = + (void *)((char *)pxp->bf_base + pxp->blksz); + assert(pxp->bf_extent == pxp->blksz); + status = px_pgin(nciop, + pxp->bf_offset + (off_t)pxp->blksz, + pxp->blksz, + middle, + &pxp->bf_cnt, + &pxp->pos); + if(status != ENOERR) + return status; + pxp->bf_extent = 2 * pxp->blksz; + pxp->bf_cnt += pxp->blksz; + } + goto done; + } + /* else */ + + if(pxp->bf_extent > pxp->blksz + && blkoffset == pxp->bf_offset + (off_t)pxp->blksz) + { + /* hit in upper half */ + if(blkextent == pxp->blksz) + { + /* all in upper half, no fault needed */ + diff += pxp->blksz; + goto done; + } + /* else */ + if(pxp->bf_cnt > pxp->blksz) + { + /* data in upper half */ + void *const middle = + (void *)((char *)pxp->bf_base + pxp->blksz); + assert(pxp->bf_extent == 2 * pxp->blksz); + if(fIsSet(pxp->bf_rflags, RGN_MODIFIED)) + { + /* page out lower half */ + assert(pxp->bf_refcount <= 0); + status = px_pgout(nciop, + pxp->bf_offset, + pxp->blksz, + pxp->bf_base, + &pxp->pos); + if(status != ENOERR) + return status; + } + pxp->bf_cnt -= pxp->blksz; + /* copy upper half into lower half */ + (void) memcpy(pxp->bf_base, middle, pxp->bf_cnt); + } + else /* added to fix nofill bug */ + { + assert(pxp->bf_extent == 2 * pxp->blksz); + /* still have to page out lower half, if modified */ + if(fIsSet(pxp->bf_rflags, RGN_MODIFIED)) + { + assert(pxp->bf_refcount <= 0); + status = px_pgout(nciop, + pxp->bf_offset, + pxp->blksz, + pxp->bf_base, + &pxp->pos); + if(status != ENOERR) + return status; + } + } + pxp->bf_offset = blkoffset; + /* pxp->bf_extent = pxp->blksz; */ + + assert(blkextent == 2 * pxp->blksz); + { + /* page in upper */ + void *const middle = + (void *)((char *)pxp->bf_base + pxp->blksz); + status = px_pgin(nciop, + pxp->bf_offset + (off_t)pxp->blksz, + pxp->blksz, + middle, + &pxp->bf_cnt, + &pxp->pos); + if(status != ENOERR) + return status; + pxp->bf_extent = 2 * pxp->blksz; + pxp->bf_cnt += pxp->blksz; + } + goto done; + } + /* else */ + + if(blkoffset == pxp->bf_offset - (off_t)pxp->blksz) + { + /* wants the page below */ + void *const middle = + (void *)((char *)pxp->bf_base + pxp->blksz); + size_t upper_cnt = 0; + if(pxp->bf_cnt > pxp->blksz) + { + /* data in upper half */ + assert(pxp->bf_extent == 2 * pxp->blksz); + if(fIsSet(pxp->bf_rflags, RGN_MODIFIED)) + { + /* page out upper half */ + assert(pxp->bf_refcount <= 0); + status = px_pgout(nciop, + pxp->bf_offset + (off_t)pxp->blksz, + pxp->bf_cnt - pxp->blksz, + middle, + &pxp->pos); + if(status != ENOERR) + return status; + } + pxp->bf_cnt = pxp->blksz; + pxp->bf_extent = pxp->blksz; + } + if(pxp->bf_cnt > 0) + { + /* copy lower half into upper half */ + (void) memcpy(middle, pxp->bf_base, pxp->blksz); + upper_cnt = pxp->bf_cnt; + } + /* read page below into lower half */ + status = px_pgin(nciop, + blkoffset, + pxp->blksz, + pxp->bf_base, + &pxp->bf_cnt, + &pxp->pos); + if(status != ENOERR) + return status; + pxp->bf_offset = blkoffset; + if(upper_cnt != 0) + { + pxp->bf_extent = 2 * pxp->blksz; + pxp->bf_cnt = pxp->blksz + upper_cnt; + } + else + { + pxp->bf_extent = pxp->blksz; + } + goto done; + } + /* else */ + + /* no overlap */ + if(fIsSet(pxp->bf_rflags, RGN_MODIFIED)) + { + assert(pxp->bf_refcount <= 0); + status = px_pgout(nciop, + pxp->bf_offset, + pxp->bf_cnt, + pxp->bf_base, + &pxp->pos); + if(status != ENOERR) + return status; + pxp->bf_rflags = 0; + } + +pgin: + status = px_pgin(nciop, + blkoffset, + blkextent, + pxp->bf_base, + &pxp->bf_cnt, + &pxp->pos); + if(status != ENOERR) + return status; + pxp->bf_offset = blkoffset; + pxp->bf_extent = blkextent; + +done: + extent += diff; + if(pxp->bf_cnt < extent) + pxp->bf_cnt = extent; + assert(pxp->bf_cnt <= pxp->bf_extent); + + pxp->bf_rflags |= rflags; + pxp->bf_refcount++; + + *vpp = (char *)pxp->bf_base + diff; + return ENOERR; +} + +/* Request that the region (offset, extent) be made available through + *vpp. + + This function converts a file region specified by an offset and + extent to a memory pointer. The region may be locked until the + corresponding call to rel(). + + For POSIX systems, without NC_SHARE. This function gets a page of + size extent? + + This is a wrapper for the function px_get, which does all the heavy + lifting. + + nciop - pointer to ncio struct for this file. + offset - offset (from beginning of file?) to the data we want to + read. + extent - the number of bytes to read from the file. + rflags - One of the RGN_* flags defined in ncio.h. + vpp - handle to point at data when it's been read. +*/ +static int +ncio_px_get(ncio *const nciop, + off_t offset, size_t extent, + int rflags, + void **const vpp) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + + if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file */ + + /* reclaim space used in move */ + if(pxp->slave != NULL) + { + if(pxp->slave->bf_base != NULL) + { + free(pxp->slave->bf_base); + pxp->slave->bf_base = NULL; + pxp->slave->bf_extent = 0; + pxp->slave->bf_offset = OFF_NONE; + } + free(pxp->slave); + pxp->slave = NULL; + } + return px_get(nciop, pxp, offset, extent, rflags, vpp); +} + + +/* ARGSUSED */ +static int +px_double_buffer(ncio *const nciop, off_t to, off_t from, + size_t nbytes, int rflags) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + int status = ENOERR; + void *src; + void *dest; + +#if INSTRUMENT +fprintf(stderr, "\tdouble_buffr %ld %ld %ld\n", + (long)to, (long)from, (long)nbytes); +#endif + status = px_get(nciop, pxp, to, nbytes, RGN_WRITE, + &dest); + if(status != ENOERR) + return status; + + if(pxp->slave == NULL) + { + pxp->slave = (ncio_px *) malloc(sizeof(ncio_px)); + if(pxp->slave == NULL) + return ENOMEM; + + pxp->slave->blksz = pxp->blksz; + /* pos done below */ + pxp->slave->bf_offset = pxp->bf_offset; + pxp->slave->bf_extent = pxp->bf_extent; + pxp->slave->bf_cnt = pxp->bf_cnt; + pxp->slave->bf_base = malloc(2 * pxp->blksz); + if(pxp->slave->bf_base == NULL) + return ENOMEM; + (void) memcpy(pxp->slave->bf_base, pxp->bf_base, + pxp->bf_extent); + pxp->slave->bf_rflags = 0; + pxp->slave->bf_refcount = 0; + pxp->slave->slave = NULL; + } + + pxp->slave->pos = pxp->pos; + status = px_get(nciop, pxp->slave, from, nbytes, 0, + &src); + if(status != ENOERR) + return status; + if(pxp->pos != pxp->slave->pos) + { + /* position changed, sync */ + pxp->pos = pxp->slave->pos; + } + + (void) memcpy(dest, src, nbytes); + + (void)px_rel(pxp->slave, from, 0); + (void)px_rel(pxp, to, RGN_MODIFIED); + + return status; +} + +/* Like memmove(), safely move possibly overlapping data. + + Copy one region to another without making anything available to + higher layers. May be just implemented in terms of get() and rel(), + or may be tricky to be efficient. Only used in by nc_enddef() + after redefinition. + + nciop - pointer to ncio struct with file info. + to - src for move? + from - dest for move? + nbytes - number of bytes to move. + rflags - One of the RGN_* flags defined in ncio.h. The only + reasonable flag value is RGN_NOLOCK. +*/ +static int +ncio_px_move(ncio *const nciop, off_t to, off_t from, + size_t nbytes, int rflags) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + int status = ENOERR; + off_t lower; + off_t upper; + char *base; + size_t diff; + size_t extent; + + if(to == from) + return ENOERR; /* NOOP */ + + if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file */ + + rflags &= RGN_NOLOCK; /* filter unwanted flags */ + + if(to > from) + { + /* growing */ + lower = from; + upper = to; + } + else + { + /* shrinking */ + lower = to; + upper = from; + } + diff = (size_t)(upper - lower); + extent = diff + nbytes; + +#if INSTRUMENT +fprintf(stderr, "ncio_px_move %ld %ld %ld %ld %ld\n", + (long)to, (long)from, (long)nbytes, (long)lower, (long)extent); +#endif + if(extent > pxp->blksz) + { + size_t remaining = nbytes; + +if(to > from) +{ + off_t frm = from + nbytes; + off_t toh = to + nbytes; + for(;;) + { + size_t loopextent = MIN(remaining, pxp->blksz); + frm -= loopextent; + toh -= loopextent; + + status = px_double_buffer(nciop, toh, frm, + loopextent, rflags) ; + if(status != ENOERR) + return status; + remaining -= loopextent; + + if(remaining == 0) + break; /* normal loop exit */ + } +} +else +{ + for(;;) + { + size_t loopextent = MIN(remaining, pxp->blksz); + + status = px_double_buffer(nciop, to, from, + loopextent, rflags) ; + if(status != ENOERR) + return status; + remaining -= loopextent; + + if(remaining == 0) + break; /* normal loop exit */ + to += loopextent; + from += loopextent; + } +} + return ENOERR; + } + +#if INSTRUMENT +fprintf(stderr, "\tncio_px_move small\n"); +#endif + status = px_get(nciop, pxp, lower, extent, RGN_WRITE|rflags, + (void **)&base); + + if(status != ENOERR) + return status; + + if(to > from) + (void) memmove(base + diff, base, nbytes); + else + (void) memmove(base, base + diff, nbytes); + + (void) px_rel(pxp, lower, RGN_MODIFIED); + + return status; +} + + +/* Flush any buffers to disk. May be a no-op on if I/O is unbuffered. + This function is used when NC_SHARE is NOT used. +*/ +static int +ncio_px_sync(ncio *const nciop) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + int status = ENOERR; + if(fIsSet(pxp->bf_rflags, RGN_MODIFIED)) + { + assert(pxp->bf_refcount <= 0); + status = px_pgout(nciop, pxp->bf_offset, + pxp->bf_cnt, + pxp->bf_base, &pxp->pos); + if(status != ENOERR) + return status; + pxp->bf_rflags = 0; + } + else if (!fIsSet(pxp->bf_rflags, RGN_WRITE)) + { + /* + * The dataset is readonly. Invalidate the buffers so + * that the next ncio_px_get() will actually read data. + */ + pxp->bf_offset = OFF_NONE; + pxp->bf_cnt = 0; + } + return status; +} + +/* Internal function called at close to + free up anything hanging off pvt. +*/ +static void +ncio_px_freepvt(void *const pvt) +{ + ncio_px *const pxp = (ncio_px *)pvt; + if(pxp == NULL) + return; + + if(pxp->slave != NULL) + { + if(pxp->slave->bf_base != NULL) + { + free(pxp->slave->bf_base); + pxp->slave->bf_base = NULL; + pxp->slave->bf_extent = 0; + pxp->slave->bf_offset = OFF_NONE; + } + free(pxp->slave); + pxp->slave = NULL; + } + + if(pxp->bf_base != NULL) + { + free(pxp->bf_base); + pxp->bf_base = NULL; + pxp->bf_extent = 0; + pxp->bf_offset = OFF_NONE; + } +} + + +/* This is the second half of the ncio initialization. This is called + after the file has actually been opened. + + The most important thing that happens is the allocation of a block + of memory at pxp->bf_base. This is going to be twice the size of + the chunksizehint (rounded up to the nearest sizeof(double)) passed + in from nc__create or nc__open. The rounded chunksizehint (passed + in here in sizehintp) is going to be stored as pxp->blksize. + + According to our "contract" we are not allowed to ask for an extent + larger than this chunksize/sizehint/blksize from the ncio get + function. + + nciop - pointer to the ncio struct + sizehintp - pointer to a size hint that will be rounded up and + passed back to the caller. + isNew - true if this is being called from ncio_create for a new + file. +*/ +static int +ncio_px_init2(ncio *const nciop, size_t *sizehintp, int isNew) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + const size_t bufsz = 2 * *sizehintp; + + assert(nciop->fd >= 0); + + pxp->blksz = *sizehintp; + + assert(pxp->bf_base == NULL); + + /* this is separate allocation because it may grow */ + pxp->bf_base = malloc(bufsz); + if(pxp->bf_base == NULL) + return ENOMEM; + /* else */ + pxp->bf_cnt = 0; + if(isNew) + { + /* save a read */ + pxp->pos = 0; + pxp->bf_offset = 0; + pxp->bf_extent = bufsz; + (void) memset(pxp->bf_base, 0, pxp->bf_extent); + } + return ENOERR; +} + + +/* This is the first of a two-part initialization of the ncio struct. + Here the rel, get, move, sync, and free function pointers are set + to their POSIX non-NC_SHARE functions (ncio_px_*). + + The ncio_px struct is also partially initialized. +*/ +static void +ncio_px_init(ncio *const nciop) +{ + ncio_px *const pxp = (ncio_px *)nciop->pvt; + + *((ncio_relfunc **)&nciop->rel) = ncio_px_rel; /* cast away const */ + *((ncio_getfunc **)&nciop->get) = ncio_px_get; /* cast away const */ + *((ncio_movefunc **)&nciop->move) = ncio_px_move; /* cast away const */ + *((ncio_syncfunc **)&nciop->sync) = ncio_px_sync; /* cast away const */ + *((ncio_filesizefunc **)&nciop->filesize) = ncio_px_filesize; /* cast away const */ + *((ncio_pad_lengthfunc **)&nciop->pad_length) = ncio_px_pad_length; /* cast away const */ + *((ncio_closefunc **)&nciop->close) = ncio_px_close; /* cast away const */ + + pxp->blksz = 0; + pxp->pos = -1; + pxp->bf_offset = OFF_NONE; + pxp->bf_extent = 0; + pxp->bf_rflags = 0; + pxp->bf_refcount = 0; + pxp->bf_base = NULL; + pxp->slave = NULL; + +} + +/* Begin spx */ + +/* This is the struct that gets hung of ncio->pvt(?) when the NC_SHARE + flag is used. +*/ +typedef struct ncio_spx { + off_t pos; + /* buffer */ + off_t bf_offset; + size_t bf_extent; + size_t bf_cnt; + void *bf_base; +} ncio_spx; + + +/*ARGSUSED*/ +/* This function releases the region specified by offset. + + For POSIX system, with NC_SHARE, this becomes the rel function + pointed to by the ncio rel function pointer. It mearly checks for + file write permission, then calls px_rel to do everything. + + nciop - pointer to ncio struct. + + offset - beginning of region. + + rflags - One of the RGN_* flags defined in ncio.h. If set to + RGN_MODIFIED it means that the data in this region were modified, + and it needs to be written out to the disk immediately (since we + are not buffering with NC_SHARE on). + +*/ +static int +ncio_spx_rel(ncio *const nciop, off_t offset, int rflags) +{ + ncio_spx *const pxp = (ncio_spx *)nciop->pvt; + int status = ENOERR; + + assert(pxp->bf_offset <= offset); + assert(pxp->bf_cnt != 0); + assert(pxp->bf_cnt <= pxp->bf_extent); +#ifdef X_ALIGN + assert(offset < pxp->bf_offset + X_ALIGN); + assert(pxp->bf_cnt % X_ALIGN == 0 ); +#endif + + if(fIsSet(rflags, RGN_MODIFIED)) + { + if(!fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file */ + + status = px_pgout(nciop, pxp->bf_offset, + pxp->bf_cnt, + pxp->bf_base, &pxp->pos); + /* if error, invalidate buffer anyway */ + } + pxp->bf_offset = OFF_NONE; + pxp->bf_cnt = 0; + return status; +} + + +/* Request that the region (offset, extent) be made available through + *vpp. + + This function converts a file region specified by an offset and + extent to a memory pointer. The region may be locked until the + corresponding call to rel(). + + For POSIX systems, with NC_SHARE. + + nciop - pointer to ncio struct for this file. + offset - offset (from beginning of file?) to the data we want to + read. + extent - the number of bytes we want. + rflags - One of the RGN_* flags defined in ncio.h. May be RGN_NOLOCK. + vpp - handle to point at data when it's been read. +*/ +static int +ncio_spx_get(ncio *const nciop, + off_t offset, size_t extent, + int rflags, + void **const vpp) +{ + ncio_spx *const pxp = (ncio_spx *)nciop->pvt; + int status = ENOERR; +#ifdef X_ALIGN + size_t rem; +#endif + + if(fIsSet(rflags, RGN_WRITE) && !fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file */ + + assert(extent != 0); + assert(extent < X_INT_MAX); /* sanity check */ + + assert(pxp->bf_cnt == 0); + +#ifdef X_ALIGN + rem = (size_t)(offset % X_ALIGN); + if(rem != 0) + { + offset -= rem; + extent += rem; + } + + { + const size_t rndup = extent % X_ALIGN; + if(rndup != 0) + extent += X_ALIGN - rndup; + } + + assert(offset % X_ALIGN == 0); + assert(extent % X_ALIGN == 0); +#endif + + if(pxp->bf_extent < extent) + { + if(pxp->bf_base != NULL) + { + free(pxp->bf_base); + pxp->bf_base = NULL; + pxp->bf_extent = 0; + } + assert(pxp->bf_extent == 0); + pxp->bf_base = malloc(extent); + if(pxp->bf_base == NULL) + return ENOMEM; + pxp->bf_extent = extent; + } + + status = px_pgin(nciop, offset, + extent, + pxp->bf_base, + &pxp->bf_cnt, &pxp->pos); + if(status != ENOERR) + return status; + + pxp->bf_offset = offset; + + if(pxp->bf_cnt < extent) + pxp->bf_cnt = extent; + +#ifdef X_ALIGN + *vpp = (char *)pxp->bf_base + rem; +#else + *vpp = pxp->bf_base; +#endif + return ENOERR; +} + + +#if 0 +/*ARGSUSED*/ +static int +strategy(ncio *const nciop, off_t to, off_t offset, + size_t extent, int rflags) +{ + static ncio_spx pxp[1]; + int status = ENOERR; +#ifdef X_ALIGN + size_t rem; +#endif + + assert(extent != 0); + assert(extent < X_INT_MAX); /* sanity check */ +#if INSTRUMENT +fprintf(stderr, "strategy %ld at %ld to %ld\n", + (long)extent, (long)offset, (long)to); +#endif + + +#ifdef X_ALIGN + rem = (size_t)(offset % X_ALIGN); + if(rem != 0) + { + offset -= rem; + extent += rem; + } + + { + const size_t rndup = extent % X_ALIGN; + if(rndup != 0) + extent += X_ALIGN - rndup; + } + + assert(offset % X_ALIGN == 0); + assert(extent % X_ALIGN == 0); +#endif + + if(pxp->bf_extent < extent) + { + if(pxp->bf_base != NULL) + { + free(pxp->bf_base); + pxp->bf_base = NULL; + pxp->bf_extent = 0; + } + assert(pxp->bf_extent == 0); + pxp->bf_base = malloc(extent); + if(pxp->bf_base == NULL) + return ENOMEM; + pxp->bf_extent = extent; + } + + status = px_pgin(nciop, offset, + extent, + pxp->bf_base, + &pxp->bf_cnt, &pxp->pos); + if(status != ENOERR) + return status; + + pxp->bf_offset = to; /* TODO: XALIGN */ + + if(pxp->bf_cnt < extent) + pxp->bf_cnt = extent; + + status = px_pgout(nciop, pxp->bf_offset, + pxp->bf_cnt, + pxp->bf_base, &pxp->pos); + /* if error, invalidate buffer anyway */ + pxp->bf_offset = OFF_NONE; + pxp->bf_cnt = 0; + return status; +} +#endif + +/* Copy one region to another without making anything available to + higher layers. May be just implemented in terms of get() and rel(), + or may be tricky to be efficient. Only used in by nc_enddef() + after redefinition. + + nciop - pointer to ncio struct for this file. + to - dest for move? + from - src for move? + nbytes - number of bytes to move. + rflags - One of the RGN_* flags defined in ncio.h. +*/ +static int +ncio_spx_move(ncio *const nciop, off_t to, off_t from, + size_t nbytes, int rflags) +{ + int status = ENOERR; + off_t lower = from; + off_t upper = to; + char *base; + size_t diff; + size_t extent; + + rflags &= RGN_NOLOCK; /* filter unwanted flags */ + + if(to == from) + return ENOERR; /* NOOP */ + + if(to > from) + { + /* growing */ + lower = from; + upper = to; + } + else + { + /* shrinking */ + lower = to; + upper = from; + } + + diff = (size_t)(upper - lower); + extent = diff + nbytes; + + status = ncio_spx_get(nciop, lower, extent, RGN_WRITE|rflags, + (void **)&base); + + if(status != ENOERR) + return status; + + if(to > from) + (void) memmove(base + diff, base, nbytes); + else + (void) memmove(base, base + diff, nbytes); + + (void) ncio_spx_rel(nciop, lower, RGN_MODIFIED); + + return status; +} + + +/*ARGSUSED*/ +/* Flush any buffers to disk. May be a no-op on if I/O is unbuffered. +*/ +static int +ncio_spx_sync(ncio *const nciop) +{ + /* NOOP */ + return ENOERR; +} + +static void +ncio_spx_freepvt(void *const pvt) +{ + ncio_spx *const pxp = (ncio_spx *)pvt; + if(pxp == NULL) + return; + + if(pxp->bf_base != NULL) + { + free(pxp->bf_base); + pxp->bf_base = NULL; + pxp->bf_offset = OFF_NONE; + pxp->bf_extent = 0; + pxp->bf_cnt = 0; + } +} + + +/* This does the second half of the ncio_spx struct initialization for + POSIX systems, with NC_SHARE on. + + nciop - pointer to ncio struct for this file. File has been opened. + sizehintp - pointer to a size which will be rounded up to the + nearest 8-byt boundary and then used as the max size "chunk" (or + page) to read from the file. +*/ +static int +ncio_spx_init2(ncio *const nciop, const size_t *const sizehintp) +{ + ncio_spx *const pxp = (ncio_spx *)nciop->pvt; + + assert(nciop->fd >= 0); + + pxp->bf_extent = *sizehintp; + + assert(pxp->bf_base == NULL); + + /* this is separate allocation because it may grow */ + pxp->bf_base = malloc(pxp->bf_extent); + if(pxp->bf_base == NULL) + { + pxp->bf_extent = 0; + return ENOMEM; + } + /* else */ + return ENOERR; +} + + +/* First half of init for ncio_spx struct, setting the rel, get, move, + snyc, and free function pointers to the NC_SHARE versions of these + functions (i.e. the ncio_spx_* functions). +*/ +static void +ncio_spx_init(ncio *const nciop) +{ + ncio_spx *const pxp = (ncio_spx *)nciop->pvt; + + *((ncio_relfunc **)&nciop->rel) = ncio_spx_rel; /* cast away const */ + *((ncio_getfunc **)&nciop->get) = ncio_spx_get; /* cast away const */ + *((ncio_movefunc **)&nciop->move) = ncio_spx_move; /* cast away const */ + *((ncio_syncfunc **)&nciop->sync) = ncio_spx_sync; /* cast away const */ + /* shared with _px_ */ + *((ncio_filesizefunc **)&nciop->filesize) = ncio_px_filesize; /* cast away const */ + *((ncio_pad_lengthfunc **)&nciop->pad_length) = ncio_px_pad_length; /* cast away const */ + *((ncio_closefunc **)&nciop->close) = ncio_spx_close; /* cast away const */ + + pxp->pos = -1; + pxp->bf_offset = OFF_NONE; + pxp->bf_extent = 0; + pxp->bf_cnt = 0; + pxp->bf_base = NULL; +} + + +/* */ + +/* This will call whatever free function is attached to the free + function pointer in ncio. It's called from ncio_close, and from + ncio_open and ncio_create when an error occurs that the file + metadata must be freed. +*/ +static void +ncio_px_free(ncio *nciop) +{ + if(nciop == NULL) + return; + if(nciop->pvt != NULL) + ncio_px_freepvt(nciop->pvt); + free(nciop); +} + +static void +ncio_spx_free(ncio *nciop) +{ + if(nciop == NULL) + return; + if(nciop->pvt != NULL) + ncio_spx_freepvt(nciop->pvt); + free(nciop); +} + + +/* Create a new ncio struct to hold info about the file. This will + create and init the ncio_px or ncio_spx struct (the latter if + NC_SHARE is used.) +*/ +static ncio * +ncio_px_new(const char *path, int ioflags) +{ + size_t sz_ncio = M_RNDUP(sizeof(ncio)); + size_t sz_path = M_RNDUP(strlen(path) +1); + size_t sz_ncio_pvt; + ncio *nciop; + +#if ALWAYS_NC_SHARE /* DEBUG */ + fSet(ioflags, NC_SHARE); +#endif + + if(fIsSet(ioflags, NC_SHARE)) + sz_ncio_pvt = sizeof(ncio_spx); + else + sz_ncio_pvt = sizeof(ncio_px); + + nciop = (ncio *) malloc(sz_ncio + sz_path + sz_ncio_pvt); + if(nciop == NULL) + return NULL; + + nciop->ioflags = ioflags; + *((int *)&nciop->fd) = -1; /* cast away const */ + + nciop->path = (char *) ((char *)nciop + sz_ncio); + (void) strcpy((char *)nciop->path, path); /* cast away const */ + + /* cast away const */ + *((void **)&nciop->pvt) = (void *)(nciop->path + sz_path); + + if(fIsSet(ioflags, NC_SHARE)) + ncio_spx_init(nciop); + else + ncio_px_init(nciop); + + return nciop; +} + + +/* Public below this point */ +#ifndef NCIO_MINBLOCKSIZE +#define NCIO_MINBLOCKSIZE 256 +#endif +#ifndef NCIO_MAXBLOCKSIZE +#define NCIO_MAXBLOCKSIZE 268435456 /* sanity check, about X_SIZE_T_MAX/8 */ +#endif + +#ifdef S_IRUSR +#define NC_DEFAULT_CREAT_MODE \ + (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666 */ + +#else +#define NC_DEFAULT_CREAT_MODE 0666 +#endif + +/* Create a file, and the ncio struct to go with it. This funtion is + only called from nc__create_mp. + + path - path of file to create. + ioflags - flags from nc_create + initialsz - From the netcdf man page: "The argument + Iinitialsize sets the initial size of the file at creation time." + igeto - + igetsz - + sizehintp - this eventually goes into pxp->blksz and is the size of + a page of data for buffered reads and writes. + nciopp - pointer to a pointer that will get location of newly + created and inited ncio struct. + igetvpp - pointer to pointer which will get the location of ? +*/ +int +posixio_create(const char *path, int ioflags, + size_t initialsz, + off_t igeto, size_t igetsz, size_t *sizehintp, + ncio **nciopp, void **const igetvpp) +{ + ncio *nciop; + int oflags = (O_RDWR|O_CREAT); + int fd; + int status; + + if(initialsz < (size_t)igeto + igetsz) + initialsz = (size_t)igeto + igetsz; + + fSet(ioflags, NC_WRITE); + + if(path == NULL || *path == 0) + return EINVAL; + + nciop = ncio_px_new(path, ioflags); + if(nciop == NULL) + return ENOMEM; + + if(fIsSet(ioflags, NC_NOCLOBBER)) + fSet(oflags, O_EXCL); + else + fSet(oflags, O_TRUNC); +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif +#ifdef vms + fd = open(path, oflags, NC_DEFAULT_CREAT_MODE, "ctx=stm"); +#else + /* Should we mess with the mode based on NC_SHARE ?? */ + fd = open(path, oflags, NC_DEFAULT_CREAT_MODE); +#endif +#if 0 + (void) fprintf(stderr, "ncio_create(): path=\"%s\"\n", path); + (void) fprintf(stderr, "ncio_create(): oflags=0x%x\n", oflags); +#endif + if(fd < 0) + { + status = errno; + goto unwind_new; + } + *((int *)&nciop->fd) = fd; /* cast away const */ + + if(*sizehintp < NCIO_MINBLOCKSIZE) + { + /* Use default */ + *sizehintp = blksize(fd); + } + else if(*sizehintp >= NCIO_MAXBLOCKSIZE) + { + /* Use maximum allowed value */ + *sizehintp = NCIO_MAXBLOCKSIZE; + } + else + { + *sizehintp = M_RNDUP(*sizehintp); + } + + if(fIsSet(nciop->ioflags, NC_SHARE)) + status = ncio_spx_init2(nciop, sizehintp); + else + status = ncio_px_init2(nciop, sizehintp, 1); + + if(status != ENOERR) + goto unwind_open; + + if(initialsz != 0) + { + status = fgrow(fd, (off_t)initialsz); + if(status != ENOERR) + goto unwind_open; + } + + if(igetsz != 0) + { + status = nciop->get(nciop, + igeto, igetsz, + RGN_WRITE, + igetvpp); + if(status != ENOERR) + goto unwind_open; + } + + *nciopp = nciop; + return ENOERR; + +unwind_open: + (void) close(fd); + /* ?? unlink */ + /*FALLTHRU*/ +unwind_new: + ncio_close(nciop,!fIsSet(ioflags, NC_NOCLOBBER)); + return status; +} + + +/* This function opens the data file. It is only called from nc.c, + from nc__open_mp and nc_delete_mp. + + path - path of data file. + + ioflags - flags passed into nc_open. + + igeto - looks like this function can do an initial page get, and + igeto is going to be the offset for that. But it appears to be + unused + + igetsz - the size in bytes of initial page get (a.k.a. extent). Not + ever used in the library. + + sizehintp - pointer to sizehint parameter from nc__open or + nc__create. This is used to set pxp->blksz. + + Here's what the man page has to say: + + "The argument referenced by chunksize controls a space versus time + tradeoff, memory allocated in the netcdf library versus number of + system calls. + + Because of internal requirements, the value may not be set to + exactly the value requested. The actual value chosen is returned by reference. + + Using the value NC_SIZEHINT_DEFAULT causes the library to choose a + default. How the system choses the default depends on the + system. On many systems, the "preferred I/O block size" is + available from the stat() system call, struct stat member + st_blksize. If this is available it is used. Lacking that, twice + the system pagesize is used. Lacking a call to discover the system + pagesize, we just set default chunksize to 8192. + + The chunksize is a property of a given open netcdf descriptor ncid, + it is not a persistent property of the netcdf dataset." + + nciopp - pointer to pointer that will get address of newly created + and inited ncio struct. + + igetvpp - handle to pass back pointer to data from inital page + read, if this were ever used, which it isn't. +*/ +int +posixio_open(const char *path, + int ioflags, + off_t igeto, size_t igetsz, size_t *sizehintp, + ncio **nciopp, void **const igetvpp) +{ + ncio *nciop; + int oflags = fIsSet(ioflags, NC_WRITE) ? O_RDWR : O_RDONLY; + int fd; + int status; + + if(path == NULL || *path == 0) + return EINVAL; + + nciop = ncio_px_new(path, ioflags); + if(nciop == NULL) + return ENOMEM; + +#ifdef O_BINARY + fSet(oflags, O_BINARY); +#endif +#ifdef vms + fd = open(path, oflags, 0, "ctx=stm"); +#else + fd = open(path, oflags, 0); +#endif + if(fd < 0) + { + status = errno; + goto unwind_new; + } + *((int *)&nciop->fd) = fd; /* cast away const */ + + if(*sizehintp < NCIO_MINBLOCKSIZE) + { + /* Use default */ + *sizehintp = blksize(fd); + } + else if(*sizehintp >= NCIO_MAXBLOCKSIZE) + { + /* Use maximum allowed value */ + *sizehintp = NCIO_MAXBLOCKSIZE; + } + else + { + *sizehintp = M_RNDUP(*sizehintp); + } + + if(fIsSet(nciop->ioflags, NC_SHARE)) + status = ncio_spx_init2(nciop, sizehintp); + else + status = ncio_px_init2(nciop, sizehintp, 0); + + if(status != ENOERR) + goto unwind_open; + + if(igetsz != 0) + { + status = nciop->get(nciop, + igeto, igetsz, + 0, + igetvpp); + if(status != ENOERR) + goto unwind_open; + } + + *nciopp = nciop; + return ENOERR; + +unwind_open: + (void) close(fd); + /*FALLTHRU*/ +unwind_new: + ncio_close(nciop,0); + return status; +} + +/* + * Get file size in bytes. + */ +static int +ncio_px_filesize(ncio *nciop, off_t *filesizep) +{ + struct stat sb; + + assert(nciop != NULL); + if (fstat(nciop->fd, &sb) < 0) + return errno; + *filesizep = sb.st_size; + return ENOERR; +} + +/* + * Sync any changes to disk, then truncate or extend file so its size + * is length. This is only intended to be called before close, if the + * file is open for writing and the actual size does not match the + * calculated size, perhaps as the result of having been previously + * written in NOFILL mode. + */ +static int +ncio_px_pad_length(ncio *nciop, off_t length) +{ + int status = ENOERR; + + if(nciop == NULL) + return EINVAL; + + if(!fIsSet(nciop->ioflags, NC_WRITE)) + return EPERM; /* attempt to write readonly file */ + + status = nciop->sync(nciop); + if(status != ENOERR) + return status; + + status = fgrow2(nciop->fd, length); + if(status != ENOERR) + return status; + return ENOERR; +} + + +/* Write out any dirty buffers to disk and + ensure that next read will get data from disk. + + Sync any changes, then close the open file associated with the ncio + struct, and free its memory. + + nciop - pointer to ncio to close. + + doUnlink - if true, unlink file +*/ +static int +ncio_px_close(ncio *nciop, int doUnlink) +{ + int status = ENOERR; + if(nciop == NULL) + return EINVAL; + status = nciop->sync(nciop); + (void) close(nciop->fd); + if(doUnlink) + (void) unlink(nciop->path); + ncio_px_free(nciop); + return status; +} + +static int +ncio_spx_close(ncio *nciop, int doUnlink) +{ + int status = ENOERR; + if(nciop == NULL) + return EINVAL; + status = nciop->sync(nciop); + (void) close(nciop->fd); + if(doUnlink) + (void) unlink(nciop->path); + ncio_spx_free(nciop); + return status; +} diff --git a/extern/src_netcdf4/pstdint.h b/extern/src_netcdf4/pstdint.h new file mode 100644 index 0000000..6a334ba --- /dev/null +++ b/extern/src_netcdf4/pstdint.h @@ -0,0 +1,799 @@ +/* A portable stdint.h + **************************************************************************** + * BSD License: + **************************************************************************** + * + * Copyright (c) 2005-2007 Paul Hsieh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************** + * + * Version 0.1.11 + * + * The ANSI C standard committee, for the C99 standard, specified the + * inclusion of a new standard include file called stdint.h. This is + * a very useful and long desired include file which contains several + * very precise definitions for integer scalar types that is + * critically important for making portable several classes of + * applications including cryptography, hashing, variable length + * integer libraries and so on. But for most developers its likely + * useful just for programming sanity. + * + * The problem is that most compiler vendors have decided not to + * implement the C99 standard, and the next C++ language standard + * (which has a lot more mindshare these days) will be a long time in + * coming and its unknown whether or not it will include stdint.h or + * how much adoption it will have. Either way, it will be a long time + * before all compilers come with a stdint.h and it also does nothing + * for the extremely large number of compilers available today which + * do not include this file, or anything comparable to it. + * + * So that's what this file is all about. Its an attempt to build a + * single universal include file that works on as many platforms as + * possible to deliver what stdint.h is supposed to. A few things + * that should be noted about this file: + * + * 1) It is not guaranteed to be portable and/or present an identical + * interface on all platforms. The extreme variability of the + * ANSI C standard makes this an impossibility right from the + * very get go. Its really only meant to be useful for the vast + * majority of platforms that possess the capability of + * implementing usefully and precisely defined, standard sized + * integer scalars. Systems which are not intrinsically 2s + * complement may produce invalid constants. + * + * 2) There is an unavoidable use of non-reserved symbols. + * + * 3) Other standard include files are invoked. + * + * 4) This file may come in conflict with future platforms that do + * include stdint.h. The hope is that one or the other can be + * used with no real difference. + * + * 5) In the current verison, if your platform can't represent + * int32_t, int16_t and int8_t, it just dumps out with a compiler + * error. + * + * 6) 64 bit integers may or may not be defined. Test for their + * presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX. + * Note that this is different from the C99 specification which + * requires the existence of 64 bit support in the compiler. If + * this is not defined for your platform, yet it is capable of + * dealing with 64 bits then it is because this file has not yet + * been extended to cover all of your system's capabilities. + * + * 7) (u)intptr_t may or may not be defined. Test for its presence + * with the test: #ifdef PTRDIFF_MAX. If this is not defined + * for your platform, then it is because this file has not yet + * been extended to cover all of your system's capabilities, not + * because its optional. + * + * 8) The following might not been defined even if your platform is + * capable of defining it: + * + * WCHAR_MIN + * WCHAR_MAX + * (u)int64_t + * PTRDIFF_MIN + * PTRDIFF_MAX + * (u)intptr_t + * + * 9) The following have not been defined: + * + * WINT_MIN + * WINT_MAX + * + * 10) The criteria for defining (u)int_least(*)_t isn't clear, + * except for systems which don't have a type that precisely + * defined 8, 16, or 32 bit types (which this include file does + * not support anyways). Default definitions have been given. + * + * 11) The criteria for defining (u)int_fast(*)_t isn't something I + * would trust to any particular compiler vendor or the ANSI C + * committee. It is well known that "compatible systems" are + * commonly created that have very different performance + * characteristics from the systems they are compatible with, + * especially those whose vendors make both the compiler and the + * system. Default definitions have been given, but its strongly + * recommended that users never use these definitions for any + * reason (they do *NOT* deliver any serious guarantee of + * improved performance -- not in this file, nor any vendor's + * stdint.h). + * + * 12) The following macros: + * + * PRINTF_INTMAX_MODIFIER + * PRINTF_INT64_MODIFIER + * PRINTF_INT32_MODIFIER + * PRINTF_INT16_MODIFIER + * PRINTF_LEAST64_MODIFIER + * PRINTF_LEAST32_MODIFIER + * PRINTF_LEAST16_MODIFIER + * PRINTF_INTPTR_MODIFIER + * + * are strings which have been defined as the modifiers required + * for the "d", "u" and "x" printf formats to correctly output + * (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t, + * (u)least32_t, (u)least16_t and (u)intptr_t types respectively. + * PRINTF_INTPTR_MODIFIER is not defined for some systems which + * provide their own stdint.h. PRINTF_INT64_MODIFIER is not + * defined if INT64_MAX is not defined. These are an extension + * beyond what C99 specifies must be in stdint.h. + * + * In addition, the following macros are defined: + * + * PRINTF_INTMAX_HEX_WIDTH + * PRINTF_INT64_HEX_WIDTH + * PRINTF_INT32_HEX_WIDTH + * PRINTF_INT16_HEX_WIDTH + * PRINTF_INT8_HEX_WIDTH + * PRINTF_INTMAX_DEC_WIDTH + * PRINTF_INT64_DEC_WIDTH + * PRINTF_INT32_DEC_WIDTH + * PRINTF_INT16_DEC_WIDTH + * PRINTF_INT8_DEC_WIDTH + * + * Which specifies the maximum number of characters required to + * print the number of that type in either hexadecimal or decimal. + * These are an extension beyond what C99 specifies must be in + * stdint.h. + * + * Compilers tested (all with 0 warnings at their highest respective + * settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32 + * bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio + * .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3 + * + * This file should be considered a work in progress. Suggestions for + * improvements, especially those which increase coverage are strongly + * encouraged. + * + * Acknowledgements + * + * The following people have made significant contributions to the + * development and testing of this file: + * + * Chris Howie + * John Steele Scott + * Dave Thorup + * + */ + +#include +#include +#include + +/* + * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and + * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_. + */ + +#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) )) && !defined (_PSTDINT_H_INCLUDED) +#include +#define _PSTDINT_H_INCLUDED +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "l" +# endif +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "h" +# endif +# ifndef PRINTF_INTMAX_MODIFIER +# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER +# endif +# ifndef PRINTF_INT64_HEX_WIDTH +# define PRINTF_INT64_HEX_WIDTH "16" +# endif +# ifndef PRINTF_INT32_HEX_WIDTH +# define PRINTF_INT32_HEX_WIDTH "8" +# endif +# ifndef PRINTF_INT16_HEX_WIDTH +# define PRINTF_INT16_HEX_WIDTH "4" +# endif +# ifndef PRINTF_INT8_HEX_WIDTH +# define PRINTF_INT8_HEX_WIDTH "2" +# endif +# ifndef PRINTF_INT64_DEC_WIDTH +# define PRINTF_INT64_DEC_WIDTH "20" +# endif +# ifndef PRINTF_INT32_DEC_WIDTH +# define PRINTF_INT32_DEC_WIDTH "10" +# endif +# ifndef PRINTF_INT16_DEC_WIDTH +# define PRINTF_INT16_DEC_WIDTH "5" +# endif +# ifndef PRINTF_INT8_DEC_WIDTH +# define PRINTF_INT8_DEC_WIDTH "3" +# endif +# ifndef PRINTF_INTMAX_HEX_WIDTH +# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH +# endif +# ifndef PRINTF_INTMAX_DEC_WIDTH +# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH +# endif + +/* + * Something really weird is going on with Open Watcom. Just pull some of + * these duplicated definitions from Open Watcom's stdint.h file for now. + */ + +# if defined (__WATCOMC__) && __WATCOMC__ >= 1250 +# if !defined (INT64_C) +# define INT64_C(x) (x + (INT64_MAX - INT64_MAX)) +# endif +# if !defined (UINT64_C) +# define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) +# endif +# if !defined (INT32_C) +# define INT32_C(x) (x + (INT32_MAX - INT32_MAX)) +# endif +# if !defined (UINT32_C) +# define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX)) +# endif +# if !defined (INT16_C) +# define INT16_C(x) (x) +# endif +# if !defined (UINT16_C) +# define UINT16_C(x) (x) +# endif +# if !defined (INT8_C) +# define INT8_C(x) (x) +# endif +# if !defined (UINT8_C) +# define UINT8_C(x) (x) +# endif +# if !defined (UINT64_MAX) +# define UINT64_MAX 18446744073709551615ULL +# endif +# if !defined (INT64_MAX) +# define INT64_MAX 9223372036854775807LL +# endif +# if !defined (UINT32_MAX) +# define UINT32_MAX 4294967295UL +# endif +# if !defined (INT32_MAX) +# define INT32_MAX 2147483647L +# endif +# if !defined (INTMAX_MAX) +# define INTMAX_MAX INT64_MAX +# endif +# if !defined (INTMAX_MIN) +# define INTMAX_MIN INT64_MIN +# endif +# endif +#endif + +#ifndef _PSTDINT_H_INCLUDED +#define _PSTDINT_H_INCLUDED + +#ifndef SIZE_MAX +# define SIZE_MAX (~(size_t)0) +#endif + +/* + * Deduce the type assignments from limits.h under the assumption that + * integer sizes in bits are powers of 2, and follow the ANSI + * definitions. + */ + +#ifndef UINT8_MAX +# define UINT8_MAX 0xff +#endif +#ifndef uint8_t +# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S) + typedef unsigned char uint8_t; +# define UINT8_C(v) ((uint8_t) v) +# else +# error "Platform not supported" +# endif +#endif + +#ifndef INT8_MAX +# define INT8_MAX 0x7f +#endif +#ifndef INT8_MIN +# define INT8_MIN INT8_C(0x80) +#endif +#ifndef int8_t +# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S) + typedef signed char int8_t; +# define INT8_C(v) ((int8_t) v) +# else +# error "Platform not supported" +# endif +#endif + +#ifndef UINT16_MAX +# define UINT16_MAX 0xffff +#endif +#ifndef uint16_t +#if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S) + typedef unsigned int uint16_t; +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "" +# endif +# define UINT16_C(v) ((uint16_t) (v)) +#elif (USHRT_MAX == UINT16_MAX) + typedef unsigned short uint16_t; +# define UINT16_C(v) ((uint16_t) (v)) +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "h" +# endif +#else +#error "Platform not supported" +#endif +#endif + +#ifndef INT16_MAX +# define INT16_MAX 0x7fff +#endif +#ifndef INT16_MIN +# define INT16_MIN INT16_C(0x8000) +#endif +#ifndef int16_t +#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S) + typedef signed int int16_t; +# define INT16_C(v) ((int16_t) (v)) +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "" +# endif +#elif (SHRT_MAX == INT16_MAX) + typedef signed short int16_t; +# define INT16_C(v) ((int16_t) (v)) +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "h" +# endif +#else +#error "Platform not supported" +#endif +#endif + +#ifndef UINT32_MAX +# define UINT32_MAX (0xffffffffUL) +#endif +#ifndef uint32_t +#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) + typedef unsigned long uint32_t; +# define UINT32_C(v) v ## UL +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "l" +# endif +#elif (UINT_MAX == UINT32_MAX) + typedef unsigned int uint32_t; +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +# define UINT32_C(v) v ## U +#elif (USHRT_MAX == UINT32_MAX) + typedef unsigned short uint32_t; +# define UINT32_C(v) ((unsigned short) (v)) +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +#else +#error "Platform not supported" +#endif +#endif + +#ifndef INT32_MAX +# define INT32_MAX (0x7fffffffL) +#endif +#ifndef INT32_MIN +# define INT32_MIN INT32_C(0x80000000) +#endif +#ifndef int32_t +#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S) + typedef signed long int32_t; +# define INT32_C(v) v ## L +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "l" +# endif +#elif (INT_MAX == INT32_MAX) + typedef signed int int32_t; +# define INT32_C(v) v +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +#elif (SHRT_MAX == INT32_MAX) + typedef signed short int32_t; +# define INT32_C(v) ((short) (v)) +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +#else +#error "Platform not supported" +#endif +#endif + +/* + * The macro stdint_int64_defined is temporarily used to record + * whether or not 64 integer support is available. It must be + * defined for any 64 integer extensions for new platforms that are + * added. + */ + +#undef stdint_int64_defined +#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S) +# if (__STDC__ && __STDC_VERSION >= 199901L) || defined (S_SPLINT_S) +# define stdint_int64_defined + typedef long long int64_t; + typedef unsigned long long uint64_t; +# define UINT64_C(v) v ## ULL +# define INT64_C(v) v ## LL +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# endif +#endif + +#if !defined (stdint_int64_defined) +# if defined(__GNUC__) +# define stdint_int64_defined + __extension__ typedef long long int64_t; + __extension__ typedef unsigned long long uint64_t; +# define UINT64_C(v) v ## ULL +# define INT64_C(v) v ## LL +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S) +# define stdint_int64_defined + typedef long long int64_t; + typedef unsigned long long uint64_t; +# define UINT64_C(v) v ## ULL +# define INT64_C(v) v ## LL +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC) +# define stdint_int64_defined + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +# define UINT64_C(v) v ## UI64 +# define INT64_C(v) v ## I64 +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "I64" +# endif +# endif +#endif + +#if !defined (LONG_LONG_MAX) && defined (INT64_C) +# define LONG_LONG_MAX INT64_C (9223372036854775807) +#endif +#ifndef ULONG_LONG_MAX +# define ULONG_LONG_MAX UINT64_C (18446744073709551615) +#endif + +#if !defined (INT64_MAX) && defined (INT64_C) +# define INT64_MAX INT64_C (9223372036854775807) +#endif +#if !defined (INT64_MIN) && defined (INT64_C) +# define INT64_MIN INT64_C (-9223372036854775808) +#endif +#if !defined (UINT64_MAX) && defined (INT64_C) +# define UINT64_MAX UINT64_C (18446744073709551615) +#endif + +/* + * Width of hexadecimal for number field. + */ + +#ifndef PRINTF_INT64_HEX_WIDTH +# define PRINTF_INT64_HEX_WIDTH "16" +#endif +#ifndef PRINTF_INT32_HEX_WIDTH +# define PRINTF_INT32_HEX_WIDTH "8" +#endif +#ifndef PRINTF_INT16_HEX_WIDTH +# define PRINTF_INT16_HEX_WIDTH "4" +#endif +#ifndef PRINTF_INT8_HEX_WIDTH +# define PRINTF_INT8_HEX_WIDTH "2" +#endif + +#ifndef PRINTF_INT64_DEC_WIDTH +# define PRINTF_INT64_DEC_WIDTH "20" +#endif +#ifndef PRINTF_INT32_DEC_WIDTH +# define PRINTF_INT32_DEC_WIDTH "10" +#endif +#ifndef PRINTF_INT16_DEC_WIDTH +# define PRINTF_INT16_DEC_WIDTH "5" +#endif +#ifndef PRINTF_INT8_DEC_WIDTH +# define PRINTF_INT8_DEC_WIDTH "3" +#endif + +/* + * Ok, lets not worry about 128 bit integers for now. Moore's law says + * we don't need to worry about that until about 2040 at which point + * we'll have bigger things to worry about. + */ + +#ifdef stdint_int64_defined + typedef int64_t intmax_t; + typedef uint64_t uintmax_t; +# define INTMAX_MAX INT64_MAX +# define INTMAX_MIN INT64_MIN +# define UINTMAX_MAX UINT64_MAX +# define UINTMAX_C(v) UINT64_C(v) +# define INTMAX_C(v) INT64_C(v) +# ifndef PRINTF_INTMAX_MODIFIER +# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER +# endif +# ifndef PRINTF_INTMAX_HEX_WIDTH +# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH +# endif +# ifndef PRINTF_INTMAX_DEC_WIDTH +# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH +# endif +#else + typedef int32_t intmax_t; + typedef uint32_t uintmax_t; +# define INTMAX_MAX INT32_MAX +# define UINTMAX_MAX UINT32_MAX +# define UINTMAX_C(v) UINT32_C(v) +# define INTMAX_C(v) INT32_C(v) +# ifndef PRINTF_INTMAX_MODIFIER +# define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER +# endif +# ifndef PRINTF_INTMAX_HEX_WIDTH +# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH +# endif +# ifndef PRINTF_INTMAX_DEC_WIDTH +# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH +# endif +#endif + +/* + * Because this file currently only supports platforms which have + * precise powers of 2 as bit sizes for the default integers, the + * least definitions are all trivial. Its possible that a future + * version of this file could have different definitions. + */ + +#ifndef stdint_least_defined + typedef int8_t int_least8_t; + typedef uint8_t uint_least8_t; + typedef int16_t int_least16_t; + typedef uint16_t uint_least16_t; + typedef int32_t int_least32_t; + typedef uint32_t uint_least32_t; +# define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER +# define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER +# define UINT_LEAST8_MAX UINT8_MAX +# define INT_LEAST8_MAX INT8_MAX +# define UINT_LEAST16_MAX UINT16_MAX +# define INT_LEAST16_MAX INT16_MAX +# define UINT_LEAST32_MAX UINT32_MAX +# define INT_LEAST32_MAX INT32_MAX +# define INT_LEAST8_MIN INT8_MIN +# define INT_LEAST16_MIN INT16_MIN +# define INT_LEAST32_MIN INT32_MIN +# ifdef stdint_int64_defined + typedef int64_t int_least64_t; + typedef uint64_t uint_least64_t; +# define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER +# define UINT_LEAST64_MAX UINT64_MAX +# define INT_LEAST64_MAX INT64_MAX +# define INT_LEAST64_MIN INT64_MIN +# endif +#endif +#undef stdint_least_defined + +/* + * The ANSI C committee pretending to know or specify anything about + * performance is the epitome of misguided arrogance. The mandate of + * this file is to *ONLY* ever support that absolute minimum + * definition of the fast integer types, for compatibility purposes. + * No extensions, and no attempt to suggest what may or may not be a + * faster integer type will ever be made in this file. Developers are + * warned to stay away from these types when using this or any other + * stdint.h. + */ + +typedef int_least8_t int_fast8_t; +typedef uint_least8_t uint_fast8_t; +typedef int_least16_t int_fast16_t; +typedef uint_least16_t uint_fast16_t; +typedef int_least32_t int_fast32_t; +typedef uint_least32_t uint_fast32_t; +#define UINT_FAST8_MAX UINT_LEAST8_MAX +#define INT_FAST8_MAX INT_LEAST8_MAX +#define UINT_FAST16_MAX UINT_LEAST16_MAX +#define INT_FAST16_MAX INT_LEAST16_MAX +#define UINT_FAST32_MAX UINT_LEAST32_MAX +#define INT_FAST32_MAX INT_LEAST32_MAX +#define INT_FAST8_MIN INT_LEAST8_MIN +#define INT_FAST16_MIN INT_LEAST16_MIN +#define INT_FAST32_MIN INT_LEAST32_MIN +#ifdef stdint_int64_defined + typedef int_least64_t int_fast64_t; + typedef uint_least64_t uint_fast64_t; +# define UINT_FAST64_MAX UINT_LEAST64_MAX +# define INT_FAST64_MAX INT_LEAST64_MAX +# define INT_FAST64_MIN INT_LEAST64_MIN +#endif + +#undef stdint_int64_defined + +/* + * Whatever piecemeal, per compiler thing we can do about the wchar_t + * type limits. + */ + +#if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__) +# include +# ifndef WCHAR_MIN +# define WCHAR_MIN 0 +# endif +# ifndef WCHAR_MAX +# define WCHAR_MAX ((wchar_t)-1) +# endif +#endif + +/* + * Whatever piecemeal, per compiler/platform thing we can do about the + * (u)intptr_t types and limits. + */ + +#if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED) +# define STDINT_H_UINTPTR_T_DEFINED +#endif + +#ifndef STDINT_H_UINTPTR_T_DEFINED +# if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64) +# define stdint_intptr_bits 64 +# elif defined (__WATCOMC__) || defined (__TURBOC__) +# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) +# define stdint_intptr_bits 16 +# else +# define stdint_intptr_bits 32 +# endif +# elif defined (__i386__) || defined (_WIN32) || defined (WIN32) +# define stdint_intptr_bits 32 +# elif defined (__INTEL_COMPILER) +/* TODO -- what will Intel do about x86-64? */ +# endif + +# ifdef stdint_intptr_bits +# define stdint_intptr_glue3_i(a,b,c) a##b##c +# define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c) +# ifndef PRINTF_INTPTR_MODIFIER +# define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER) +# endif +# ifndef PTRDIFF_MAX +# define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) +# endif +# ifndef PTRDIFF_MIN +# define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) +# endif +# ifndef UINTPTR_MAX +# define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX) +# endif +# ifndef INTPTR_MAX +# define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) +# endif +# ifndef INTPTR_MIN +# define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) +# endif +# ifndef INTPTR_C +# define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x) +# endif +# ifndef UINTPTR_C +# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x) +# endif + typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t; + typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t; +# else +/* TODO -- This following is likely wrong for some platforms, and does + nothing for the definition of uintptr_t. */ + typedef ptrdiff_t intptr_t; +# endif +# define STDINT_H_UINTPTR_T_DEFINED +#endif + +/* + * Assumes sig_atomic_t is signed and we have a 2s complement machine. + */ + +#ifndef SIG_ATOMIC_MAX +# define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1) +#endif + +#endif + +#if defined (__TEST_PSTDINT_FOR_CORRECTNESS) + +/* + * Please compile with the maximum warning settings to make sure macros are not + * defined more than once. + */ + +#include +#include +#include + +#define glue3_aux(x,y,z) x ## y ## z +#define glue3(x,y,z) glue3_aux(x,y,z) + +#define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,=) glue3(UINT,bits,_C) (0); +#define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,=) glue3(INT,bits,_C) (0); + +#define DECL(us,bits) glue3(DECL,us,) (bits) + +#define TESTUMAX(bits) glue3(u,bits,=) glue3(~,u,bits); if (glue3(UINT,bits,_MAX) glue3(!=,u,bits)) printf ("Something wrong with UINT%d_MAX\n", bits) + +int main () { + DECL(I,8) + DECL(U,8) + DECL(I,16) + DECL(U,16) + DECL(I,32) + DECL(U,32) +#ifdef INT64_MAX + DECL(I,64) + DECL(U,64) +#endif + intmax_t imax = INTMAX_C(0); + uintmax_t umax = UINTMAX_C(0); + char str0[256], str1[256]; + + sprintf (str0, "%d %x\n", 0, ~0); + + sprintf (str1, "%d %x\n", i8, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with i8 : %s\n", str1); + sprintf (str1, "%u %x\n", u8, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with u8 : %s\n", str1); + sprintf (str1, "%d %x\n", i16, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with i16 : %s\n", str1); + sprintf (str1, "%u %x\n", u16, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with u16 : %s\n", str1); + sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with i32 : %s\n", str1); + sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with u32 : %s\n", str1); +#ifdef INT64_MAX + sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with i64 : %s\n", str1); +#endif + sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with imax : %s\n", str1); + sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0); + if (0 != strcmp (str0, str1)) printf ("Something wrong with umax : %s\n", str1); + + TESTUMAX(8); + TESTUMAX(16); + TESTUMAX(32); +#ifdef INT64_MAX + TESTUMAX(64); +#endif + + return EXIT_SUCCESS; +} + +#endif diff --git a/extern/src_netcdf4/putget.c b/extern/src_netcdf4/putget.c new file mode 100644 index 0000000..4247748 --- /dev/null +++ b/extern/src_netcdf4/putget.c @@ -0,0 +1,5362 @@ +/* Do not edit this file. It is produced from the corresponding .m4 source */ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: putget.m4,v 2.79 2010/05/29 22:25:01 russ Exp $ */ + +#include "config.h" +#include +#include +#include + +#include "netcdf.h" +#include "nc.h" +#include "ncx.h" +#include "fbits.h" +#include "onstack.h" +#ifdef LOCKNUMREC +# include /* for SGI/Cray SHMEM routines */ +# ifdef LN_TEST +# include +# endif +#endif +#include "nc3dispatch.h" + + +#undef MIN /* system may define MIN somewhere and complain */ +#define MIN(mm,nn) (((mm) < (nn)) ? (mm) : (nn)) + +static int +readNCv(const NC* ncp, const NC_var* varp, const size_t* start, + const size_t nelems, void* value, const nc_type memtype); +static int +writeNCv(NC* ncp, const NC_var* varp, const size_t* start, + const size_t nelems, const void* value, const nc_type memtype); + + +/* #define ODEBUG 1 */ + +#if ODEBUG +#include +/* + * Print the values of an array of size_t + */ +void +arrayp(const char *label, size_t count, const size_t *array) +{ + (void) fprintf(stderr, "%s", label); + (void) fputc('\t',stderr); + for(; count > 0; count--, array++) + (void) fprintf(stderr," %lu", (unsigned long)*array); + (void) fputc('\n',stderr); +} +#endif /* ODEBUG */ + + +/* Begin fill */ +/* + * This is tunable parameter. + * It essentially controls the tradeoff between the number of times + * memcpy() gets called to copy the external data to fill + * a large buffer vs the number of times its called to + * prepare the external data. + */ +#if _SX +/* NEC SX specific optimization */ +#define NFILL 2048 +#else +#define NFILL 16 +#endif + + + +/* + * Next 6 type specific functions + * Fill a some memory with the default special value. + * Formerly +NC_arrayfill() + */ +static int +NC_fill_schar( + void **xpp, + size_t nelems) /* how many */ +{ + schar fillp[NFILL * sizeof(double)/X_SIZEOF_CHAR]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + schar *vp = fillp; /* lower bound of area to be filled */ + const schar *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_BYTE; + } + } + return ncx_putn_schar_schar(xpp, nelems, fillp); +} + +static int +NC_fill_char( + void **xpp, + size_t nelems) /* how many */ +{ + char fillp[NFILL * sizeof(double)/X_SIZEOF_CHAR]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + char *vp = fillp; /* lower bound of area to be filled */ + const char *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_CHAR; + } + } + return ncx_putn_char_char(xpp, nelems, fillp); +} + +static int +NC_fill_short( + void **xpp, + size_t nelems) /* how many */ +{ + short fillp[NFILL * sizeof(double)/X_SIZEOF_SHORT]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + short *vp = fillp; /* lower bound of area to be filled */ + const short *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_SHORT; + } + } + return ncx_putn_short_short(xpp, nelems, fillp); +} + + +#if (SIZEOF_INT >= X_SIZEOF_INT) +static int +NC_fill_int( + void **xpp, + size_t nelems) /* how many */ +{ + int fillp[NFILL * sizeof(double)/X_SIZEOF_INT]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + int *vp = fillp; /* lower bound of area to be filled */ + const int *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_INT; + } + } + return ncx_putn_int_int(xpp, nelems, fillp); +} + +#elif SIZEOF_LONG == X_SIZEOF_INT +static int +NC_fill_int( + void **xpp, + size_t nelems) /* how many */ +{ + long fillp[NFILL * sizeof(double)/X_SIZEOF_INT]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + long *vp = fillp; /* lower bound of area to be filled */ + const long *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_INT; + } + } + return ncx_putn_int_long(xpp, nelems, fillp); +} + +#else +#error "NC_fill_int implementation" +#endif + +static int +NC_fill_float( + void **xpp, + size_t nelems) /* how many */ +{ + float fillp[NFILL * sizeof(double)/X_SIZEOF_FLOAT]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + float *vp = fillp; /* lower bound of area to be filled */ + const float *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_FLOAT; + } + } + return ncx_putn_float_float(xpp, nelems, fillp); +} + +static int +NC_fill_double( + void **xpp, + size_t nelems) /* how many */ +{ + double fillp[NFILL * sizeof(double)/X_SIZEOF_DOUBLE]; + + assert(nelems <= sizeof(fillp)/sizeof(fillp[0])); + + { + double *vp = fillp; /* lower bound of area to be filled */ + const double *const end = vp + nelems; + while(vp < end) + { + *vp++ = NC_FILL_DOUBLE; + } + } + return ncx_putn_double_double(xpp, nelems, fillp); +} + + + + + +/* + * Fill the external space for variable 'varp' values at 'recno' with + * the appropriate value. If 'varp' is not a record variable, fill the + * whole thing. For the special case when 'varp' is the only record + * variable and it is of type byte, char, or short, varsize should be + * ncp->recsize, otherwise it should be varp->len. + * Formerly +xdr_NC_fill() + */ +int +fill_NC_var(NC *ncp, const NC_var *varp, size_t varsize, size_t recno) +{ + char xfillp[NFILL * X_SIZEOF_DOUBLE]; + const size_t step = varp->xsz; + const size_t nelems = sizeof(xfillp)/step; + const size_t xsz = varp->xsz * nelems; + NC_attr **attrpp = NULL; + off_t offset; + size_t remaining = varsize; + + void *xp; + int status = NC_NOERR; + + /* + * Set up fill value + */ + attrpp = NC_findattr(&varp->attrs, _FillValue); + if( attrpp != NULL ) + { + /* User defined fill value */ + if( (*attrpp)->type != varp->type || (*attrpp)->nelems != 1 ) + { + return NC_EBADTYPE; + } + else + { + /* Use the user defined value */ + char *cp = xfillp; + const char *const end = &xfillp[sizeof(xfillp)]; + + assert(step <= (*attrpp)->xsz); + + for( /*NADA*/; cp < end; cp += step) + { + (void) memcpy(cp, (*attrpp)->xvalue, step); + } + } + } + else + { + /* use the default */ + + assert(xsz % X_ALIGN == 0); + assert(xsz <= sizeof(xfillp)); + + xp = xfillp; + + switch(varp->type){ + case NC_BYTE : + status = NC_fill_schar(&xp, nelems); + break; + case NC_CHAR : + status = NC_fill_char(&xp, nelems); + break; + case NC_SHORT : + status = NC_fill_short(&xp, nelems); + break; + case NC_INT : + status = NC_fill_int(&xp, nelems); + break; + case NC_FLOAT : + status = NC_fill_float(&xp, nelems); + break; + case NC_DOUBLE : + status = NC_fill_double(&xp, nelems); + break; + default : + assert("fill_NC_var invalid type" == 0); + status = NC_EBADTYPE; + break; + } + if(status != NC_NOERR) + return status; + + assert(xp == xfillp + xsz); + } + + /* + * copyout: + * xfillp now contains 'nelems' elements of the fill value + * in external representation. + */ + + /* + * Copy it out. + */ + + offset = varp->begin; + if(IS_RECVAR(varp)) + { + offset += (off_t)ncp->recsize * recno; + } + + assert(remaining > 0); + for(;;) + { + const size_t chunksz = MIN(remaining, ncp->chunk); + size_t ii; + + status = ncio_get(ncp->nciop, offset, chunksz, + RGN_WRITE, &xp); + if(status != NC_NOERR) + { + return status; + } + + /* + * fill the chunksz buffer in units of xsz + */ + for(ii = 0; ii < chunksz/xsz; ii++) + { + (void) memcpy(xp, xfillp, xsz); + xp = (char *)xp + xsz; + } + /* + * Deal with any remainder + */ + { + const size_t rem = chunksz % xsz; + if(rem != 0) + { + (void) memcpy(xp, xfillp, rem); + /* xp = (char *)xp + xsz; */ + } + + } + + status = ncio_rel(ncp->nciop, offset, RGN_MODIFIED); + + if(status != NC_NOERR) + { + break; + } + + remaining -= chunksz; + if(remaining == 0) + break; /* normal loop exit */ + offset += chunksz; + + } + + return status; +} +/* End fill */ + + +/* + * Add a record containing the fill values. + */ +static int +NCfillrecord(NC *ncp, const NC_var *const *varpp, size_t recno) +{ + size_t ii = 0; + for(; ii < ncp->vars.nelems; ii++, varpp++) + { + if( !IS_RECVAR(*varpp) ) + { + continue; /* skip non-record variables */ + } + { + const int status = fill_NC_var(ncp, *varpp, (*varpp)->len, recno); + if(status != NC_NOERR) + return status; + } + } + return NC_NOERR; +} + + +/* + * Add a record containing the fill values in the special case when + * there is exactly one record variable, where we don't require each + * record to be four-byte aligned (no record padding). + */ +static int +NCfillspecialrecord(NC *ncp, const NC_var *varp, size_t recno) +{ + int status; + assert(IS_RECVAR(varp)); + status = fill_NC_var(ncp, varp, ncp->recsize, recno); + if(status != NC_NOERR) + return status; + return NC_NOERR; +} + + +/* + * It is advantageous to + * #define TOUCH_LAST + * when using memory mapped io. + */ +#if TOUCH_LAST +/* + * Grow the file to a size which can contain recno + */ +static int +NCtouchlast(NC *ncp, const NC_var *const *varpp, size_t recno) +{ + int status = NC_NOERR; + const NC_var *varp = NULL; + + { + size_t ii = 0; + for(; ii < ncp->vars.nelems; ii++, varpp++) + { + if( !IS_RECVAR(*varpp) ) + { + continue; /* skip non-record variables */ + } + varp = *varpp; + } + } + assert(varp != NULL); + assert( IS_RECVAR(varp) ); + { + const off_t offset = varp->begin + + (off_t)(recno-1) * (off_t)ncp->recsize + + (off_t)(varp->len - varp->xsz); + void *xp; + + + status = ncio_get(ncp->nciop, offset, varp->xsz, + RGN_WRITE, &xp); + if(status != NC_NOERR) + return status; + (void)memset(xp, 0, varp->xsz); + status = ncio_rel(ncp->nciop, offset, RGN_MODIFIED); + } + return status; +} +#endif /* TOUCH_LAST */ + + +/* + * Ensure that the netcdf file has 'numrecs' records, + * add records and fill as neccessary. + */ +static int +NCvnrecs(NC *ncp, size_t numrecs) +{ + int status = NC_NOERR; +#ifdef LOCKNUMREC + ushmem_t myticket = 0, nowserving = 0; + ushmem_t numpe = (ushmem_t) _num_pes(); + + /* get ticket and wait */ + myticket = shmem_short_finc((shmem_t *) ncp->lock + LOCKNUMREC_LOCK, + ncp->lock[LOCKNUMREC_BASEPE]); +#ifdef LN_TEST + fprintf(stderr,"%d of %d : ticket = %hu\n", + _my_pe(), _num_pes(), myticket); +#endif + do { + shmem_short_get((shmem_t *) &nowserving, + (shmem_t *) ncp->lock + LOCKNUMREC_SERVING, 1, + ncp->lock[LOCKNUMREC_BASEPE]); +#ifdef LN_TEST + fprintf(stderr,"%d of %d : serving = %hu\n", + _my_pe(), _num_pes(), nowserving); +#endif + /* work-around for non-unique tickets */ + if (nowserving > myticket && nowserving < myticket + numpe ) { + /* get a new ticket ... you've been bypassed */ + /* and handle the unlikely wrap-around effect */ + myticket = shmem_short_finc( + (shmem_t *) ncp->lock + LOCKNUMREC_LOCK, + ncp->lock[LOCKNUMREC_BASEPE]); +#ifdef LN_TEST + fprintf(stderr,"%d of %d : new ticket = %hu\n", + _my_pe(), _num_pes(), myticket); +#endif + } + } while(nowserving != myticket); + /* now our turn to check & update value */ +#endif + + if(numrecs > NC_get_numrecs(ncp)) + { + + +#if TOUCH_LAST + status = NCtouchlast(ncp, + (const NC_var *const*)ncp->vars.value, + numrecs); + if(status != NC_NOERR) + goto common_return; +#endif /* TOUCH_LAST */ + + set_NC_ndirty(ncp); + + if(!NC_dofill(ncp)) + { + /* Simply set the new numrecs value */ + NC_set_numrecs(ncp, numrecs); + } + else + { + /* Treat two cases differently: + - exactly one record variable (no padding) + - multiple record variables (each record padded + to 4-byte alignment) + */ + NC_var **vpp = (NC_var **)ncp->vars.value; + NC_var *const *const end = &vpp[ncp->vars.nelems]; + NC_var *recvarp = NULL; /* last record var */ + int numrecvars = 0; + size_t cur_nrecs; + + /* determine how many record variables */ + for( /*NADA*/; vpp < end; vpp++) { + if(IS_RECVAR(*vpp)) { + recvarp = *vpp; + numrecvars++; + } + } + + if (numrecvars != 1) { /* usual case */ + /* Fill each record out to numrecs */ + while((cur_nrecs = NC_get_numrecs(ncp)) < numrecs) + { + status = NCfillrecord(ncp, + (const NC_var *const*)ncp->vars.value, + cur_nrecs); + if(status != NC_NOERR) + { + break; + } + NC_increase_numrecs(ncp, cur_nrecs +1); + } + if(status != NC_NOERR) + goto common_return; + } else { /* special case */ + /* Fill each record out to numrecs */ + while((cur_nrecs = NC_get_numrecs(ncp)) < numrecs) + { + status = NCfillspecialrecord(ncp, + recvarp, + cur_nrecs); + if(status != NC_NOERR) + { + break; + } + NC_increase_numrecs(ncp, cur_nrecs +1); + } + if(status != NC_NOERR) + goto common_return; + + } + } + + if(NC_doNsync(ncp)) + { + status = write_numrecs(ncp); + } + + } +common_return: +#ifdef LOCKNUMREC + /* finished with our lock - increment serving number */ + (void) shmem_short_finc((shmem_t *) ncp->lock + LOCKNUMREC_SERVING, + ncp->lock[LOCKNUMREC_BASEPE]); +#endif + return status; +} + + +/* + * Check whether 'coord' values are valid for the variable. + */ +static int +NCcoordck(NC *ncp, const NC_var *varp, const size_t *coord) +{ + const size_t *ip; + size_t *up; + + if(varp->ndims == 0) + return NC_NOERR; /* 'scalar' variable */ + + if(IS_RECVAR(varp)) + { + if(*coord > X_UINT_MAX) /* rkr: bug fix from previous X_INT_MAX */ + return NC_EINVALCOORDS; /* sanity check */ + if(NC_readonly(ncp) && *coord >= NC_get_numrecs(ncp)) + { + if(!NC_doNsync(ncp)) + return NC_EINVALCOORDS; + /* else */ + { + /* Update from disk and check again */ + const int status = read_numrecs(ncp); + if(status != NC_NOERR) + return status; + if(*coord >= NC_get_numrecs(ncp)) + return NC_EINVALCOORDS; + } + } + ip = coord + 1; + up = varp->shape + 1; + } + else + { + ip = coord; + up = varp->shape; + } + +#ifdef CDEBUG +fprintf(stderr," NCcoordck: coord %ld, count %d, ip %ld\n", + coord, varp->ndims, ip ); +#endif /* CDEBUG */ + + for(; ip < coord + varp->ndims; ip++, up++) + { + +#ifdef CDEBUG +fprintf(stderr," NCcoordck: ip %p, *ip %ld, up %p, *up %lu\n", + ip, *ip, up, *up ); +#endif /* CDEBUG */ + + /* cast needed for braindead systems with signed size_t */ + if((unsigned long) *ip >= (unsigned long) *up ) + return NC_EINVALCOORDS; + } + + return NC_NOERR; +} + + +/* + * Check whether 'edges' are valid for the variable and 'start' + */ +/*ARGSUSED*/ +static int +NCedgeck(const NC *ncp, const NC_var *varp, + const size_t *start, const size_t *edges) +{ + const size_t *const end = start + varp->ndims; + const size_t *shp = varp->shape; + + if(varp->ndims == 0) + return NC_NOERR; /* 'scalar' variable */ + + if(IS_RECVAR(varp)) + { + start++; + edges++; + shp++; + } + + for(; start < end; start++, edges++, shp++) + { + /* cast needed for braindead systems with signed size_t */ + if((unsigned long) *edges > *shp || + (unsigned long) *start + (unsigned long) *edges > *shp) + { + return(NC_EEDGE); + } + } + return NC_NOERR; +} + + +/* + * Translate the (variable, coord) pair into a seek index + */ +static off_t +NC_varoffset(const NC *ncp, const NC_var *varp, const size_t *coord) +{ + if(varp->ndims == 0) /* 'scalar' variable */ + return varp->begin; + + if(varp->ndims == 1) + { + if(IS_RECVAR(varp)) + return varp->begin + + (off_t)(*coord) * (off_t)ncp->recsize; + /* else */ + return varp->begin + (off_t)(*coord) * (off_t)varp->xsz; + } + /* else */ + { + off_t lcoord = (off_t)coord[varp->ndims -1]; + + off_t *up = varp->dsizes +1; + const size_t *ip = coord; + const off_t *const end = varp->dsizes + varp->ndims; + + if(IS_RECVAR(varp)) + up++, ip++; + + for(; up < end; up++, ip++) + lcoord += (off_t)(*up) * (off_t)(*ip); + + lcoord *= varp->xsz; + + if(IS_RECVAR(varp)) + lcoord += (off_t)(*coord) * ncp->recsize; + + lcoord += varp->begin; + return lcoord; + } +} + + + +static int +putNCvx_char_char(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const char *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_char_char(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + + +static int +putNCvx_schar_schar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_schar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_uchar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_uchar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_short(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_short(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_int(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_int(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_float(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_float(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_double(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_double(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_longlong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_longlong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + + +static int +putNCvx_short_schar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_schar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_uchar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_uchar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_short(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_short(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_int(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_int(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_float(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_float(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_double(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_double(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_longlong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_longlong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + + +static int +putNCvx_int_schar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_schar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_uchar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_uchar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_short(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_short(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_int(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_int(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_float(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_float(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_double(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_double(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_longlong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_longlong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + + +static int +putNCvx_float_schar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_schar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_uchar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_uchar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_short(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_short(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_int(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_int(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_float(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_float(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_double(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_double(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_longlong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_longlong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + + +static int +putNCvx_double_schar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_schar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_uchar(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_uchar(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_short(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_short(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_int(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_int(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_float(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_float(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_double(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_double(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_longlong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_longlong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + + +#ifdef NOTUSED +static int +putNCvx_schar_uint(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_uint(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_schar_ulonglong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_schar_ulonglong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_uint(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_uint(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_short_ulonglong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_short_ulonglong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_uint(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_uint(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_int_ulonglong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_int_ulonglong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_uint(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_uint(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_float_ulonglong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_float_ulonglong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_uint(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_uint(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +static int +putNCvx_double_ulonglong(NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, const ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nput = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + RGN_WRITE, &xp); + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_putn_double_ulonglong(&xp, nput, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + { + /* not fatal to the loop */ + status = lstatus; + } + + (void) ncio_rel(ncp->nciop, offset, + RGN_MODIFIED); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nput; + + } + + return status; +} + +#endif /*NOTUSED*/ + + +static int +getNCvx_char_char(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, char *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_char_char(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + + +static int +getNCvx_schar_schar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_schar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_short(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_short(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_int(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_int(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_float(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_float(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_double(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_double(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_longlong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_longlong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_uint(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_uint(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_schar_ulonglong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_ulonglong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + + +static int +getNCvx_short_schar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_schar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_uchar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_uchar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_short(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_short(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_int(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_int(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_float(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_float(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_double(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_double(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_longlong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_longlong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_uint(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_uint(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_short_ulonglong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_short_ulonglong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + + +static int +getNCvx_int_schar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_schar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_uchar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_uchar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_short(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_short(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_int(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_int(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_float(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_float(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_double(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_double(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_longlong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_longlong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_uint(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_uint(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_int_ulonglong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_int_ulonglong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + + +static int +getNCvx_float_schar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_schar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_uchar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_uchar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_short(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_short(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_int(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_int(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_float(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_float(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_double(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_double(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_longlong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_longlong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_uint(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_uint(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_float_ulonglong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_float_ulonglong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + + +static int +getNCvx_double_schar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, schar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_schar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_uchar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_uchar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_short(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, short *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_short(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_int(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, int *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_int(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_float(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, float *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_float(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_double(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, double *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_double(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_longlong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, longlong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_longlong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_uint(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uint *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_uint(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +static int +getNCvx_double_ulonglong(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, ulonglong *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_double_ulonglong(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + + +#ifdef NOTUSED +static int +getNCvx_schar_uchar(const NC *ncp, const NC_var *varp, + const size_t *start, size_t nelems, uchar *value) +{ + off_t offset = NC_varoffset(ncp, varp, start); + size_t remaining = varp->xsz * nelems; + int status = NC_NOERR; + const void *xp; + + if(nelems == 0) + return NC_NOERR; + + assert(value != NULL); + + for(;;) + { + size_t extent = MIN(remaining, ncp->chunk); + size_t nget = ncx_howmany(varp->type, extent); + + int lstatus = ncio_get(ncp->nciop, offset, extent, + 0, (void **)&xp); /* cast away const */ + if(lstatus != NC_NOERR) + return lstatus; + + lstatus = ncx_getn_schar_uchar(&xp, nget, value); + if(lstatus != NC_NOERR && status == NC_NOERR) + status = lstatus; + + (void) ncio_rel(ncp->nciop, offset, 0); + + remaining -= extent; + if(remaining == 0) + break; /* normal loop exit */ + offset += extent; + value += nget; + } + + return status; +} + +#endif /*NOTUSED*/ + +/* + * For ncvar{put,get}, + * find the largest contiguous block from within 'edges'. + * returns the index to the left of this (which may be -1). + * Compute the number of contiguous elements and return + * that in *iocountp. + * The presence of "record" variables makes this routine + * overly subtle. + */ +static int +NCiocount(const NC *const ncp, const NC_var *const varp, + const size_t *const edges, + size_t *const iocountp) +{ + const size_t *edp0 = edges; + const size_t *edp = edges + varp->ndims; + const size_t *shp = varp->shape + varp->ndims; + + if(IS_RECVAR(varp)) + { + if(varp->ndims == 1 && ncp->recsize <= varp->len) + { + /* one dimensional && the only 'record' variable */ + *iocountp = *edges; + return(0); + } + /* else */ + edp0++; + } + + assert(edges != NULL); + + /* find max contiguous */ + while(edp > edp0) + { + shp--; edp--; + if(*edp < *shp ) + { + const size_t *zedp = edp; + while(zedp >= edp0) + { + if(*zedp == 0) + { + *iocountp = 0; + goto done; + } + /* Tip of the hat to segmented architectures */ + if(zedp == edp0) + break; + zedp--; + } + break; + } + assert(*edp == *shp); + } + + /* + * edp, shp reference rightmost index s.t. *(edp +1) == *(shp +1) + * + * Or there is only one dimension. + * If there is only one dimension and it is 'non record' dimension, + * edp is &edges[0] and we will return -1. + * If there is only one dimension and and it is a "record dimension", + * edp is &edges[1] (out of bounds) and we will return 0; + */ + assert(shp >= varp->shape + varp->ndims -1 + || *(edp +1) == *(shp +1)); + + /* now accumulate max count for a single io operation */ + for(*iocountp = 1, edp0 = edp; + edp0 < edges + varp->ndims; + edp0++) + { + *iocountp *= *edp0; + } + +done: + return((int)(edp - edges) - 1); +} + + +/* + * Set the elements of the array 'upp' to + * the sum of the corresponding elements of + * 'stp' and 'edp'. 'end' should be &stp[nelems]. + */ +static void +set_upper(size_t *upp, /* modified on return */ + const size_t *stp, + const size_t *edp, + const size_t *const end) +{ + while(upp < end) { + *upp++ = *stp++ + *edp++; + } +} + + +/* + * The infamous and oft-discussed odometer code. + * + * 'start[]' is the starting coordinate. + * 'upper[]' is the upper bound s.t. start[ii] < upper[ii]. + * 'coord[]' is the register, the current coordinate value. + * For some ii, + * upp == &upper[ii] + * cdp == &coord[ii] + * + * Running this routine increments *cdp. + * + * If after the increment, *cdp is equal to *upp + * (and cdp is not the leftmost dimension), + * *cdp is "zeroed" to the starting value and + * we need to "carry", eg, increment one place to + * the left. + * + * TODO: Some architectures hate recursion? + * Reimplement non-recursively. + */ +static void +odo1(const size_t *const start, const size_t *const upper, + size_t *const coord, /* modified on return */ + const size_t *upp, + size_t *cdp) +{ + assert(coord <= cdp && cdp <= coord + NC_MAX_VAR_DIMS); + assert(upper <= upp && upp <= upper + NC_MAX_VAR_DIMS); + assert(upp - upper == cdp - coord); + + assert(*cdp <= *upp); + + (*cdp)++; + if(cdp != coord && *cdp >= *upp) + { + *cdp = start[cdp - coord]; + odo1(start, upper, coord, upp -1, cdp -1); + } +} +#ifdef _CRAYC +#pragma _CRI noinline odo1 +#endif + + + +/* Define a macro to allow hash on two type values */ +#define CASE(nc1,nc2) (nc1*256+nc2) + +static int +readNCv(const NC* ncp, const NC_var* varp, const size_t* start, + const size_t nelems, void* value, const nc_type memtype) +{ + int status = NC_NOERR; + switch (CASE(varp->type,memtype)) { + case CASE(NC_CHAR,NC_CHAR): + case CASE(NC_CHAR,NC_UBYTE): + status = getNCvx_char_char(ncp,varp,start,nelems,(char*)value); + break; + + case CASE(NC_BYTE,NC_BYTE): + case CASE(NC_BYTE,NC_UBYTE): + status = getNCvx_schar_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_BYTE,NC_SHORT): + status = getNCvx_schar_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_BYTE,NC_INT): + status = getNCvx_schar_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_BYTE,NC_FLOAT): + status = getNCvx_schar_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_BYTE,NC_DOUBLE): + status = getNCvx_schar_double(ncp,varp,start,nelems,(double *)value); + break; + case CASE(NC_BYTE,NC_INT64): + status = getNCvx_schar_longlong(ncp,varp,start,nelems,(long long*)value); + break; + case CASE(NC_BYTE,NC_UINT): + status = getNCvx_schar_uint(ncp,varp,start,nelems,(unsigned int*)value); + break; + case CASE(NC_BYTE,NC_UINT64): + status = getNCvx_schar_ulonglong(ncp,varp,start,nelems,(unsigned long long*)value); + break; + + case CASE(NC_SHORT,NC_BYTE): + status = getNCvx_short_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_SHORT,NC_UBYTE): + status = getNCvx_short_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_SHORT,NC_SHORT): + status = getNCvx_short_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_SHORT,NC_INT): + status = getNCvx_short_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_SHORT,NC_FLOAT): + status = getNCvx_short_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_SHORT,NC_DOUBLE): + status = getNCvx_short_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_SHORT,NC_INT64): + status = getNCvx_short_longlong(ncp,varp,start,nelems,(long long*)value); + break; + case CASE(NC_SHORT,NC_UINT): + status = getNCvx_short_uint(ncp,varp,start,nelems,(unsigned int*)value); + break; + case CASE(NC_SHORT,NC_UINT64): + status = getNCvx_short_ulonglong(ncp,varp,start,nelems,(unsigned long long*)value); + break; + + + case CASE(NC_INT,NC_BYTE): + status = getNCvx_int_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_INT,NC_UBYTE): + status = getNCvx_int_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_INT,NC_SHORT): + status = getNCvx_int_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_INT,NC_INT): + status = getNCvx_int_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_INT,NC_FLOAT): + status = getNCvx_int_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_INT,NC_DOUBLE): + status = getNCvx_int_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_INT,NC_INT64): + status = getNCvx_int_longlong(ncp,varp,start,nelems,(long long*)value); + break; + case CASE(NC_INT,NC_UINT): + status = getNCvx_int_uint(ncp,varp,start,nelems,(unsigned int*)value); + break; + case CASE(NC_INT,NC_UINT64): + status = getNCvx_int_ulonglong(ncp,varp,start,nelems,(unsigned long long*)value); + break; + + + case CASE(NC_FLOAT,NC_BYTE): + status = getNCvx_float_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_FLOAT,NC_UBYTE): + status = getNCvx_float_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_FLOAT,NC_SHORT): + status = getNCvx_float_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_FLOAT,NC_INT): + status = getNCvx_float_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_FLOAT,NC_FLOAT): + status = getNCvx_float_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_FLOAT,NC_DOUBLE): + status = getNCvx_float_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_FLOAT,NC_INT64): + status = getNCvx_float_longlong(ncp,varp,start,nelems,(long long*)value); + break; + case CASE(NC_FLOAT,NC_UINT): + status = getNCvx_float_uint(ncp,varp,start,nelems,(unsigned int*)value); + break; + case CASE(NC_FLOAT,NC_UINT64): + status = getNCvx_float_ulonglong(ncp,varp,start,nelems,(unsigned long long*)value); + break; + + + case CASE(NC_DOUBLE,NC_BYTE): + status = getNCvx_double_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_DOUBLE,NC_UBYTE): + status = getNCvx_double_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_DOUBLE,NC_SHORT): + status = getNCvx_double_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_DOUBLE,NC_INT): + status = getNCvx_double_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_DOUBLE,NC_FLOAT): + status = getNCvx_double_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_DOUBLE,NC_DOUBLE): + status = getNCvx_double_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_DOUBLE,NC_INT64): + status = getNCvx_double_longlong(ncp,varp,start,nelems,(long long*)value); + break; + case CASE(NC_DOUBLE,NC_UINT): + status = getNCvx_double_uint(ncp,varp,start,nelems,(unsigned int*)value); + break; + case CASE(NC_DOUBLE,NC_UINT64): + status = getNCvx_double_ulonglong(ncp,varp,start,nelems,(unsigned long long*)value); + break; + + default: + return NC_EBADTYPE; + } + return status; +} + + +static int +writeNCv(NC* ncp, const NC_var* varp, const size_t* start, + const size_t nelems, const void* value, const nc_type memtype) +{ + int status = NC_NOERR; + switch (CASE(varp->type,memtype)) { + case CASE(NC_CHAR,NC_CHAR): + case CASE(NC_CHAR,NC_UBYTE): + status = putNCvx_char_char(ncp,varp,start,nelems,(char*)value); + break; + + case CASE(NC_BYTE,NC_BYTE): + status = putNCvx_schar_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_BYTE,NC_UBYTE): + status = putNCvx_schar_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_BYTE,NC_SHORT): + status = putNCvx_schar_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_BYTE,NC_INT): + status = putNCvx_schar_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_BYTE,NC_FLOAT): + status = putNCvx_schar_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_BYTE,NC_DOUBLE): + status = putNCvx_schar_double(ncp,varp,start,nelems,(double *)value); + break; + case CASE(NC_BYTE,NC_INT64): + status = putNCvx_schar_longlong(ncp,varp,start,nelems,(long long*)value); + break; + + case CASE(NC_SHORT,NC_BYTE): + status = putNCvx_short_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_SHORT,NC_UBYTE): + status = putNCvx_short_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_SHORT,NC_SHORT): + status = putNCvx_short_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_SHORT,NC_INT): + status = putNCvx_short_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_SHORT,NC_FLOAT): + status = putNCvx_short_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_SHORT,NC_DOUBLE): + status = putNCvx_short_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_SHORT,NC_INT64): + status = putNCvx_short_longlong(ncp,varp,start,nelems,(long long*)value); + break; + + case CASE(NC_INT,NC_BYTE): + status = putNCvx_int_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_INT,NC_UBYTE): + status = putNCvx_int_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_INT,NC_SHORT): + status = putNCvx_int_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_INT,NC_INT): + status = putNCvx_int_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_INT,NC_FLOAT): + status = putNCvx_int_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_INT,NC_DOUBLE): + status = putNCvx_int_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_INT,NC_INT64): + status = putNCvx_int_longlong(ncp,varp,start,nelems,(long long*)value); + break; + + case CASE(NC_FLOAT,NC_BYTE): + status = putNCvx_float_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_FLOAT,NC_UBYTE): + status = putNCvx_float_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_FLOAT,NC_SHORT): + status = putNCvx_float_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_FLOAT,NC_INT): + status = putNCvx_float_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_FLOAT,NC_FLOAT): + status = putNCvx_float_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_FLOAT,NC_DOUBLE): + status = putNCvx_float_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_FLOAT,NC_INT64): + status = putNCvx_float_longlong(ncp,varp,start,nelems,(long long*)value); + break; + + case CASE(NC_DOUBLE,NC_BYTE): + status = putNCvx_double_schar(ncp,varp,start,nelems,(signed char*)value); + break; + case CASE(NC_DOUBLE,NC_UBYTE): + status = putNCvx_double_uchar(ncp,varp,start,nelems,(unsigned char*)value); + break; + case CASE(NC_DOUBLE,NC_SHORT): + status = putNCvx_double_short(ncp,varp,start,nelems,(short*)value); + break; + case CASE(NC_DOUBLE,NC_INT): + status = putNCvx_double_int(ncp,varp,start,nelems,(int*)value); + break; + case CASE(NC_DOUBLE,NC_FLOAT): + status = putNCvx_double_float(ncp,varp,start,nelems,(float*)value); + break; + case CASE(NC_DOUBLE,NC_DOUBLE): + status = putNCvx_double_double(ncp,varp,start,nelems,(double*)value); + break; + case CASE(NC_DOUBLE,NC_INT64): + status = putNCvx_double_longlong(ncp,varp,start,nelems,(long long*)value); + break; + + default: + return NC_EBADTYPE; + } + return status; +} + +/**************************************************/ + +int +NC3_get_vara(int ncid, int varid, + const size_t *start, const size_t *edges0, + void *value0, + nc_type memtype) +{ + int status = NC_NOERR; + NC* ncp; + NC_var *varp; + int ii; + size_t iocount; + size_t memtypelen; + char* value = (char*) value0; /* legally allow ptr arithmetic */ + const size_t* edges = edges0; /* so we can modify for special cases */ + size_t modedges[NC_MAX_VAR_DIMS]; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_indef(ncp)) + return NC_EINDEFINE; + + varp = NC_lookupvar(ncp, varid); + if(varp == NULL) + return NC_ENOTVAR; + + if(memtype == NC_NAT) memtype=varp->type; + + if(memtype == NC_CHAR && varp->type != NC_CHAR) + return NC_ECHAR; + else if(memtype != NC_CHAR && varp->type == NC_CHAR) + return NC_ECHAR; + + /* If edges is NULL, then this was called from nc_get_var() */ + if(edges == NULL && varp->ndims > 0) { + /* If this is a record variable, then we have to + substitute the number of records into dimension 0. */ + if(varp->shape[0] == 0) { + (void*)memcpy((void*)modedges,(void*)varp->shape, + sizeof(size_t)*varp->ndims); + modedges[0] = NC_get_numrecs(ncp); + edges = modedges; + } else + edges = varp->shape; + } + + status = NCcoordck(ncp, varp, start); + if(status != NC_NOERR) + return status; + + status = NCedgeck(ncp, varp, start, edges); + if(status != NC_NOERR) + return status; + + /* Get the size of the memtype */ + memtypelen = nctypelen(memtype); + + if(varp->ndims == 0) /* scalar variable */ + { + return( readNCv(ncp, varp, start, 1, (void*)value, memtype) ); + } + + if(IS_RECVAR(varp)) + { + if(*start + *edges > NC_get_numrecs(ncp)) + return NC_EEDGE; + if(varp->ndims == 1 && ncp->recsize <= varp->len) + { + /* one dimensional && the only record variable */ + return( readNCv(ncp, varp, start, *edges, (void*)value, memtype) ); + } + } + + /* + * find max contiguous + * and accumulate max count for a single io operation + */ + ii = NCiocount(ncp, varp, edges, &iocount); + + if(ii == -1) + { + return( readNCv(ncp, varp, start, iocount, (void*)value, memtype) ); + } + + assert(ii >= 0); + + { /* inline */ + ALLOC_ONSTACK(coord, size_t, varp->ndims); + ALLOC_ONSTACK(upper, size_t, varp->ndims); + const size_t index = ii; + + /* copy in starting indices */ + (void) memcpy(coord, start, varp->ndims * sizeof(size_t)); + + /* set up in maximum indices */ + set_upper(upper, start, edges, &upper[varp->ndims]); + + /* ripple counter */ + while(*coord < *upper) + { + const int lstatus = readNCv(ncp, varp, coord, iocount, (void*)value, memtype); + if(lstatus != NC_NOERR) + { + if(lstatus != NC_ERANGE) + { + status = lstatus; + /* fatal for the loop */ + break; + } + /* else NC_ERANGE, not fatal for the loop */ + if(status == NC_NOERR) + status = lstatus; + } + value += (iocount * memtypelen); + odo1(start, upper, coord, &upper[index], &coord[index]); + } + + FREE_ONSTACK(upper); + FREE_ONSTACK(coord); + } /* end inline */ + + return status; +} + +int +NC3_put_vara(int ncid, int varid, + const size_t *start, const size_t *edges0, + const void *value0, + nc_type memtype) +{ + int status = NC_NOERR; + NC *ncp; + NC_var *varp; + int ii; + size_t iocount; + size_t memtypelen; + char* value = (char*) value0; /* legally allow ptr arithmetic */ + const size_t* edges = edges0; /* so we can modify for special cases */ + size_t modedges[NC_MAX_VAR_DIMS]; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + return NC_EPERM; + + if(NC_indef(ncp)) + return NC_EINDEFINE; + + varp = NC_lookupvar(ncp, varid); + if(varp == NULL) + return NC_ENOTVAR; /* TODO: lost NC_EGLOBAL */ + + if(memtype == NC_NAT) memtype=varp->type; + + if(memtype == NC_CHAR && varp->type != NC_CHAR) + return NC_ECHAR; + else if(memtype != NC_CHAR && varp->type == NC_CHAR) + return NC_ECHAR; + + /* Get the size of the memtype */ + memtypelen = nctypelen(memtype); + + /* If edges is NULL, then this was called from nc_get_var() */ + if(edges == NULL && varp->ndims > 0) { + /* If this is a record variable, then we have to + substitute the number of records into dimension 0. */ + if(varp->shape[0] == 0) { + (void*)memcpy((void*)modedges,(void*)varp->shape, + sizeof(size_t)*varp->ndims); + modedges[0] = NC_get_numrecs(ncp); + edges = modedges; + } else + edges = varp->shape; + } + + status = NCcoordck(ncp, varp, start); + if(status != NC_NOERR) + return status; + status = NCedgeck(ncp, varp, start, edges); + if(status != NC_NOERR) + return status; + + if(varp->ndims == 0) /* scalar variable */ + { + return( writeNCv(ncp, varp, start, 1, (void*)value, memtype) ); + } + + if(IS_RECVAR(varp)) + { + status = NCvnrecs(ncp, *start + *edges); + if(status != NC_NOERR) + return status; + + if(varp->ndims == 1 + && ncp->recsize <= varp->len) + { + /* one dimensional && the only record variable */ + return( writeNCv(ncp, varp, start, *edges, (void*)value, memtype) ); + } + } + + /* + * find max contiguous + * and accumulate max count for a single io operation + */ + ii = NCiocount(ncp, varp, edges, &iocount); + + if(ii == -1) + { + return( writeNCv(ncp, varp, start, iocount, (void*)value, memtype) ); + } + + assert(ii >= 0); + + { /* inline */ + ALLOC_ONSTACK(coord, size_t, varp->ndims); + ALLOC_ONSTACK(upper, size_t, varp->ndims); + const size_t index = ii; + + /* copy in starting indices */ + (void) memcpy(coord, start, varp->ndims * sizeof(size_t)); + + /* set up in maximum indices */ + set_upper(upper, start, edges, &upper[varp->ndims]); + + /* ripple counter */ + while(*coord < *upper) + { + const int lstatus = writeNCv(ncp, varp, coord, iocount, (void*)value, memtype); + if(lstatus != NC_NOERR) + { + if(lstatus != NC_ERANGE) + { + status = lstatus; + /* fatal for the loop */ + break; + } + /* else NC_ERANGE, not fatal for the loop */ + if(status == NC_NOERR) + status = lstatus; + } + value += (iocount * memtypelen); + odo1(start, upper, coord, &upper[index], &coord[index]); + } + + FREE_ONSTACK(upper); + FREE_ONSTACK(coord); + } /* end inline */ + + return status; +} diff --git a/extern/src_netcdf4/rnd.h b/extern/src_netcdf4/rnd.h new file mode 100644 index 0000000..4021a4d --- /dev/null +++ b/extern/src_netcdf4/rnd.h @@ -0,0 +1,17 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: rnd.h,v 2.13 1996/12/11 05:46:54 davis Exp $ */ +#ifndef _RNDUP + +/* useful for aligning memory */ +#define _RNDUP(x, unit) ((((x) + (unit) - 1) / (unit)) \ + * (unit)) +#define _RNDDOWN(x, unit) ((x) - ((x)%(unit))) + +#define M_RND_UNIT (sizeof(double)) +#define M_RNDUP(x) _RNDUP(x, M_RND_UNIT) +#define M_RNDDOWN(x) __RNDDOWN(x, M_RND_UNIT) + +#endif diff --git a/extern/src_netcdf4/stub.c b/extern/src_netcdf4/stub.c new file mode 100644 index 0000000..ab97007 --- /dev/null +++ b/extern/src_netcdf4/stub.c @@ -0,0 +1,71 @@ +/********************************************************************* + * Copyright 2010, UCAR/Unidata + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + *********************************************************************/ + +#include "config.h" +#include "ncdispatch.h" + +extern int NC3_initialize(void); + +#ifdef USE_NETCDF4 +extern int NC4_initialize(void); +#endif + +#ifdef USE_DAP +extern int NCD3_initialize(void); +#ifdef USE_NETCDF4 +extern int NCD4_initialize(void); +#endif +#endif + +#ifdef USE_CDMREMOTE +extern int NCCR_initialize(void); +#endif + +#ifdef BUILD_RPC +extern int NCRPC_initialize(void); +#endif + +int +NC_initialize(void) +{ + int stat = NC_NOERR; + + /* Allow libdispatch to do initialization */ + if((stat = NCDISPATCH_initialize())) return stat; + + /* Initialize each active protocol */ + + if((stat = NC3_initialize())) return stat; + +#ifdef USE_DAP + if((stat = NCD3_initialize())) return stat; +#endif + +#ifdef USE_NETCDF4 + if((stat = NC4_initialize())) return stat; + + /* if((stat = NCD_initialize())) return stat; */ + +#ifdef USE_DAP +#ifdef NOTUSED + if((stat = NCD4_initialize())) return stat; +#endif +#endif + +#ifdef USE_CDMREMOTE + if((stat = NCCR_initialize())) return stat; +#endif + +#ifdef USE_RPC + if((stat = NCRPC_initialize())) return stat; +#endif + +#endif /* USE_NETCDF4 */ + + + return NC_NOERR; +} + + diff --git a/extern/src_netcdf4/utf8proc.h b/extern/src_netcdf4/utf8proc.h new file mode 100644 index 0000000..f99753e --- /dev/null +++ b/extern/src_netcdf4/utf8proc.h @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2006-2007 Jan Behrens, FlexiGuided GmbH, Berlin + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + + +/* + * File name: utf8proc.h + * Version: 1.1.1 + * Last changed: 2007-07-22 + * Changed 2008-05-16 by rkr to add config.h and replacement for stdbool.h + * for pre-C99 compilers that don't support bool. + * Changed 2008-06-05 by rkr to add utf8proc_check(str, options) function for + * for just checking UTF-8 validity + * Description: + * Header files for libutf8proc, which is a mapping tool for UTF-8 strings + * with following features: + * - decomposing and composing of strings + * - replacing compatibility characters with their equivalents + * - stripping of "default ignorable characters" + * like SOFT-HYPHEN or ZERO-WIDTH-SPACE + * - folding of certain characters for string comparison + * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-") + * (see "LUMP" option) + * - optional rejection of strings containing non-assigned code points + * - stripping of control characters + * - stripping of character marks (accents, etc.) + * - transformation of LF, CRLF, CR and NEL to line-feed (LF) + * or to the unicode chararacters for paragraph separation (PS) + * or line separation (LS). + * - unicode case folding (for case insensitive string comparisons) + * - rejection of illegal UTF-8 data + * (i.e. UTF-8 encoded UTF-16 surrogates) + * - support for korean hangul characters + * Unicode Version 5.0.0 is supported. + */ + + +#ifndef UTF8PROC_H +#define UTF8PROC_H + + +#include "config.h" + +#include +#ifdef HAVE_STDBOOL_H +#include +#else +# if ! HAVE__BOOL +# ifdef __cplusplus +typedef bool _Bool; +# else +typedef unsigned char _Bool; +# endif +# endif +# define bool _Bool +# define false 0 +# define true 1 +# define __bool_true_false_are_defined 1 +#endif +#include +#ifdef HAVE_INTTYPES_H +#include +#else /* HAVE_INTTYPES_H */ +#include +#endif /* HAVE_INTTYPES_H */ +#include + +#ifndef HAVE_SSIZE_T +#define ssize_t int +#endif + +#ifndef SSIZE_MAX +#define SSIZE_MAX (SIZE_MAX/2) +#endif + +#define UTF8PROC_NULLTERM (1<<0) +#define UTF8PROC_STABLE (1<<1) +#define UTF8PROC_COMPAT (1<<2) +#define UTF8PROC_COMPOSE (1<<3) +#define UTF8PROC_DECOMPOSE (1<<4) +#define UTF8PROC_IGNORE (1<<5) +#define UTF8PROC_REJECTNA (1<<6) +#define UTF8PROC_NLF2LS (1<<7) +#define UTF8PROC_NLF2PS (1<<8) +#define UTF8PROC_NLF2LF (UTF8PROC_NLF2LS | UTF8PROC_NLF2PS) +#define UTF8PROC_STRIPCC (1<<9) +#define UTF8PROC_CASEFOLD (1<<10) +#define UTF8PROC_CHARBOUND (1<<11) +#define UTF8PROC_LUMP (1<<12) +#define UTF8PROC_STRIPMARK (1<<13) +/* + * Flags being regarded by several functions in the library: + * NULLTERM: The given UTF-8 input is NULL terminated. + * STABLE: Unicode Versioning Stability has to be respected. + * COMPAT: Compatiblity decomposition + * (i.e. formatting information is lost) + * COMPOSE: Return a result with composed characters. + * DECOMPOSE: Return a result with decomposed characters. + * IGNORE: Strip "default ignorable characters" + * REJECTNA: Return an error, if the input contains unassigned + * code points. + * NLF2LS: Indicating that NLF-sequences (LF, CRLF, CR, NEL) are + * representing a line break, and should be converted to the + * unicode character for line separation (LS). + * NLF2PS: Indicating that NLF-sequences are representing a paragraph + * break, and should be converted to the unicode character for + * paragraph separation (PS). + * NLF2LF: Indicating that the meaning of NLF-sequences is unknown. + * STRIPCC: Strips and/or convers control characters. + * NLF-sequences are transformed into space, except if one of + * the NLF2LS/PS/LF options is given. + * HorizontalTab (HT) and FormFeed (FF) are treated as a + * NLF-sequence in this case. + * All other control characters are simply removed. + * CASEFOLD: Performs unicode case folding, to be able to do a + * case-insensitive string comparison. + * CHARBOUND: Inserts 0xFF bytes at the beginning of each sequence which + * is representing a single grapheme cluster (see UAX#29). + * LUMP: Lumps certain characters together + * (e.g. HYPHEN U+2010 and MINUS U+2212 to ASCII "-"). + * (See lump.txt for details.) + * If NLF2LF is set, this includes a transformation of + * paragraph and line separators to ASCII line-feed (LF). + * STRIPMARK: Strips all character markings + * (non-spacing, spacing and enclosing) (i.e. accents) + * NOTE: this option works only with COMPOSE or DECOMPOSE + */ + +#define UTF8PROC_ERROR_NOMEM -1 +#define UTF8PROC_ERROR_OVERFLOW -2 +#define UTF8PROC_ERROR_INVALIDUTF8 -3 +#define UTF8PROC_ERROR_NOTASSIGNED -4 +#define UTF8PROC_ERROR_INVALIDOPTS -5 +/* + * Error codes being returned by almost all functions: + * ERROR_NOMEM: Memory could not be allocated. + * ERROR_OVERFLOW: The given string is too long to be processed. + * ERROR_INVALIDUTF8: The given string is not a legal UTF-8 string. + * ERROR_NOTASSIGNED: The REJECTNA flag was set, + * and an unassigned code point was found. + * ERROR_INVALIDOPTS: Invalid options have been used. + */ + +typedef int16_t utf8proc_propval_t; +typedef struct utf8proc_property_struct { + utf8proc_propval_t category; + utf8proc_propval_t combining_class; + utf8proc_propval_t bidi_class; + utf8proc_propval_t decomp_type; + const int32_t *decomp_mapping; + unsigned bidi_mirrored:1; + int32_t uppercase_mapping; + int32_t lowercase_mapping; + int32_t titlecase_mapping; + int32_t comb1st_index; + int32_t comb2nd_index; + unsigned comp_exclusion:1; + unsigned ignorable:1; + unsigned control_boundary:1; + unsigned extend:1; + const int32_t *casefold_mapping; +} utf8proc_property_t; + +#define UTF8PROC_CATEGORY_LU 1 +#define UTF8PROC_CATEGORY_LL 2 +#define UTF8PROC_CATEGORY_LT 3 +#define UTF8PROC_CATEGORY_LM 4 +#define UTF8PROC_CATEGORY_LO 5 +#define UTF8PROC_CATEGORY_MN 6 +#define UTF8PROC_CATEGORY_MC 7 +#define UTF8PROC_CATEGORY_ME 8 +#define UTF8PROC_CATEGORY_ND 9 +#define UTF8PROC_CATEGORY_NL 10 +#define UTF8PROC_CATEGORY_NO 11 +#define UTF8PROC_CATEGORY_PC 12 +#define UTF8PROC_CATEGORY_PD 13 +#define UTF8PROC_CATEGORY_PS 14 +#define UTF8PROC_CATEGORY_PE 15 +#define UTF8PROC_CATEGORY_PI 16 +#define UTF8PROC_CATEGORY_PF 17 +#define UTF8PROC_CATEGORY_PO 18 +#define UTF8PROC_CATEGORY_SM 19 +#define UTF8PROC_CATEGORY_SC 20 +#define UTF8PROC_CATEGORY_SK 21 +#define UTF8PROC_CATEGORY_SO 22 +#define UTF8PROC_CATEGORY_ZS 23 +#define UTF8PROC_CATEGORY_ZL 24 +#define UTF8PROC_CATEGORY_ZP 25 +#define UTF8PROC_CATEGORY_CC 26 +#define UTF8PROC_CATEGORY_CF 27 +#define UTF8PROC_CATEGORY_CS 28 +#define UTF8PROC_CATEGORY_CO 29 +#define UTF8PROC_CATEGORY_CN 30 +#define UTF8PROC_BIDI_CLASS_L 1 +#define UTF8PROC_BIDI_CLASS_LRE 2 +#define UTF8PROC_BIDI_CLASS_LRO 3 +#define UTF8PROC_BIDI_CLASS_R 4 +#define UTF8PROC_BIDI_CLASS_AL 5 +#define UTF8PROC_BIDI_CLASS_RLE 6 +#define UTF8PROC_BIDI_CLASS_RLO 7 +#define UTF8PROC_BIDI_CLASS_PDF 8 +#define UTF8PROC_BIDI_CLASS_EN 9 +#define UTF8PROC_BIDI_CLASS_ES 10 +#define UTF8PROC_BIDI_CLASS_ET 11 +#define UTF8PROC_BIDI_CLASS_AN 12 +#define UTF8PROC_BIDI_CLASS_CS 13 +#define UTF8PROC_BIDI_CLASS_NSM 14 +#define UTF8PROC_BIDI_CLASS_BN 15 +#define UTF8PROC_BIDI_CLASS_B 16 +#define UTF8PROC_BIDI_CLASS_S 17 +#define UTF8PROC_BIDI_CLASS_WS 18 +#define UTF8PROC_BIDI_CLASS_ON 19 +#define UTF8PROC_DECOMP_TYPE_FONT 1 +#define UTF8PROC_DECOMP_TYPE_NOBREAK 2 +#define UTF8PROC_DECOMP_TYPE_INITIAL 3 +#define UTF8PROC_DECOMP_TYPE_MEDIAL 4 +#define UTF8PROC_DECOMP_TYPE_FINAL 5 +#define UTF8PROC_DECOMP_TYPE_ISOLATED 6 +#define UTF8PROC_DECOMP_TYPE_CIRCLE 7 +#define UTF8PROC_DECOMP_TYPE_SUPER 8 +#define UTF8PROC_DECOMP_TYPE_SUB 9 +#define UTF8PROC_DECOMP_TYPE_VERTICAL 10 +#define UTF8PROC_DECOMP_TYPE_WIDE 11 +#define UTF8PROC_DECOMP_TYPE_NARROW 12 +#define UTF8PROC_DECOMP_TYPE_SMALL 13 +#define UTF8PROC_DECOMP_TYPE_SQUARE 14 +#define UTF8PROC_DECOMP_TYPE_FRACTION 15 +#define UTF8PROC_DECOMP_TYPE_COMPAT 16 + +extern const int8_t utf8proc_utf8class[256]; + +const char *utf8proc_errmsg(ssize_t errcode); +/* + * Returns a static error string for the given error code. + */ + +ssize_t utf8proc_iterate(const uint8_t *str, ssize_t strlen, int32_t *dst); +/* + * Reads a single char from the UTF-8 sequence being pointed to by 'str'. + * The maximum number of bytes read is 'strlen', unless 'strlen' is + * negative. + * If a valid unicode char could be read, it is stored in the variable + * being pointed to by 'dst', otherwise that variable will be set to -1. + * In case of success the number of bytes read is returned, otherwise a + * negative error code is returned. + */ + +bool utf8proc_codepoint_valid(int32_t uc); +/* + * Returns 1, if the given unicode code-point is valid, otherwise 0. + */ + +ssize_t utf8proc_encode_char(int32_t uc, uint8_t *dst); +/* + * Encodes the unicode char with the code point 'uc' as an UTF-8 string in + * the byte array being pointed to by 'dst'. This array has to be at least + * 4 bytes long. + * In case of success the number of bytes written is returned, + * otherwise 0. + * This function does not check if 'uc' is a valid unicode code point. + */ + +const utf8proc_property_t *utf8proc_get_property(int32_t uc); +/* + * Returns a pointer to a (constant) struct containing information about + * the unicode char with the given code point 'uc'. + * If the character is not existent a pointer to a special struct is + * returned, where 'category' is a NULL pointer. + * WARNING: The parameter 'uc' has to be in the range of 0x0000 to + * 0x10FFFF, otherwise the program might crash! + */ + +ssize_t utf8proc_decompose_char( + int32_t uc, int32_t *dst, ssize_t bufsize, + int options, int *last_boundclass +); +/* + * Writes a decomposition of the unicode char 'uc' into the array being + * pointed to by 'dst'. + * Following flags in the 'options' field are regarded: + * REJECTNA: an unassigned unicode code point leads to an error + * IGNORE: "default ignorable" chars are stripped + * CASEFOLD: unicode casefolding is applied + * COMPAT: replace certain characters with their + * compatibility decomposition + * CHARBOUND: Inserts 0xFF bytes before each grapheme cluster + * LUMP: lumps certain different characters together + * STRIPMARK: removes all character marks + * The pointer 'last_boundclass' has to point to an integer variable which + * is storing the last character boundary class, if the CHARBOUND option + * is used. + * In case of success the number of chars written is returned, + * in case of an error, a negative error code is returned. + * If the number of written chars would be bigger than 'bufsize', + * the buffer (up to 'bufsize') has inpredictable data, and the needed + * buffer size is returned. + * WARNING: The parameter 'uc' has to be in the range of 0x0000 to + * 0x10FFFF, otherwise the program might crash! + */ + +ssize_t utf8proc_decompose( + const uint8_t *str, ssize_t strlen, + int32_t *buffer, ssize_t bufsize, int options +); +/* + * Does the same as 'utf8proc_decompose_char', but acts on a whole UTF-8 + * string, and orders the decomposed sequences correctly. + * If the NULLTERM flag in 'options' is set, processing will be stopped, + * when a NULL byte is encounted, otherwise 'strlen' bytes are processed. + * The result in form of unicode code points is written into the buffer + * being pointed to by 'buffer', having the length of 'bufsize' entries. + * In case of success the number of chars written is returned, + * in case of an error, a negative error code is returned. + * If the number of written chars would be bigger than 'bufsize', + * the buffer (up to 'bufsize') has inpredictable data, and the needed + * buffer size is returned. + */ + +ssize_t utf8proc_reencode(int32_t *buffer, ssize_t length, int options); +/* + * Reencodes the sequence of unicode characters given by the pointer + * 'buffer' and 'length' as UTF-8. + * The result is stored in the same memory area where the data is read. + * Following flags in the 'options' field are regarded: + * NLF2LS: converts LF, CRLF, CR and NEL into LS + * NLF2PS: converts LF, CRLF, CR and NEL into PS + * NLF2LF: converts LF, CRLF, CR and NEL into LF + * STRIPCC: strips or converts all non-affected control characters + * COMPOSE: tries to combine decomposed characters into composite + * characters + * STABLE: prohibits combining characters which would violate + * the unicode versioning stability + * In case of success the length of the resulting UTF-8 string is + * returned, otherwise a negative error code is returned. + * WARNING: The amount of free space being pointed to by 'buffer', has to + * exceed the amount of the input data by one byte, and the + * entries of the array pointed to by 'str' have to be in the + * range of 0x0000 to 0x10FFFF, otherwise the program might + * crash! + */ + +ssize_t utf8proc_map( + const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options +); +/* + * Maps the given UTF-8 string being pointed to by 'str' to a new UTF-8 + * string, which is allocated dynamically, and afterwards pointed to by + * the pointer being pointed to by 'dstptr'. + * If the NULLTERM flag in the 'options' field is set, the length is + * determined by a NULL terminator, otherwise the parameter 'strlen' is + * evaluated to determine the string length, but in any case the result + * will be NULL terminated (though it might contain NULL characters + * before). Other flags in the 'options' field are passed to the functions + * defined above, and regarded as described. + * In case of success the length of the new string is returned, + * otherwise a negative error code is returned. + * NOTICE: The memory of the new UTF-8 string will have been allocated with + * 'malloc', and has theirfore to be freed with 'free'. + */ + +uint8_t *utf8proc_NFD(const uint8_t *str); +uint8_t *utf8proc_NFC(const uint8_t *str); +uint8_t *utf8proc_NFKD(const uint8_t *str); +uint8_t *utf8proc_NFKC(const uint8_t *str); +/* + * Returns a pointer to newly allocated memory of a NFD, NFC, NFKD or NFKC + * normalized version of the null-terminated string 'str'. + */ + +ssize_t utf8proc_check(const uint8_t *str); +/* + * Just checks UTF-8 string for validity, returns 0 if valid or one of + * the negative UTF8PROC_ERROR_* codes if invalid or memory exhausted + * checking. Assumes null-terminated string str and UTF8PROC_STABLE + * option. + */ + +#endif + diff --git a/extern/src_netcdf4/utf8proc_data.h b/extern/src_netcdf4/utf8proc_data.h new file mode 100644 index 0000000..1426b76 --- /dev/null +++ b/extern/src_netcdf4/utf8proc_data.h @@ -0,0 +1,13383 @@ +/* + * This file contains derived data from a modified version of the + * Unicode data files. + * + * The original data files are available at + * http://www.unicode.org/Public/UNIDATA/ + * + * + * COPYRIGHT AND PERMISSION NOTICE + * + * Copyright (c) 1991-2007 Unicode, Inc. All rights reserved. Distributed + * under the Terms of Use in http://www.unicode.org/copyright.html. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of the Unicode data files and any associated documentation (the "Data + * Files") or Unicode software and any associated documentation (the + * "Software") to deal in the Data Files or Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, and/or sell copies of the Data Files or Software, and + * to permit persons to whom the Data Files or Software are furnished to do + * so, provided that (a) the above copyright notice(s) and this permission + * notice appear with all copies of the Data Files or Software, (b) both the + * above copyright notice(s) and this permission notice appear in associated + * documentation, and (c) there is clear notice in each modified Data File or + * in the Software as well as in the documentation associated with the Data + * File(s) or Software that the data or software has been modified. + * + * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR + * CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THE DATA FILES OR SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or other + * dealings in these Data Files or Software without prior written + * authorization of the copyright holder. + */ + + +const int32_t utf8proc_sequences[] = { + 97, -1, 98, -1, 99, -1, 100, + -1, 101, -1, 102, -1, 103, -1, 104, + -1, 105, -1, 106, -1, 107, -1, 108, + -1, 109, -1, 110, -1, 111, -1, 112, + -1, 113, -1, 114, -1, 115, -1, 116, + -1, 117, -1, 118, -1, 119, -1, 120, + -1, 121, -1, 122, -1, 32, -1, 32, + 776, -1, 32, 772, -1, 50, -1, 51, + -1, 32, 769, -1, 956, -1, 32, 807, + -1, 49, -1, 49, 8260, 52, -1, 49, + 8260, 50, -1, 51, 8260, 52, -1, 65, + 768, -1, 224, -1, 65, 769, -1, 225, + -1, 65, 770, -1, 226, -1, 65, 771, + -1, 227, -1, 65, 776, -1, 228, -1, + 65, 778, -1, 229, -1, 230, -1, 67, + 807, -1, 231, -1, 69, 768, -1, 232, + -1, 69, 769, -1, 233, -1, 69, 770, + -1, 234, -1, 69, 776, -1, 235, -1, + 73, 768, -1, 236, -1, 73, 769, -1, + 237, -1, 73, 770, -1, 238, -1, 73, + 776, -1, 239, -1, 240, -1, 78, 771, + -1, 241, -1, 79, 768, -1, 242, -1, + 79, 769, -1, 243, -1, 79, 770, -1, + 244, -1, 79, 771, -1, 245, -1, 79, + 776, -1, 246, -1, 248, -1, 85, 768, + -1, 249, -1, 85, 769, -1, 250, -1, + 85, 770, -1, 251, -1, 85, 776, -1, + 252, -1, 89, 769, -1, 253, -1, 254, + -1, 115, 115, -1, 97, 768, -1, 97, + 769, -1, 97, 770, -1, 97, 771, -1, + 97, 776, -1, 97, 778, -1, 99, 807, + -1, 101, 768, -1, 101, 769, -1, 101, + 770, -1, 101, 776, -1, 105, 768, -1, + 105, 769, -1, 105, 770, -1, 105, 776, + -1, 110, 771, -1, 111, 768, -1, 111, + 769, -1, 111, 770, -1, 111, 771, -1, + 111, 776, -1, 117, 768, -1, 117, 769, + -1, 117, 770, -1, 117, 776, -1, 121, + 769, -1, 121, 776, -1, 65, 772, -1, + 257, -1, 97, 772, -1, 65, 774, -1, + 259, -1, 97, 774, -1, 65, 808, -1, + 261, -1, 97, 808, -1, 67, 769, -1, + 263, -1, 99, 769, -1, 67, 770, -1, + 265, -1, 99, 770, -1, 67, 775, -1, + 267, -1, 99, 775, -1, 67, 780, -1, + 269, -1, 99, 780, -1, 68, 780, -1, + 271, -1, 100, 780, -1, 273, -1, 69, + 772, -1, 275, -1, 101, 772, -1, 69, + 774, -1, 277, -1, 101, 774, -1, 69, + 775, -1, 279, -1, 101, 775, -1, 69, + 808, -1, 281, -1, 101, 808, -1, 69, + 780, -1, 283, -1, 101, 780, -1, 71, + 770, -1, 285, -1, 103, 770, -1, 71, + 774, -1, 287, -1, 103, 774, -1, 71, + 775, -1, 289, -1, 103, 775, -1, 71, + 807, -1, 291, -1, 103, 807, -1, 72, + 770, -1, 293, -1, 104, 770, -1, 295, + -1, 73, 771, -1, 297, -1, 105, 771, + -1, 73, 772, -1, 299, -1, 105, 772, + -1, 73, 774, -1, 301, -1, 105, 774, + -1, 73, 808, -1, 303, -1, 105, 808, + -1, 73, 775, -1, 105, 775, -1, 73, + 74, -1, 307, -1, 105, 106, -1, 74, + 770, -1, 309, -1, 106, 770, -1, 75, + 807, -1, 311, -1, 107, 807, -1, 76, + 769, -1, 314, -1, 108, 769, -1, 76, + 807, -1, 316, -1, 108, 807, -1, 76, + 780, -1, 318, -1, 108, 780, -1, 76, + 183, -1, 320, -1, 108, 183, -1, 322, + -1, 78, 769, -1, 324, -1, 110, 769, + -1, 78, 807, -1, 326, -1, 110, 807, + -1, 78, 780, -1, 328, -1, 110, 780, + -1, 700, 110, -1, 331, -1, 79, 772, + -1, 333, -1, 111, 772, -1, 79, 774, + -1, 335, -1, 111, 774, -1, 79, 779, + -1, 337, -1, 111, 779, -1, 339, -1, + 82, 769, -1, 341, -1, 114, 769, -1, + 82, 807, -1, 343, -1, 114, 807, -1, + 82, 780, -1, 345, -1, 114, 780, -1, + 83, 769, -1, 347, -1, 115, 769, -1, + 83, 770, -1, 349, -1, 115, 770, -1, + 83, 807, -1, 351, -1, 115, 807, -1, + 83, 780, -1, 353, -1, 115, 780, -1, + 84, 807, -1, 355, -1, 116, 807, -1, + 84, 780, -1, 357, -1, 116, 780, -1, + 359, -1, 85, 771, -1, 361, -1, 117, + 771, -1, 85, 772, -1, 363, -1, 117, + 772, -1, 85, 774, -1, 365, -1, 117, + 774, -1, 85, 778, -1, 367, -1, 117, + 778, -1, 85, 779, -1, 369, -1, 117, + 779, -1, 85, 808, -1, 371, -1, 117, + 808, -1, 87, 770, -1, 373, -1, 119, + 770, -1, 89, 770, -1, 375, -1, 121, + 770, -1, 89, 776, -1, 255, -1, 90, + 769, -1, 378, -1, 122, 769, -1, 90, + 775, -1, 380, -1, 122, 775, -1, 90, + 780, -1, 382, -1, 122, 780, -1, 595, + -1, 387, -1, 389, -1, 596, -1, 392, + -1, 598, -1, 599, -1, 396, -1, 477, + -1, 601, -1, 603, -1, 402, -1, 608, + -1, 611, -1, 617, -1, 616, -1, 409, + -1, 623, -1, 626, -1, 629, -1, 79, + 795, -1, 417, -1, 111, 795, -1, 419, + -1, 421, -1, 640, -1, 424, -1, 643, + -1, 429, -1, 648, -1, 85, 795, -1, + 432, -1, 117, 795, -1, 650, -1, 651, + -1, 436, -1, 438, -1, 658, -1, 441, + -1, 445, -1, 68, 381, -1, 454, -1, + 68, 382, -1, 100, 382, -1, 76, 74, + -1, 457, -1, 76, 106, -1, 108, 106, + -1, 78, 74, -1, 460, -1, 78, 106, + -1, 110, 106, -1, 65, 780, -1, 462, + -1, 97, 780, -1, 73, 780, -1, 464, + -1, 105, 780, -1, 79, 780, -1, 466, + -1, 111, 780, -1, 85, 780, -1, 468, + -1, 117, 780, -1, 220, 772, -1, 470, + -1, 252, 772, -1, 220, 769, -1, 472, + -1, 252, 769, -1, 220, 780, -1, 474, + -1, 252, 780, -1, 220, 768, -1, 476, + -1, 252, 768, -1, 196, 772, -1, 479, + -1, 228, 772, -1, 550, 772, -1, 481, + -1, 551, 772, -1, 198, 772, -1, 483, + -1, 230, 772, -1, 485, -1, 71, 780, + -1, 487, -1, 103, 780, -1, 75, 780, + -1, 489, -1, 107, 780, -1, 79, 808, + -1, 491, -1, 111, 808, -1, 490, 772, + -1, 493, -1, 491, 772, -1, 439, 780, + -1, 495, -1, 658, 780, -1, 106, 780, + -1, 68, 90, -1, 499, -1, 68, 122, + -1, 100, 122, -1, 71, 769, -1, 501, + -1, 103, 769, -1, 405, -1, 447, -1, + 78, 768, -1, 505, -1, 110, 768, -1, + 197, 769, -1, 507, -1, 229, 769, -1, + 198, 769, -1, 509, -1, 230, 769, -1, + 216, 769, -1, 511, -1, 248, 769, -1, + 65, 783, -1, 513, -1, 97, 783, -1, + 65, 785, -1, 515, -1, 97, 785, -1, + 69, 783, -1, 517, -1, 101, 783, -1, + 69, 785, -1, 519, -1, 101, 785, -1, + 73, 783, -1, 521, -1, 105, 783, -1, + 73, 785, -1, 523, -1, 105, 785, -1, + 79, 783, -1, 525, -1, 111, 783, -1, + 79, 785, -1, 527, -1, 111, 785, -1, + 82, 783, -1, 529, -1, 114, 783, -1, + 82, 785, -1, 531, -1, 114, 785, -1, + 85, 783, -1, 533, -1, 117, 783, -1, + 85, 785, -1, 535, -1, 117, 785, -1, + 83, 806, -1, 537, -1, 115, 806, -1, + 84, 806, -1, 539, -1, 116, 806, -1, + 541, -1, 72, 780, -1, 543, -1, 104, + 780, -1, 414, -1, 547, -1, 549, -1, + 65, 775, -1, 551, -1, 97, 775, -1, + 69, 807, -1, 553, -1, 101, 807, -1, + 214, 772, -1, 555, -1, 246, 772, -1, + 213, 772, -1, 557, -1, 245, 772, -1, + 79, 775, -1, 559, -1, 111, 775, -1, + 558, 772, -1, 561, -1, 559, 772, -1, + 89, 772, -1, 563, -1, 121, 772, -1, + 11365, -1, 572, -1, 410, -1, 11366, -1, + 578, -1, 384, -1, 649, -1, 652, -1, + 583, -1, 585, -1, 587, -1, 589, -1, + 591, -1, 614, -1, 633, -1, 635, -1, + 641, -1, 32, 774, -1, 32, 775, -1, + 32, 778, -1, 32, 808, -1, 32, 771, + -1, 32, 779, -1, 661, -1, 768, -1, + 769, -1, 787, -1, 776, 769, -1, 953, + -1, 697, -1, 32, 837, -1, 59, -1, + 168, 769, -1, 913, 769, -1, 940, -1, + 183, -1, 917, 769, -1, 941, -1, 919, + 769, -1, 942, -1, 921, 769, -1, 943, + -1, 927, 769, -1, 972, -1, 933, 769, + -1, 973, -1, 937, 769, -1, 974, -1, + 970, 769, -1, 953, 776, 769, -1, 945, + -1, 946, -1, 947, -1, 948, -1, 949, + -1, 950, -1, 951, -1, 952, -1, 954, + -1, 955, -1, 957, -1, 958, -1, 959, + -1, 960, -1, 961, -1, 963, -1, 964, + -1, 965, -1, 966, -1, 967, -1, 968, + -1, 969, -1, 921, 776, -1, 970, -1, + 933, 776, -1, 971, -1, 945, 769, -1, + 949, 769, -1, 951, 769, -1, 953, 769, + -1, 971, 769, -1, 965, 776, 769, -1, + 953, 776, -1, 965, 776, -1, 959, 769, + -1, 965, 769, -1, 969, 769, -1, 933, + -1, 978, 769, -1, 978, 776, -1, 985, + -1, 987, -1, 989, -1, 991, -1, 993, + -1, 995, -1, 997, -1, 999, -1, 1001, + -1, 1003, -1, 1005, -1, 1007, -1, 962, + -1, 920, -1, 1016, -1, 931, -1, 1010, + -1, 1019, -1, 891, -1, 892, -1, 893, + -1, 1045, 768, -1, 1104, -1, 1045, 776, + -1, 1105, -1, 1106, -1, 1043, 769, -1, + 1107, -1, 1108, -1, 1109, -1, 1110, -1, + 1030, 776, -1, 1111, -1, 1112, -1, 1113, + -1, 1114, -1, 1115, -1, 1050, 769, -1, + 1116, -1, 1048, 768, -1, 1117, -1, 1059, + 774, -1, 1118, -1, 1119, -1, 1072, -1, + 1073, -1, 1074, -1, 1075, -1, 1076, -1, + 1077, -1, 1078, -1, 1079, -1, 1080, -1, + 1048, 774, -1, 1081, -1, 1082, -1, 1083, + -1, 1084, -1, 1085, -1, 1086, -1, 1087, + -1, 1088, -1, 1089, -1, 1090, -1, 1091, + -1, 1092, -1, 1093, -1, 1094, -1, 1095, + -1, 1096, -1, 1097, -1, 1098, -1, 1099, + -1, 1100, -1, 1101, -1, 1102, -1, 1103, + -1, 1080, 774, -1, 1077, 768, -1, 1077, + 776, -1, 1075, 769, -1, 1110, 776, -1, + 1082, 769, -1, 1080, 768, -1, 1091, 774, + -1, 1121, -1, 1123, -1, 1125, -1, 1127, + -1, 1129, -1, 1131, -1, 1133, -1, 1135, + -1, 1137, -1, 1139, -1, 1141, -1, 1140, + 783, -1, 1143, -1, 1141, 783, -1, 1145, + -1, 1147, -1, 1149, -1, 1151, -1, 1153, + -1, 1163, -1, 1165, -1, 1167, -1, 1169, + -1, 1171, -1, 1173, -1, 1175, -1, 1177, + -1, 1179, -1, 1181, -1, 1183, -1, 1185, + -1, 1187, -1, 1189, -1, 1191, -1, 1193, + -1, 1195, -1, 1197, -1, 1199, -1, 1201, + -1, 1203, -1, 1205, -1, 1207, -1, 1209, + -1, 1211, -1, 1213, -1, 1215, -1, 1231, + -1, 1046, 774, -1, 1218, -1, 1078, 774, + -1, 1220, -1, 1222, -1, 1224, -1, 1226, + -1, 1228, -1, 1230, -1, 1040, 774, -1, + 1233, -1, 1072, 774, -1, 1040, 776, -1, + 1235, -1, 1072, 776, -1, 1237, -1, 1045, + 774, -1, 1239, -1, 1077, 774, -1, 1241, + -1, 1240, 776, -1, 1243, -1, 1241, 776, + -1, 1046, 776, -1, 1245, -1, 1078, 776, + -1, 1047, 776, -1, 1247, -1, 1079, 776, + -1, 1249, -1, 1048, 772, -1, 1251, -1, + 1080, 772, -1, 1048, 776, -1, 1253, -1, + 1080, 776, -1, 1054, 776, -1, 1255, -1, + 1086, 776, -1, 1257, -1, 1256, 776, -1, + 1259, -1, 1257, 776, -1, 1069, 776, -1, + 1261, -1, 1101, 776, -1, 1059, 772, -1, + 1263, -1, 1091, 772, -1, 1059, 776, -1, + 1265, -1, 1091, 776, -1, 1059, 779, -1, + 1267, -1, 1091, 779, -1, 1063, 776, -1, + 1269, -1, 1095, 776, -1, 1271, -1, 1067, + 776, -1, 1273, -1, 1099, 776, -1, 1275, + -1, 1277, -1, 1279, -1, 1281, -1, 1283, + -1, 1285, -1, 1287, -1, 1289, -1, 1291, + -1, 1293, -1, 1295, -1, 1297, -1, 1299, + -1, 1377, -1, 1378, -1, 1379, -1, 1380, + -1, 1381, -1, 1382, -1, 1383, -1, 1384, + -1, 1385, -1, 1386, -1, 1387, -1, 1388, + -1, 1389, -1, 1390, -1, 1391, -1, 1392, + -1, 1393, -1, 1394, -1, 1395, -1, 1396, + -1, 1397, -1, 1398, -1, 1399, -1, 1400, + -1, 1401, -1, 1402, -1, 1403, -1, 1404, + -1, 1405, -1, 1406, -1, 1407, -1, 1408, + -1, 1409, -1, 1410, -1, 1411, -1, 1412, + -1, 1413, -1, 1414, -1, 1381, 1410, -1, + 1575, 1619, -1, 1575, 1620, -1, 1608, 1620, + -1, 1575, 1621, -1, 1610, 1620, -1, 1575, + 1652, -1, 1608, 1652, -1, 1735, 1652, -1, + 1610, 1652, -1, 1749, 1620, -1, 1729, 1620, + -1, 1746, 1620, -1, 2344, 2364, -1, 2352, + 2364, -1, 2355, 2364, -1, 2325, 2364, -1, + 2326, 2364, -1, 2327, 2364, -1, 2332, 2364, + -1, 2337, 2364, -1, 2338, 2364, -1, 2347, + 2364, -1, 2351, 2364, -1, 2503, 2494, -1, + 2503, 2519, -1, 2465, 2492, -1, 2466, 2492, + -1, 2479, 2492, -1, 2610, 2620, -1, 2616, + 2620, -1, 2582, 2620, -1, 2583, 2620, -1, + 2588, 2620, -1, 2603, 2620, -1, 2887, 2902, + -1, 2887, 2878, -1, 2887, 2903, -1, 2849, + 2876, -1, 2850, 2876, -1, 2962, 3031, -1, + 3014, 3006, -1, 3015, 3006, -1, 3014, 3031, + -1, 3142, 3158, -1, 3263, 3285, -1, 3270, + 3285, -1, 3270, 3286, -1, 3270, 3266, -1, + 3274, 3285, -1, 3398, 3390, -1, 3399, 3390, + -1, 3398, 3415, -1, 3545, 3530, -1, 3545, + 3535, -1, 3548, 3530, -1, 3545, 3551, -1, + 3661, 3634, -1, 3789, 3762, -1, 3755, 3737, + -1, 3755, 3745, -1, 3851, -1, 3906, 4023, + -1, 3916, 4023, -1, 3921, 4023, -1, 3926, + 4023, -1, 3931, 4023, -1, 3904, 4021, -1, + 3953, 3954, -1, 3953, 3956, -1, 4018, 3968, + -1, 4018, 3969, -1, 4019, 3968, -1, 4019, + 3969, -1, 3953, 3968, -1, 3986, 4023, -1, + 3996, 4023, -1, 4001, 4023, -1, 4006, 4023, + -1, 4011, 4023, -1, 3984, 4021, -1, 4133, + 4142, -1, 11520, -1, 11521, -1, 11522, -1, + 11523, -1, 11524, -1, 11525, -1, 11526, -1, + 11527, -1, 11528, -1, 11529, -1, 11530, -1, + 11531, -1, 11532, -1, 11533, -1, 11534, -1, + 11535, -1, 11536, -1, 11537, -1, 11538, -1, + 11539, -1, 11540, -1, 11541, -1, 11542, -1, + 11543, -1, 11544, -1, 11545, -1, 11546, -1, + 11547, -1, 11548, -1, 11549, -1, 11550, -1, + 11551, -1, 11552, -1, 11553, -1, 11554, -1, + 11555, -1, 11556, -1, 11557, -1, 4316, -1, + 6917, 6965, -1, 6919, 6965, -1, 6921, 6965, + -1, 6923, 6965, -1, 6925, 6965, -1, 6929, + 6965, -1, 6970, 6965, -1, 6972, 6965, -1, + 6974, 6965, -1, 6975, 6965, -1, 6978, 6965, + -1, 65, -1, 198, -1, 66, -1, 68, + -1, 69, -1, 398, -1, 71, -1, 72, + -1, 73, -1, 74, -1, 75, -1, 76, + -1, 77, -1, 78, -1, 79, -1, 546, + -1, 80, -1, 82, -1, 84, -1, 85, + -1, 87, -1, 592, -1, 593, -1, 7426, + -1, 604, -1, 7446, -1, 7447, -1, 7453, + -1, 7461, -1, 594, -1, 597, -1, 607, + -1, 609, -1, 613, -1, 618, -1, 7547, + -1, 669, -1, 621, -1, 7557, -1, 671, + -1, 625, -1, 624, -1, 627, -1, 628, + -1, 632, -1, 642, -1, 427, -1, 7452, + -1, 656, -1, 657, -1, 65, 805, -1, + 7681, -1, 97, 805, -1, 66, 775, -1, + 7683, -1, 98, 775, -1, 66, 803, -1, + 7685, -1, 98, 803, -1, 66, 817, -1, + 7687, -1, 98, 817, -1, 199, 769, -1, + 7689, -1, 231, 769, -1, 68, 775, -1, + 7691, -1, 100, 775, -1, 68, 803, -1, + 7693, -1, 100, 803, -1, 68, 817, -1, + 7695, -1, 100, 817, -1, 68, 807, -1, + 7697, -1, 100, 807, -1, 68, 813, -1, + 7699, -1, 100, 813, -1, 274, 768, -1, + 7701, -1, 275, 768, -1, 274, 769, -1, + 7703, -1, 275, 769, -1, 69, 813, -1, + 7705, -1, 101, 813, -1, 69, 816, -1, + 7707, -1, 101, 816, -1, 552, 774, -1, + 7709, -1, 553, 774, -1, 70, 775, -1, + 7711, -1, 102, 775, -1, 71, 772, -1, + 7713, -1, 103, 772, -1, 72, 775, -1, + 7715, -1, 104, 775, -1, 72, 803, -1, + 7717, -1, 104, 803, -1, 72, 776, -1, + 7719, -1, 104, 776, -1, 72, 807, -1, + 7721, -1, 104, 807, -1, 72, 814, -1, + 7723, -1, 104, 814, -1, 73, 816, -1, + 7725, -1, 105, 816, -1, 207, 769, -1, + 7727, -1, 239, 769, -1, 75, 769, -1, + 7729, -1, 107, 769, -1, 75, 803, -1, + 7731, -1, 107, 803, -1, 75, 817, -1, + 7733, -1, 107, 817, -1, 76, 803, -1, + 7735, -1, 108, 803, -1, 7734, 772, -1, + 7737, -1, 7735, 772, -1, 76, 817, -1, + 7739, -1, 108, 817, -1, 76, 813, -1, + 7741, -1, 108, 813, -1, 77, 769, -1, + 7743, -1, 109, 769, -1, 77, 775, -1, + 7745, -1, 109, 775, -1, 77, 803, -1, + 7747, -1, 109, 803, -1, 78, 775, -1, + 7749, -1, 110, 775, -1, 78, 803, -1, + 7751, -1, 110, 803, -1, 78, 817, -1, + 7753, -1, 110, 817, -1, 78, 813, -1, + 7755, -1, 110, 813, -1, 213, 769, -1, + 7757, -1, 245, 769, -1, 213, 776, -1, + 7759, -1, 245, 776, -1, 332, 768, -1, + 7761, -1, 333, 768, -1, 332, 769, -1, + 7763, -1, 333, 769, -1, 80, 769, -1, + 7765, -1, 112, 769, -1, 80, 775, -1, + 7767, -1, 112, 775, -1, 82, 775, -1, + 7769, -1, 114, 775, -1, 82, 803, -1, + 7771, -1, 114, 803, -1, 7770, 772, -1, + 7773, -1, 7771, 772, -1, 82, 817, -1, + 7775, -1, 114, 817, -1, 83, 775, -1, + 7777, -1, 115, 775, -1, 83, 803, -1, + 7779, -1, 115, 803, -1, 346, 775, -1, + 7781, -1, 347, 775, -1, 352, 775, -1, + 7783, -1, 353, 775, -1, 7778, 775, -1, + 7785, -1, 7779, 775, -1, 84, 775, -1, + 7787, -1, 116, 775, -1, 84, 803, -1, + 7789, -1, 116, 803, -1, 84, 817, -1, + 7791, -1, 116, 817, -1, 84, 813, -1, + 7793, -1, 116, 813, -1, 85, 804, -1, + 7795, -1, 117, 804, -1, 85, 816, -1, + 7797, -1, 117, 816, -1, 85, 813, -1, + 7799, -1, 117, 813, -1, 360, 769, -1, + 7801, -1, 361, 769, -1, 362, 776, -1, + 7803, -1, 363, 776, -1, 86, 771, -1, + 7805, -1, 118, 771, -1, 86, 803, -1, + 7807, -1, 118, 803, -1, 87, 768, -1, + 7809, -1, 119, 768, -1, 87, 769, -1, + 7811, -1, 119, 769, -1, 87, 776, -1, + 7813, -1, 119, 776, -1, 87, 775, -1, + 7815, -1, 119, 775, -1, 87, 803, -1, + 7817, -1, 119, 803, -1, 88, 775, -1, + 7819, -1, 120, 775, -1, 88, 776, -1, + 7821, -1, 120, 776, -1, 89, 775, -1, + 7823, -1, 121, 775, -1, 90, 770, -1, + 7825, -1, 122, 770, -1, 90, 803, -1, + 7827, -1, 122, 803, -1, 90, 817, -1, + 7829, -1, 122, 817, -1, 104, 817, -1, + 116, 776, -1, 119, 778, -1, 121, 778, + -1, 97, 702, -1, 383, 775, -1, 65, + 803, -1, 7841, -1, 97, 803, -1, 65, + 777, -1, 7843, -1, 97, 777, -1, 194, + 769, -1, 7845, -1, 226, 769, -1, 194, + 768, -1, 7847, -1, 226, 768, -1, 194, + 777, -1, 7849, -1, 226, 777, -1, 194, + 771, -1, 7851, -1, 226, 771, -1, 7840, + 770, -1, 7853, -1, 7841, 770, -1, 258, + 769, -1, 7855, -1, 259, 769, -1, 258, + 768, -1, 7857, -1, 259, 768, -1, 258, + 777, -1, 7859, -1, 259, 777, -1, 258, + 771, -1, 7861, -1, 259, 771, -1, 7840, + 774, -1, 7863, -1, 7841, 774, -1, 69, + 803, -1, 7865, -1, 101, 803, -1, 69, + 777, -1, 7867, -1, 101, 777, -1, 69, + 771, -1, 7869, -1, 101, 771, -1, 202, + 769, -1, 7871, -1, 234, 769, -1, 202, + 768, -1, 7873, -1, 234, 768, -1, 202, + 777, -1, 7875, -1, 234, 777, -1, 202, + 771, -1, 7877, -1, 234, 771, -1, 7864, + 770, -1, 7879, -1, 7865, 770, -1, 73, + 777, -1, 7881, -1, 105, 777, -1, 73, + 803, -1, 7883, -1, 105, 803, -1, 79, + 803, -1, 7885, -1, 111, 803, -1, 79, + 777, -1, 7887, -1, 111, 777, -1, 212, + 769, -1, 7889, -1, 244, 769, -1, 212, + 768, -1, 7891, -1, 244, 768, -1, 212, + 777, -1, 7893, -1, 244, 777, -1, 212, + 771, -1, 7895, -1, 244, 771, -1, 7884, + 770, -1, 7897, -1, 7885, 770, -1, 416, + 769, -1, 7899, -1, 417, 769, -1, 416, + 768, -1, 7901, -1, 417, 768, -1, 416, + 777, -1, 7903, -1, 417, 777, -1, 416, + 771, -1, 7905, -1, 417, 771, -1, 416, + 803, -1, 7907, -1, 417, 803, -1, 85, + 803, -1, 7909, -1, 117, 803, -1, 85, + 777, -1, 7911, -1, 117, 777, -1, 431, + 769, -1, 7913, -1, 432, 769, -1, 431, + 768, -1, 7915, -1, 432, 768, -1, 431, + 777, -1, 7917, -1, 432, 777, -1, 431, + 771, -1, 7919, -1, 432, 771, -1, 431, + 803, -1, 7921, -1, 432, 803, -1, 89, + 768, -1, 7923, -1, 121, 768, -1, 89, + 803, -1, 7925, -1, 121, 803, -1, 89, + 777, -1, 7927, -1, 121, 777, -1, 89, + 771, -1, 7929, -1, 121, 771, -1, 945, + 787, -1, 945, 788, -1, 7936, 768, -1, + 7937, 768, -1, 7936, 769, -1, 7937, 769, + -1, 7936, 834, -1, 7937, 834, -1, 913, + 787, -1, 7936, -1, 913, 788, -1, 7937, + -1, 7944, 768, -1, 7938, -1, 7945, 768, + -1, 7939, -1, 7944, 769, -1, 7940, -1, + 7945, 769, -1, 7941, -1, 7944, 834, -1, + 7942, -1, 7945, 834, -1, 7943, -1, 949, + 787, -1, 949, 788, -1, 7952, 768, -1, + 7953, 768, -1, 7952, 769, -1, 7953, 769, + -1, 917, 787, -1, 7952, -1, 917, 788, + -1, 7953, -1, 7960, 768, -1, 7954, -1, + 7961, 768, -1, 7955, -1, 7960, 769, -1, + 7956, -1, 7961, 769, -1, 7957, -1, 951, + 787, -1, 951, 788, -1, 7968, 768, -1, + 7969, 768, -1, 7968, 769, -1, 7969, 769, + -1, 7968, 834, -1, 7969, 834, -1, 919, + 787, -1, 7968, -1, 919, 788, -1, 7969, + -1, 7976, 768, -1, 7970, -1, 7977, 768, + -1, 7971, -1, 7976, 769, -1, 7972, -1, + 7977, 769, -1, 7973, -1, 7976, 834, -1, + 7974, -1, 7977, 834, -1, 7975, -1, 953, + 787, -1, 953, 788, -1, 7984, 768, -1, + 7985, 768, -1, 7984, 769, -1, 7985, 769, + -1, 7984, 834, -1, 7985, 834, -1, 921, + 787, -1, 7984, -1, 921, 788, -1, 7985, + -1, 7992, 768, -1, 7986, -1, 7993, 768, + -1, 7987, -1, 7992, 769, -1, 7988, -1, + 7993, 769, -1, 7989, -1, 7992, 834, -1, + 7990, -1, 7993, 834, -1, 7991, -1, 959, + 787, -1, 959, 788, -1, 8000, 768, -1, + 8001, 768, -1, 8000, 769, -1, 8001, 769, + -1, 927, 787, -1, 8000, -1, 927, 788, + -1, 8001, -1, 8008, 768, -1, 8002, -1, + 8009, 768, -1, 8003, -1, 8008, 769, -1, + 8004, -1, 8009, 769, -1, 8005, -1, 965, + 787, -1, 965, 788, -1, 8016, 768, -1, + 965, 787, 768, -1, 8017, 768, -1, 8016, + 769, -1, 965, 787, 769, -1, 8017, 769, + -1, 8016, 834, -1, 965, 787, 834, -1, + 8017, 834, -1, 933, 788, -1, 8017, -1, + 8025, 768, -1, 8019, -1, 8025, 769, -1, + 8021, -1, 8025, 834, -1, 8023, -1, 969, + 787, -1, 969, 788, -1, 8032, 768, -1, + 8033, 768, -1, 8032, 769, -1, 8033, 769, + -1, 8032, 834, -1, 8033, 834, -1, 937, + 787, -1, 8032, -1, 937, 788, -1, 8033, + -1, 8040, 768, -1, 8034, -1, 8041, 768, + -1, 8035, -1, 8040, 769, -1, 8036, -1, + 8041, 769, -1, 8037, -1, 8040, 834, -1, + 8038, -1, 8041, 834, -1, 8039, -1, 945, + 768, -1, 949, 768, -1, 951, 768, -1, + 953, 768, -1, 959, 768, -1, 965, 768, + -1, 969, 768, -1, 7936, 837, -1, 7936, + 953, -1, 7937, 837, -1, 7937, 953, -1, + 7938, 837, -1, 7938, 953, -1, 7939, 837, + -1, 7939, 953, -1, 7940, 837, -1, 7940, + 953, -1, 7941, 837, -1, 7941, 953, -1, + 7942, 837, -1, 7942, 953, -1, 7943, 837, + -1, 7943, 953, -1, 7944, 837, -1, 8064, + -1, 7945, 837, -1, 8065, -1, 7946, 837, + -1, 8066, -1, 7947, 837, -1, 8067, -1, + 7948, 837, -1, 8068, -1, 7949, 837, -1, + 8069, -1, 7950, 837, -1, 8070, -1, 7951, + 837, -1, 8071, -1, 7968, 837, -1, 7968, + 953, -1, 7969, 837, -1, 7969, 953, -1, + 7970, 837, -1, 7970, 953, -1, 7971, 837, + -1, 7971, 953, -1, 7972, 837, -1, 7972, + 953, -1, 7973, 837, -1, 7973, 953, -1, + 7974, 837, -1, 7974, 953, -1, 7975, 837, + -1, 7975, 953, -1, 7976, 837, -1, 8080, + -1, 7977, 837, -1, 8081, -1, 7978, 837, + -1, 8082, -1, 7979, 837, -1, 8083, -1, + 7980, 837, -1, 8084, -1, 7981, 837, -1, + 8085, -1, 7982, 837, -1, 8086, -1, 7983, + 837, -1, 8087, -1, 8032, 837, -1, 8032, + 953, -1, 8033, 837, -1, 8033, 953, -1, + 8034, 837, -1, 8034, 953, -1, 8035, 837, + -1, 8035, 953, -1, 8036, 837, -1, 8036, + 953, -1, 8037, 837, -1, 8037, 953, -1, + 8038, 837, -1, 8038, 953, -1, 8039, 837, + -1, 8039, 953, -1, 8040, 837, -1, 8096, + -1, 8041, 837, -1, 8097, -1, 8042, 837, + -1, 8098, -1, 8043, 837, -1, 8099, -1, + 8044, 837, -1, 8100, -1, 8045, 837, -1, + 8101, -1, 8046, 837, -1, 8102, -1, 8047, + 837, -1, 8103, -1, 945, 774, -1, 945, + 772, -1, 8048, 837, -1, 8048, 953, -1, + 945, 837, -1, 945, 953, -1, 940, 837, + -1, 940, 953, -1, 945, 834, -1, 8118, + 837, -1, 945, 834, 953, -1, 913, 774, + -1, 8112, -1, 913, 772, -1, 8113, -1, + 913, 768, -1, 8048, -1, 902, -1, 8049, + -1, 913, 837, -1, 8115, -1, 32, 787, + -1, 32, 834, -1, 168, 834, -1, 8052, + 837, -1, 8052, 953, -1, 951, 837, -1, + 951, 953, -1, 942, 837, -1, 942, 953, + -1, 951, 834, -1, 8134, 837, -1, 951, + 834, 953, -1, 917, 768, -1, 8050, -1, + 904, -1, 8051, -1, 919, 768, -1, 8052, + -1, 905, -1, 8053, -1, 919, 837, -1, + 8131, -1, 8127, 768, -1, 8127, 769, -1, + 8127, 834, -1, 953, 774, -1, 953, 772, + -1, 970, 768, -1, 953, 776, 768, -1, + 912, -1, 953, 834, -1, 970, 834, -1, + 953, 776, 834, -1, 921, 774, -1, 8144, + -1, 921, 772, -1, 8145, -1, 921, 768, + -1, 8054, -1, 906, -1, 8055, -1, 8190, + 768, -1, 8190, 769, -1, 8190, 834, -1, + 965, 774, -1, 965, 772, -1, 971, 768, + -1, 965, 776, 768, -1, 944, -1, 961, + 787, -1, 961, 788, -1, 965, 834, -1, + 971, 834, -1, 965, 776, 834, -1, 933, + 774, -1, 8160, -1, 933, 772, -1, 8161, + -1, 933, 768, -1, 8058, -1, 910, -1, + 8059, -1, 929, 788, -1, 8165, -1, 168, + 768, -1, 901, -1, 96, -1, 8060, 837, + -1, 8060, 953, -1, 969, 837, -1, 969, + 953, -1, 974, 837, -1, 974, 953, -1, + 969, 834, -1, 8182, 837, -1, 969, 834, + 953, -1, 927, 768, -1, 8056, -1, 908, + -1, 8057, -1, 937, 768, -1, 8060, -1, + 911, -1, 8061, -1, 937, 837, -1, 8179, + -1, 180, -1, 32, 788, -1, 8194, -1, + 8195, -1, 8208, -1, 32, 819, -1, 46, + -1, 46, 46, -1, 46, 46, 46, -1, + 8242, 8242, -1, 8242, 8242, 8242, -1, 8245, + 8245, -1, 8245, 8245, 8245, -1, 33, 33, + -1, 32, 773, -1, 63, 63, -1, 63, + 33, -1, 33, 63, -1, 8242, 8242, 8242, + 8242, -1, 48, -1, 52, -1, 53, -1, + 54, -1, 55, -1, 56, -1, 57, -1, + 43, -1, 8722, -1, 61, -1, 40, -1, + 41, -1, 82, 115, -1, 97, 47, 99, + -1, 97, 47, 115, -1, 67, -1, 176, + 67, -1, 99, 47, 111, -1, 99, 47, + 117, -1, 400, -1, 176, 70, -1, 78, + 111, -1, 81, -1, 83, 77, -1, 84, + 69, 76, -1, 84, 77, -1, 90, -1, + 937, -1, 197, -1, 70, -1, 8526, -1, + 1488, -1, 1489, -1, 1490, -1, 1491, -1, + 70, 65, 88, -1, 915, -1, 928, -1, + 8721, -1, 49, 8260, 51, -1, 50, 8260, + 51, -1, 49, 8260, 53, -1, 50, 8260, + 53, -1, 51, 8260, 53, -1, 52, 8260, + 53, -1, 49, 8260, 54, -1, 53, 8260, + 54, -1, 49, 8260, 56, -1, 51, 8260, + 56, -1, 53, 8260, 56, -1, 55, 8260, + 56, -1, 49, 8260, -1, 8560, -1, 73, + 73, -1, 8561, -1, 73, 73, 73, -1, + 8562, -1, 73, 86, -1, 8563, -1, 86, + -1, 8564, -1, 86, 73, -1, 8565, -1, + 86, 73, 73, -1, 8566, -1, 86, 73, + 73, 73, -1, 8567, -1, 73, 88, -1, + 8568, -1, 88, -1, 8569, -1, 88, 73, + -1, 8570, -1, 88, 73, 73, -1, 8571, + -1, 8572, -1, 8573, -1, 8574, -1, 8575, + -1, 105, 105, -1, 105, 105, 105, -1, + 105, 118, -1, 118, 105, -1, 118, 105, + 105, -1, 118, 105, 105, 105, -1, 105, + 120, -1, 120, 105, -1, 120, 105, 105, + -1, 8580, -1, 8592, 824, -1, 8594, 824, + -1, 8596, 824, -1, 8656, 824, -1, 8660, + 824, -1, 8658, 824, -1, 8707, 824, -1, + 8712, 824, -1, 8715, 824, -1, 8739, 824, + -1, 8741, 824, -1, 8747, 8747, -1, 8747, + 8747, 8747, -1, 8750, 8750, -1, 8750, 8750, + 8750, -1, 8764, 824, -1, 8771, 824, -1, + 8773, 824, -1, 8776, 824, -1, 61, 824, + -1, 8801, 824, -1, 8781, 824, -1, 60, + 824, -1, 62, 824, -1, 8804, 824, -1, + 8805, 824, -1, 8818, 824, -1, 8819, 824, + -1, 8822, 824, -1, 8823, 824, -1, 8826, + 824, -1, 8827, 824, -1, 8834, 824, -1, + 8835, 824, -1, 8838, 824, -1, 8839, 824, + -1, 8866, 824, -1, 8872, 824, -1, 8873, + 824, -1, 8875, 824, -1, 8828, 824, -1, + 8829, 824, -1, 8849, 824, -1, 8850, 824, + -1, 8882, 824, -1, 8883, 824, -1, 8884, + 824, -1, 8885, 824, -1, 12296, -1, 12297, + -1, 49, 48, -1, 49, 49, -1, 49, + 50, -1, 49, 51, -1, 49, 52, -1, + 49, 53, -1, 49, 54, -1, 49, 55, + -1, 49, 56, -1, 49, 57, -1, 50, + 48, -1, 40, 49, 41, -1, 40, 50, + 41, -1, 40, 51, 41, -1, 40, 52, + 41, -1, 40, 53, 41, -1, 40, 54, + 41, -1, 40, 55, 41, -1, 40, 56, + 41, -1, 40, 57, 41, -1, 40, 49, + 48, 41, -1, 40, 49, 49, 41, -1, + 40, 49, 50, 41, -1, 40, 49, 51, + 41, -1, 40, 49, 52, 41, -1, 40, + 49, 53, 41, -1, 40, 49, 54, 41, + -1, 40, 49, 55, 41, -1, 40, 49, + 56, 41, -1, 40, 49, 57, 41, -1, + 40, 50, 48, 41, -1, 49, 46, -1, + 50, 46, -1, 51, 46, -1, 52, 46, + -1, 53, 46, -1, 54, 46, -1, 55, + 46, -1, 56, 46, -1, 57, 46, -1, + 49, 48, 46, -1, 49, 49, 46, -1, + 49, 50, 46, -1, 49, 51, 46, -1, + 49, 52, 46, -1, 49, 53, 46, -1, + 49, 54, 46, -1, 49, 55, 46, -1, + 49, 56, 46, -1, 49, 57, 46, -1, + 50, 48, 46, -1, 40, 97, 41, -1, + 40, 98, 41, -1, 40, 99, 41, -1, + 40, 100, 41, -1, 40, 101, 41, -1, + 40, 102, 41, -1, 40, 103, 41, -1, + 40, 104, 41, -1, 40, 105, 41, -1, + 40, 106, 41, -1, 40, 107, 41, -1, + 40, 108, 41, -1, 40, 109, 41, -1, + 40, 110, 41, -1, 40, 111, 41, -1, + 40, 112, 41, -1, 40, 113, 41, -1, + 40, 114, 41, -1, 40, 115, 41, -1, + 40, 116, 41, -1, 40, 117, 41, -1, + 40, 118, 41, -1, 40, 119, 41, -1, + 40, 120, 41, -1, 40, 121, 41, -1, + 40, 122, 41, -1, 9424, -1, 9425, -1, + 9426, -1, 9427, -1, 9428, -1, 9429, -1, + 9430, -1, 9431, -1, 9432, -1, 9433, -1, + 9434, -1, 9435, -1, 9436, -1, 9437, -1, + 9438, -1, 9439, -1, 9440, -1, 9441, -1, + 83, -1, 9442, -1, 9443, -1, 9444, -1, + 9445, -1, 9446, -1, 9447, -1, 89, -1, + 9448, -1, 9449, -1, 8747, 8747, 8747, 8747, + -1, 58, 58, 61, -1, 61, 61, -1, + 61, 61, 61, -1, 10973, 824, -1, 11312, + -1, 11313, -1, 11314, -1, 11315, -1, 11316, + -1, 11317, -1, 11318, -1, 11319, -1, 11320, + -1, 11321, -1, 11322, -1, 11323, -1, 11324, + -1, 11325, -1, 11326, -1, 11327, -1, 11328, + -1, 11329, -1, 11330, -1, 11331, -1, 11332, + -1, 11333, -1, 11334, -1, 11335, -1, 11336, + -1, 11337, -1, 11338, -1, 11339, -1, 11340, + -1, 11341, -1, 11342, -1, 11343, -1, 11344, + -1, 11345, -1, 11346, -1, 11347, -1, 11348, + -1, 11349, -1, 11350, -1, 11351, -1, 11352, + -1, 11353, -1, 11354, -1, 11355, -1, 11356, + -1, 11357, -1, 11358, -1, 11361, -1, 619, + -1, 7549, -1, 637, -1, 11368, -1, 11370, + -1, 11372, -1, 11382, -1, 11393, -1, 11395, + -1, 11397, -1, 11399, -1, 11401, -1, 11403, + -1, 11405, -1, 11407, -1, 11409, -1, 11411, + -1, 11413, -1, 11415, -1, 11417, -1, 11419, + -1, 11421, -1, 11423, -1, 11425, -1, 11427, + -1, 11429, -1, 11431, -1, 11433, -1, 11435, + -1, 11437, -1, 11439, -1, 11441, -1, 11443, + -1, 11445, -1, 11447, -1, 11449, -1, 11451, + -1, 11453, -1, 11455, -1, 11457, -1, 11459, + -1, 11461, -1, 11463, -1, 11465, -1, 11467, + -1, 11469, -1, 11471, -1, 11473, -1, 11475, + -1, 11477, -1, 11479, -1, 11481, -1, 11483, + -1, 11485, -1, 11487, -1, 11489, -1, 11491, + -1, 11617, -1, 27597, -1, 40863, -1, 19968, + -1, 20008, -1, 20022, -1, 20031, -1, 20057, + -1, 20101, -1, 20108, -1, 20128, -1, 20154, + -1, 20799, -1, 20837, -1, 20843, -1, 20866, + -1, 20886, -1, 20907, -1, 20960, -1, 20981, + -1, 20992, -1, 21147, -1, 21241, -1, 21269, + -1, 21274, -1, 21304, -1, 21313, -1, 21340, + -1, 21353, -1, 21378, -1, 21430, -1, 21448, + -1, 21475, -1, 22231, -1, 22303, -1, 22763, + -1, 22786, -1, 22794, -1, 22805, -1, 22823, + -1, 22899, -1, 23376, -1, 23424, -1, 23544, + -1, 23567, -1, 23586, -1, 23608, -1, 23662, + -1, 23665, -1, 24027, -1, 24037, -1, 24049, + -1, 24062, -1, 24178, -1, 24186, -1, 24191, + -1, 24308, -1, 24318, -1, 24331, -1, 24339, + -1, 24400, -1, 24417, -1, 24435, -1, 24515, + -1, 25096, -1, 25142, -1, 25163, -1, 25903, + -1, 25908, -1, 25991, -1, 26007, -1, 26020, + -1, 26041, -1, 26080, -1, 26085, -1, 26352, + -1, 26376, -1, 26408, -1, 27424, -1, 27490, + -1, 27513, -1, 27571, -1, 27595, -1, 27604, + -1, 27611, -1, 27663, -1, 27668, -1, 27700, + -1, 28779, -1, 29226, -1, 29238, -1, 29243, + -1, 29247, -1, 29255, -1, 29273, -1, 29275, + -1, 29356, -1, 29572, -1, 29577, -1, 29916, + -1, 29926, -1, 29976, -1, 29983, -1, 29992, + -1, 30000, -1, 30091, -1, 30098, -1, 30326, + -1, 30333, -1, 30382, -1, 30399, -1, 30446, + -1, 30683, -1, 30690, -1, 30707, -1, 31034, + -1, 31160, -1, 31166, -1, 31348, -1, 31435, + -1, 31481, -1, 31859, -1, 31992, -1, 32566, + -1, 32593, -1, 32650, -1, 32701, -1, 32769, + -1, 32780, -1, 32786, -1, 32819, -1, 32895, + -1, 32905, -1, 33251, -1, 33258, -1, 33267, + -1, 33276, -1, 33292, -1, 33307, -1, 33311, + -1, 33390, -1, 33394, -1, 33400, -1, 34381, + -1, 34411, -1, 34880, -1, 34892, -1, 34915, + -1, 35198, -1, 35211, -1, 35282, -1, 35328, + -1, 35895, -1, 35910, -1, 35925, -1, 35960, + -1, 35997, -1, 36196, -1, 36208, -1, 36275, + -1, 36523, -1, 36554, -1, 36763, -1, 36784, + -1, 36789, -1, 37009, -1, 37193, -1, 37318, + -1, 37324, -1, 37329, -1, 38263, -1, 38272, + -1, 38428, -1, 38582, -1, 38585, -1, 38632, + -1, 38737, -1, 38750, -1, 38754, -1, 38761, + -1, 38859, -1, 38893, -1, 38899, -1, 38913, + -1, 39080, -1, 39131, -1, 39135, -1, 39318, + -1, 39321, -1, 39340, -1, 39592, -1, 39640, + -1, 39647, -1, 39717, -1, 39727, -1, 39730, + -1, 39740, -1, 39770, -1, 40165, -1, 40565, + -1, 40575, -1, 40613, -1, 40635, -1, 40643, + -1, 40653, -1, 40657, -1, 40697, -1, 40701, + -1, 40718, -1, 40723, -1, 40736, -1, 40763, + -1, 40778, -1, 40786, -1, 40845, -1, 40860, + -1, 40864, -1, 12306, -1, 21316, -1, 21317, + -1, 12363, 12441, -1, 12365, 12441, -1, 12367, + 12441, -1, 12369, 12441, -1, 12371, 12441, -1, + 12373, 12441, -1, 12375, 12441, -1, 12377, 12441, + -1, 12379, 12441, -1, 12381, 12441, -1, 12383, + 12441, -1, 12385, 12441, -1, 12388, 12441, -1, + 12390, 12441, -1, 12392, 12441, -1, 12399, 12441, + -1, 12399, 12442, -1, 12402, 12441, -1, 12402, + 12442, -1, 12405, 12441, -1, 12405, 12442, -1, + 12408, 12441, -1, 12408, 12442, -1, 12411, 12441, + -1, 12411, 12442, -1, 12358, 12441, -1, 32, + 12441, -1, 32, 12442, -1, 12445, 12441, -1, + 12424, 12426, -1, 12459, 12441, -1, 12461, 12441, + -1, 12463, 12441, -1, 12465, 12441, -1, 12467, + 12441, -1, 12469, 12441, -1, 12471, 12441, -1, + 12473, 12441, -1, 12475, 12441, -1, 12477, 12441, + -1, 12479, 12441, -1, 12481, 12441, -1, 12484, + 12441, -1, 12486, 12441, -1, 12488, 12441, -1, + 12495, 12441, -1, 12495, 12442, -1, 12498, 12441, + -1, 12498, 12442, -1, 12501, 12441, -1, 12501, + 12442, -1, 12504, 12441, -1, 12504, 12442, -1, + 12507, 12441, -1, 12507, 12442, -1, 12454, 12441, + -1, 12527, 12441, -1, 12528, 12441, -1, 12529, + 12441, -1, 12530, 12441, -1, 12541, 12441, -1, + 12467, 12488, -1, 4352, -1, 4353, -1, 4522, + -1, 4354, -1, 4524, -1, 4525, -1, 4355, + -1, 4356, -1, 4357, -1, 4528, -1, 4529, + -1, 4530, -1, 4531, -1, 4532, -1, 4533, + -1, 4378, -1, 4358, -1, 4359, -1, 4360, + -1, 4385, -1, 4361, -1, 4362, -1, 4363, + -1, 4364, -1, 4365, -1, 4366, -1, 4367, + -1, 4368, -1, 4369, -1, 4370, -1, 4449, + -1, 4450, -1, 4451, -1, 4452, -1, 4453, + -1, 4454, -1, 4455, -1, 4456, -1, 4457, + -1, 4458, -1, 4459, -1, 4460, -1, 4461, + -1, 4462, -1, 4463, -1, 4464, -1, 4465, + -1, 4466, -1, 4467, -1, 4468, -1, 4469, + -1, 4448, -1, 4372, -1, 4373, -1, 4551, + -1, 4552, -1, 4556, -1, 4558, -1, 4563, + -1, 4567, -1, 4569, -1, 4380, -1, 4573, + -1, 4575, -1, 4381, -1, 4382, -1, 4384, + -1, 4386, -1, 4387, -1, 4391, -1, 4393, + -1, 4395, -1, 4396, -1, 4397, -1, 4398, + -1, 4399, -1, 4402, -1, 4406, -1, 4416, + -1, 4423, -1, 4428, -1, 4593, -1, 4594, + -1, 4439, -1, 4440, -1, 4441, -1, 4484, + -1, 4485, -1, 4488, -1, 4497, -1, 4498, + -1, 4500, -1, 4510, -1, 4513, -1, 19977, + -1, 22235, -1, 19978, -1, 20013, -1, 19979, + -1, 30002, -1, 19993, -1, 19969, -1, 22825, + -1, 22320, -1, 40, 4352, 41, -1, 40, + 4354, 41, -1, 40, 4355, 41, -1, 40, + 4357, 41, -1, 40, 4358, 41, -1, 40, + 4359, 41, -1, 40, 4361, 41, -1, 40, + 4363, 41, -1, 40, 4364, 41, -1, 40, + 4366, 41, -1, 40, 4367, 41, -1, 40, + 4368, 41, -1, 40, 4369, 41, -1, 40, + 4370, 41, -1, 40, 4352, 4449, 41, -1, + 40, 4354, 4449, 41, -1, 40, 4355, 4449, + 41, -1, 40, 4357, 4449, 41, -1, 40, + 4358, 4449, 41, -1, 40, 4359, 4449, 41, + -1, 40, 4361, 4449, 41, -1, 40, 4363, + 4449, 41, -1, 40, 4364, 4449, 41, -1, + 40, 4366, 4449, 41, -1, 40, 4367, 4449, + 41, -1, 40, 4368, 4449, 41, -1, 40, + 4369, 4449, 41, -1, 40, 4370, 4449, 41, + -1, 40, 4364, 4462, 41, -1, 40, 4363, + 4457, 4364, 4453, 4523, 41, -1, 40, 4363, + 4457, 4370, 4462, 41, -1, 40, 19968, 41, + -1, 40, 20108, 41, -1, 40, 19977, 41, + -1, 40, 22235, 41, -1, 40, 20116, 41, + -1, 40, 20845, 41, -1, 40, 19971, 41, + -1, 40, 20843, 41, -1, 40, 20061, 41, + -1, 40, 21313, 41, -1, 40, 26376, 41, + -1, 40, 28779, 41, -1, 40, 27700, 41, + -1, 40, 26408, 41, -1, 40, 37329, 41, + -1, 40, 22303, 41, -1, 40, 26085, 41, + -1, 40, 26666, 41, -1, 40, 26377, 41, + -1, 40, 31038, 41, -1, 40, 21517, 41, + -1, 40, 29305, 41, -1, 40, 36001, 41, + -1, 40, 31069, 41, -1, 40, 21172, 41, + -1, 40, 20195, 41, -1, 40, 21628, 41, + -1, 40, 23398, 41, -1, 40, 30435, 41, + -1, 40, 20225, 41, -1, 40, 36039, 41, + -1, 40, 21332, 41, -1, 40, 31085, 41, + -1, 40, 20241, 41, -1, 40, 33258, 41, + -1, 40, 33267, 41, -1, 80, 84, 69, + -1, 50, 49, -1, 50, 50, -1, 50, + 51, -1, 50, 52, -1, 50, 53, -1, + 50, 54, -1, 50, 55, -1, 50, 56, + -1, 50, 57, -1, 51, 48, -1, 51, + 49, -1, 51, 50, -1, 51, 51, -1, + 51, 52, -1, 51, 53, -1, 4352, 4449, + -1, 4354, 4449, -1, 4355, 4449, -1, 4357, + 4449, -1, 4358, 4449, -1, 4359, 4449, -1, + 4361, 4449, -1, 4363, 4449, -1, 4364, 4449, + -1, 4366, 4449, -1, 4367, 4449, -1, 4368, + 4449, -1, 4369, 4449, -1, 4370, 4449, -1, + 4366, 4449, 4535, 4352, 4457, -1, 4364, 4462, + 4363, 4468, -1, 4363, 4462, -1, 20116, -1, + 20845, -1, 19971, -1, 20061, -1, 26666, -1, + 26377, -1, 31038, -1, 21517, -1, 29305, -1, + 36001, -1, 31069, -1, 21172, -1, 31192, -1, + 30007, -1, 36969, -1, 20778, -1, 21360, -1, + 27880, -1, 38917, -1, 20241, -1, 20889, -1, + 27491, -1, 24038, -1, 21491, -1, 21307, -1, + 23447, -1, 23398, -1, 30435, -1, 20225, -1, + 36039, -1, 21332, -1, 22812, -1, 51, 54, + -1, 51, 55, -1, 51, 56, -1, 51, + 57, -1, 52, 48, -1, 52, 49, -1, + 52, 50, -1, 52, 51, -1, 52, 52, + -1, 52, 53, -1, 52, 54, -1, 52, + 55, -1, 52, 56, -1, 52, 57, -1, + 53, 48, -1, 49, 26376, -1, 50, 26376, + -1, 51, 26376, -1, 52, 26376, -1, 53, + 26376, -1, 54, 26376, -1, 55, 26376, -1, + 56, 26376, -1, 57, 26376, -1, 49, 48, + 26376, -1, 49, 49, 26376, -1, 49, 50, + 26376, -1, 72, 103, -1, 101, 114, 103, + -1, 101, 86, -1, 76, 84, 68, -1, + 12450, -1, 12452, -1, 12454, -1, 12456, -1, + 12458, -1, 12459, -1, 12461, -1, 12463, -1, + 12465, -1, 12467, -1, 12469, -1, 12471, -1, + 12473, -1, 12475, -1, 12477, -1, 12479, -1, + 12481, -1, 12484, -1, 12486, -1, 12488, -1, + 12490, -1, 12491, -1, 12492, -1, 12493, -1, + 12494, -1, 12495, -1, 12498, -1, 12501, -1, + 12504, -1, 12507, -1, 12510, -1, 12511, -1, + 12512, -1, 12513, -1, 12514, -1, 12516, -1, + 12518, -1, 12520, -1, 12521, -1, 12522, -1, + 12523, -1, 12524, -1, 12525, -1, 12527, -1, + 12528, -1, 12529, -1, 12530, -1, 12450, 12497, + 12540, 12488, -1, 12450, 12523, 12501, 12449, -1, + 12450, 12531, 12506, 12450, -1, 12450, 12540, 12523, + -1, 12452, 12491, 12531, 12464, -1, 12452, 12531, + 12481, -1, 12454, 12457, 12531, -1, 12456, 12473, + 12463, 12540, 12489, -1, 12456, 12540, 12459, 12540, + -1, 12458, 12531, 12473, -1, 12458, 12540, 12512, + -1, 12459, 12452, 12522, -1, 12459, 12521, 12483, + 12488, -1, 12459, 12525, 12522, 12540, -1, 12460, + 12525, 12531, -1, 12460, 12531, 12510, -1, 12462, + 12460, -1, 12462, 12491, 12540, -1, 12461, 12517, + 12522, 12540, -1, 12462, 12523, 12480, 12540, -1, + 12461, 12525, -1, 12461, 12525, 12464, 12521, 12512, + -1, 12461, 12525, 12513, 12540, 12488, 12523, -1, + 12461, 12525, 12527, 12483, 12488, -1, 12464, 12521, + 12512, -1, 12464, 12521, 12512, 12488, 12531, -1, + 12463, 12523, 12476, 12452, 12525, -1, 12463, 12525, + 12540, 12493, -1, 12465, 12540, 12473, -1, 12467, + 12523, 12490, -1, 12467, 12540, 12509, -1, 12469, + 12452, 12463, 12523, -1, 12469, 12531, 12481, 12540, + 12512, -1, 12471, 12522, 12531, 12464, -1, 12475, + 12531, 12481, -1, 12475, 12531, 12488, -1, 12480, + 12540, 12473, -1, 12487, 12471, -1, 12489, 12523, + -1, 12488, 12531, -1, 12490, 12494, -1, 12494, + 12483, 12488, -1, 12495, 12452, 12484, -1, 12497, + 12540, 12475, 12531, 12488, -1, 12497, 12540, 12484, + -1, 12496, 12540, 12524, 12523, -1, 12500, 12450, + 12473, 12488, 12523, -1, 12500, 12463, 12523, -1, + 12500, 12467, -1, 12499, 12523, -1, 12501, 12449, + 12521, 12483, 12489, -1, 12501, 12451, 12540, 12488, + -1, 12502, 12483, 12471, 12455, 12523, -1, 12501, + 12521, 12531, -1, 12504, 12463, 12479, 12540, 12523, + -1, 12506, 12477, -1, 12506, 12491, 12498, -1, + 12504, 12523, 12484, -1, 12506, 12531, 12473, -1, + 12506, 12540, 12472, -1, 12505, 12540, 12479, -1, + 12509, 12452, 12531, 12488, -1, 12508, 12523, 12488, + -1, 12507, 12531, -1, 12509, 12531, 12489, -1, + 12507, 12540, 12523, -1, 12507, 12540, 12531, -1, + 12510, 12452, 12463, 12525, -1, 12510, 12452, 12523, + -1, 12510, 12483, 12495, -1, 12510, 12523, 12463, + -1, 12510, 12531, 12471, 12519, 12531, -1, 12511, + 12463, 12525, 12531, -1, 12511, 12522, -1, 12511, + 12522, 12496, 12540, 12523, -1, 12513, 12460, -1, + 12513, 12460, 12488, 12531, -1, 12513, 12540, 12488, + 12523, -1, 12516, 12540, 12489, -1, 12516, 12540, + 12523, -1, 12518, 12450, 12531, -1, 12522, 12483, + 12488, 12523, -1, 12522, 12521, -1, 12523, 12500, + 12540, -1, 12523, 12540, 12502, 12523, -1, 12524, + 12512, -1, 12524, 12531, 12488, 12466, 12531, -1, + 12527, 12483, 12488, -1, 48, 28857, -1, 49, + 28857, -1, 50, 28857, -1, 51, 28857, -1, + 52, 28857, -1, 53, 28857, -1, 54, 28857, + -1, 55, 28857, -1, 56, 28857, -1, 57, + 28857, -1, 49, 48, 28857, -1, 49, 49, + 28857, -1, 49, 50, 28857, -1, 49, 51, + 28857, -1, 49, 52, 28857, -1, 49, 53, + 28857, -1, 49, 54, 28857, -1, 49, 55, + 28857, -1, 49, 56, 28857, -1, 49, 57, + 28857, -1, 50, 48, 28857, -1, 50, 49, + 28857, -1, 50, 50, 28857, -1, 50, 51, + 28857, -1, 50, 52, 28857, -1, 104, 80, + 97, -1, 100, 97, -1, 65, 85, -1, + 98, 97, 114, -1, 111, 86, -1, 112, + 99, -1, 100, 109, -1, 100, 109, 178, + -1, 100, 109, 179, -1, 73, 85, -1, + 24179, 25104, -1, 26157, 21644, -1, 22823, 27491, + -1, 26126, 27835, -1, 26666, 24335, 20250, 31038, + -1, 112, 65, -1, 110, 65, -1, 956, + 65, -1, 109, 65, -1, 107, 65, -1, + 75, 66, -1, 77, 66, -1, 71, 66, + -1, 99, 97, 108, -1, 107, 99, 97, + 108, -1, 112, 70, -1, 110, 70, -1, + 956, 70, -1, 956, 103, -1, 109, 103, + -1, 107, 103, -1, 72, 122, -1, 107, + 72, 122, -1, 77, 72, 122, -1, 71, + 72, 122, -1, 84, 72, 122, -1, 956, + 8467, -1, 109, 8467, -1, 100, 8467, -1, + 107, 8467, -1, 102, 109, -1, 110, 109, + -1, 956, 109, -1, 109, 109, -1, 99, + 109, -1, 107, 109, -1, 109, 109, 178, + -1, 99, 109, 178, -1, 109, 178, -1, + 107, 109, 178, -1, 109, 109, 179, -1, + 99, 109, 179, -1, 109, 179, -1, 107, + 109, 179, -1, 109, 8725, 115, -1, 109, + 8725, 115, 178, -1, 80, 97, -1, 107, + 80, 97, -1, 77, 80, 97, -1, 71, + 80, 97, -1, 114, 97, 100, -1, 114, + 97, 100, 8725, 115, -1, 114, 97, 100, + 8725, 115, 178, -1, 112, 115, -1, 110, + 115, -1, 956, 115, -1, 109, 115, -1, + 112, 86, -1, 110, 86, -1, 956, 86, + -1, 109, 86, -1, 107, 86, -1, 77, + 86, -1, 112, 87, -1, 110, 87, -1, + 956, 87, -1, 109, 87, -1, 107, 87, + -1, 77, 87, -1, 107, 937, -1, 77, + 937, -1, 97, 46, 109, 46, -1, 66, + 113, -1, 99, 99, -1, 99, 100, -1, + 67, 8725, 107, 103, -1, 67, 111, 46, + -1, 100, 66, -1, 71, 121, -1, 104, + 97, -1, 72, 80, -1, 105, 110, -1, + 75, 75, -1, 75, 77, -1, 107, 116, + -1, 108, 109, -1, 108, 110, -1, 108, + 111, 103, -1, 108, 120, -1, 109, 98, + -1, 109, 105, 108, -1, 109, 111, 108, + -1, 80, 72, -1, 112, 46, 109, 46, + -1, 80, 80, 77, -1, 80, 82, -1, + 115, 114, -1, 83, 118, -1, 87, 98, + -1, 86, 8725, 109, -1, 65, 8725, 109, + -1, 49, 26085, -1, 50, 26085, -1, 51, + 26085, -1, 52, 26085, -1, 53, 26085, -1, + 54, 26085, -1, 55, 26085, -1, 56, 26085, + -1, 57, 26085, -1, 49, 48, 26085, -1, + 49, 49, 26085, -1, 49, 50, 26085, -1, + 49, 51, 26085, -1, 49, 52, 26085, -1, + 49, 53, 26085, -1, 49, 54, 26085, -1, + 49, 55, 26085, -1, 49, 56, 26085, -1, + 49, 57, 26085, -1, 50, 48, 26085, -1, + 50, 49, 26085, -1, 50, 50, 26085, -1, + 50, 51, 26085, -1, 50, 52, 26085, -1, + 50, 53, 26085, -1, 50, 54, 26085, -1, + 50, 55, 26085, -1, 50, 56, 26085, -1, + 50, 57, 26085, -1, 51, 48, 26085, -1, + 51, 49, 26085, -1, 103, 97, 108, -1, + 35912, -1, 26356, -1, 36040, -1, 28369, -1, + 20018, -1, 21477, -1, 22865, -1, 21895, -1, + 22856, -1, 25078, -1, 30313, -1, 32645, -1, + 34367, -1, 34746, -1, 35064, -1, 37007, -1, + 27138, -1, 27931, -1, 28889, -1, 29662, -1, + 33853, -1, 37226, -1, 39409, -1, 20098, -1, + 21365, -1, 27396, -1, 29211, -1, 34349, -1, + 40478, -1, 23888, -1, 28651, -1, 34253, -1, + 35172, -1, 25289, -1, 33240, -1, 34847, -1, + 24266, -1, 26391, -1, 28010, -1, 29436, -1, + 37070, -1, 20358, -1, 20919, -1, 21214, -1, + 25796, -1, 27347, -1, 29200, -1, 30439, -1, + 34310, -1, 34396, -1, 36335, -1, 38706, -1, + 39791, -1, 40442, -1, 30860, -1, 31103, -1, + 32160, -1, 33737, -1, 37636, -1, 35542, -1, + 22751, -1, 24324, -1, 31840, -1, 32894, -1, + 29282, -1, 30922, -1, 36034, -1, 38647, -1, + 22744, -1, 23650, -1, 27155, -1, 28122, -1, + 28431, -1, 32047, -1, 32311, -1, 38475, -1, + 21202, -1, 32907, -1, 20956, -1, 20940, -1, + 31260, -1, 32190, -1, 33777, -1, 38517, -1, + 35712, -1, 25295, -1, 35582, -1, 20025, -1, + 23527, -1, 24594, -1, 29575, -1, 30064, -1, + 21271, -1, 30971, -1, 20415, -1, 24489, -1, + 19981, -1, 27852, -1, 25976, -1, 32034, -1, + 21443, -1, 22622, -1, 30465, -1, 33865, -1, + 35498, -1, 27578, -1, 27784, -1, 25342, -1, + 33509, -1, 25504, -1, 30053, -1, 20142, -1, + 20841, -1, 20937, -1, 26753, -1, 31975, -1, + 33391, -1, 35538, -1, 37327, -1, 21237, -1, + 21570, -1, 24300, -1, 26053, -1, 28670, -1, + 31018, -1, 38317, -1, 39530, -1, 40599, -1, + 40654, -1, 26310, -1, 27511, -1, 36706, -1, + 24180, -1, 24976, -1, 25088, -1, 25754, -1, + 28451, -1, 29001, -1, 29833, -1, 31178, -1, + 32244, -1, 32879, -1, 36646, -1, 34030, -1, + 36899, -1, 37706, -1, 21015, -1, 21155, -1, + 21693, -1, 28872, -1, 35010, -1, 24265, -1, + 24565, -1, 25467, -1, 27566, -1, 31806, -1, + 29557, -1, 20196, -1, 22265, -1, 23994, -1, + 24604, -1, 29618, -1, 29801, -1, 32666, -1, + 32838, -1, 37428, -1, 38646, -1, 38728, -1, + 38936, -1, 20363, -1, 31150, -1, 37300, -1, + 38584, -1, 24801, -1, 20102, -1, 20698, -1, + 23534, -1, 23615, -1, 26009, -1, 29134, -1, + 30274, -1, 34044, -1, 36988, -1, 26248, -1, + 38446, -1, 21129, -1, 26491, -1, 26611, -1, + 27969, -1, 28316, -1, 29705, -1, 30041, -1, + 30827, -1, 32016, -1, 39006, -1, 25134, -1, + 38520, -1, 20523, -1, 23833, -1, 28138, -1, + 36650, -1, 24459, -1, 24900, -1, 26647, -1, + 38534, -1, 21033, -1, 21519, -1, 23653, -1, + 26131, -1, 26446, -1, 26792, -1, 27877, -1, + 29702, -1, 30178, -1, 32633, -1, 35023, -1, + 35041, -1, 38626, -1, 21311, -1, 28346, -1, + 21533, -1, 29136, -1, 29848, -1, 34298, -1, + 38563, -1, 40023, -1, 40607, -1, 26519, -1, + 28107, -1, 33256, -1, 31520, -1, 31890, -1, + 29376, -1, 28825, -1, 35672, -1, 20160, -1, + 33590, -1, 21050, -1, 20999, -1, 24230, -1, + 25299, -1, 31958, -1, 23429, -1, 27934, -1, + 26292, -1, 36667, -1, 38477, -1, 24275, -1, + 20800, -1, 21952, -1, 22618, -1, 26228, -1, + 20958, -1, 29482, -1, 30410, -1, 31036, -1, + 31070, -1, 31077, -1, 31119, -1, 38742, -1, + 31934, -1, 34322, -1, 35576, -1, 36920, -1, + 37117, -1, 39151, -1, 39164, -1, 39208, -1, + 40372, -1, 20398, -1, 20711, -1, 20813, -1, + 21193, -1, 21220, -1, 21329, -1, 21917, -1, + 22022, -1, 22120, -1, 22592, -1, 22696, -1, + 23652, -1, 24724, -1, 24936, -1, 24974, -1, + 25074, -1, 25935, -1, 26082, -1, 26257, -1, + 26757, -1, 28023, -1, 28186, -1, 28450, -1, + 29038, -1, 29227, -1, 29730, -1, 30865, -1, + 31049, -1, 31048, -1, 31056, -1, 31062, -1, + 31117, -1, 31118, -1, 31296, -1, 31361, -1, + 31680, -1, 32265, -1, 32321, -1, 32626, -1, + 32773, -1, 33261, -1, 33401, -1, 33879, -1, + 35088, -1, 35222, -1, 35585, -1, 35641, -1, + 36051, -1, 36104, -1, 36790, -1, 38627, -1, + 38911, -1, 38971, -1, 20006, -1, 20917, -1, + 20840, -1, 20352, -1, 20805, -1, 20864, -1, + 21191, -1, 21242, -1, 21845, -1, 21913, -1, + 21986, -1, 22707, -1, 22852, -1, 22868, -1, + 23138, -1, 23336, -1, 24274, -1, 24281, -1, + 24425, -1, 24493, -1, 24792, -1, 24910, -1, + 24840, -1, 24928, -1, 25140, -1, 25540, -1, + 25628, -1, 25682, -1, 25942, -1, 26395, -1, + 26454, -1, 28379, -1, 28363, -1, 28702, -1, + 30631, -1, 29237, -1, 29359, -1, 29809, -1, + 29958, -1, 30011, -1, 30237, -1, 30239, -1, + 30427, -1, 30452, -1, 30538, -1, 30528, -1, + 30924, -1, 31409, -1, 31867, -1, 32091, -1, + 32574, -1, 33618, -1, 33775, -1, 34681, -1, + 35137, -1, 35206, -1, 35519, -1, 35531, -1, + 35565, -1, 35722, -1, 36664, -1, 36978, -1, + 37273, -1, 37494, -1, 38524, -1, 38875, -1, + 38923, -1, 39698, -1, 141386, -1, 141380, -1, + 144341, -1, 15261, -1, 16408, -1, 16441, -1, + 152137, -1, 154832, -1, 163539, -1, 40771, -1, + 40846, -1, 102, 102, -1, 102, 105, -1, + 102, 108, -1, 102, 102, 105, -1, 102, + 102, 108, -1, 383, 116, -1, 115, 116, + -1, 1396, 1398, -1, 1396, 1381, -1, 1396, + 1387, -1, 1406, 1398, -1, 1396, 1389, -1, + 1497, 1460, -1, 1522, 1463, -1, 1506, -1, + 1492, -1, 1499, -1, 1500, -1, 1501, -1, + 1512, -1, 1514, -1, 1513, 1473, -1, 1513, + 1474, -1, 64329, 1473, -1, 64329, 1474, -1, + 1488, 1463, -1, 1488, 1464, -1, 1488, 1468, + -1, 1489, 1468, -1, 1490, 1468, -1, 1491, + 1468, -1, 1492, 1468, -1, 1493, 1468, -1, + 1494, 1468, -1, 1496, 1468, -1, 1497, 1468, + -1, 1498, 1468, -1, 1499, 1468, -1, 1500, + 1468, -1, 1502, 1468, -1, 1504, 1468, -1, + 1505, 1468, -1, 1507, 1468, -1, 1508, 1468, + -1, 1510, 1468, -1, 1511, 1468, -1, 1512, + 1468, -1, 1513, 1468, -1, 1514, 1468, -1, + 1493, 1465, -1, 1489, 1471, -1, 1499, 1471, + -1, 1508, 1471, -1, 1488, 1500, -1, 1649, + -1, 1659, -1, 1662, -1, 1664, -1, 1658, + -1, 1663, -1, 1657, -1, 1700, -1, 1702, + -1, 1668, -1, 1667, -1, 1670, -1, 1671, + -1, 1677, -1, 1676, -1, 1678, -1, 1672, + -1, 1688, -1, 1681, -1, 1705, -1, 1711, + -1, 1715, -1, 1713, -1, 1722, -1, 1723, + -1, 1728, -1, 1729, -1, 1726, -1, 1746, + -1, 1747, -1, 1709, -1, 1735, -1, 1734, + -1, 1736, -1, 1655, -1, 1739, -1, 1733, + -1, 1737, -1, 1744, -1, 1609, -1, 1574, + 1575, -1, 1574, 1749, -1, 1574, 1608, -1, + 1574, 1735, -1, 1574, 1734, -1, 1574, 1736, + -1, 1574, 1744, -1, 1574, 1609, -1, 1740, + -1, 1574, 1580, -1, 1574, 1581, -1, 1574, + 1605, -1, 1574, 1610, -1, 1576, 1580, -1, + 1576, 1581, -1, 1576, 1582, -1, 1576, 1605, + -1, 1576, 1609, -1, 1576, 1610, -1, 1578, + 1580, -1, 1578, 1581, -1, 1578, 1582, -1, + 1578, 1605, -1, 1578, 1609, -1, 1578, 1610, + -1, 1579, 1580, -1, 1579, 1605, -1, 1579, + 1609, -1, 1579, 1610, -1, 1580, 1581, -1, + 1580, 1605, -1, 1581, 1580, -1, 1581, 1605, + -1, 1582, 1580, -1, 1582, 1581, -1, 1582, + 1605, -1, 1587, 1580, -1, 1587, 1581, -1, + 1587, 1582, -1, 1587, 1605, -1, 1589, 1581, + -1, 1589, 1605, -1, 1590, 1580, -1, 1590, + 1581, -1, 1590, 1582, -1, 1590, 1605, -1, + 1591, 1581, -1, 1591, 1605, -1, 1592, 1605, + -1, 1593, 1580, -1, 1593, 1605, -1, 1594, + 1580, -1, 1594, 1605, -1, 1601, 1580, -1, + 1601, 1581, -1, 1601, 1582, -1, 1601, 1605, + -1, 1601, 1609, -1, 1601, 1610, -1, 1602, + 1581, -1, 1602, 1605, -1, 1602, 1609, -1, + 1602, 1610, -1, 1603, 1575, -1, 1603, 1580, + -1, 1603, 1581, -1, 1603, 1582, -1, 1603, + 1604, -1, 1603, 1605, -1, 1603, 1609, -1, + 1603, 1610, -1, 1604, 1580, -1, 1604, 1581, + -1, 1604, 1582, -1, 1604, 1605, -1, 1604, + 1609, -1, 1604, 1610, -1, 1605, 1580, -1, + 1605, 1581, -1, 1605, 1582, -1, 1605, 1605, + -1, 1605, 1609, -1, 1605, 1610, -1, 1606, + 1580, -1, 1606, 1581, -1, 1606, 1582, -1, + 1606, 1605, -1, 1606, 1609, -1, 1606, 1610, + -1, 1607, 1580, -1, 1607, 1605, -1, 1607, + 1609, -1, 1607, 1610, -1, 1610, 1580, -1, + 1610, 1581, -1, 1610, 1582, -1, 1610, 1605, + -1, 1610, 1609, -1, 1610, 1610, -1, 1584, + 1648, -1, 1585, 1648, -1, 1609, 1648, -1, + 32, 1612, 1617, -1, 32, 1613, 1617, -1, + 32, 1614, 1617, -1, 32, 1615, 1617, -1, + 32, 1616, 1617, -1, 32, 1617, 1648, -1, + 1574, 1585, -1, 1574, 1586, -1, 1574, 1606, + -1, 1576, 1585, -1, 1576, 1586, -1, 1576, + 1606, -1, 1578, 1585, -1, 1578, 1586, -1, + 1578, 1606, -1, 1579, 1585, -1, 1579, 1586, + -1, 1579, 1606, -1, 1605, 1575, -1, 1606, + 1585, -1, 1606, 1586, -1, 1606, 1606, -1, + 1610, 1585, -1, 1610, 1586, -1, 1610, 1606, + -1, 1574, 1582, -1, 1574, 1607, -1, 1576, + 1607, -1, 1578, 1607, -1, 1589, 1582, -1, + 1604, 1607, -1, 1606, 1607, -1, 1607, 1648, + -1, 1610, 1607, -1, 1579, 1607, -1, 1587, + 1607, -1, 1588, 1605, -1, 1588, 1607, -1, + 1600, 1614, 1617, -1, 1600, 1615, 1617, -1, + 1600, 1616, 1617, -1, 1591, 1609, -1, 1591, + 1610, -1, 1593, 1609, -1, 1593, 1610, -1, + 1594, 1609, -1, 1594, 1610, -1, 1587, 1609, + -1, 1587, 1610, -1, 1588, 1609, -1, 1588, + 1610, -1, 1581, 1609, -1, 1581, 1610, -1, + 1580, 1609, -1, 1580, 1610, -1, 1582, 1609, + -1, 1582, 1610, -1, 1589, 1609, -1, 1589, + 1610, -1, 1590, 1609, -1, 1590, 1610, -1, + 1588, 1580, -1, 1588, 1581, -1, 1588, 1582, + -1, 1588, 1585, -1, 1587, 1585, -1, 1589, + 1585, -1, 1590, 1585, -1, 1575, 1611, -1, + 1578, 1580, 1605, -1, 1578, 1581, 1580, -1, + 1578, 1581, 1605, -1, 1578, 1582, 1605, -1, + 1578, 1605, 1580, -1, 1578, 1605, 1581, -1, + 1578, 1605, 1582, -1, 1580, 1605, 1581, -1, + 1581, 1605, 1610, -1, 1581, 1605, 1609, -1, + 1587, 1581, 1580, -1, 1587, 1580, 1581, -1, + 1587, 1580, 1609, -1, 1587, 1605, 1581, -1, + 1587, 1605, 1580, -1, 1587, 1605, 1605, -1, + 1589, 1581, 1581, -1, 1589, 1605, 1605, -1, + 1588, 1581, 1605, -1, 1588, 1580, 1610, -1, + 1588, 1605, 1582, -1, 1588, 1605, 1605, -1, + 1590, 1581, 1609, -1, 1590, 1582, 1605, -1, + 1591, 1605, 1581, -1, 1591, 1605, 1605, -1, + 1591, 1605, 1610, -1, 1593, 1580, 1605, -1, + 1593, 1605, 1605, -1, 1593, 1605, 1609, -1, + 1594, 1605, 1605, -1, 1594, 1605, 1610, -1, + 1594, 1605, 1609, -1, 1601, 1582, 1605, -1, + 1602, 1605, 1581, -1, 1602, 1605, 1605, -1, + 1604, 1581, 1605, -1, 1604, 1581, 1610, -1, + 1604, 1581, 1609, -1, 1604, 1580, 1580, -1, + 1604, 1582, 1605, -1, 1604, 1605, 1581, -1, + 1605, 1581, 1580, -1, 1605, 1581, 1605, -1, + 1605, 1581, 1610, -1, 1605, 1580, 1581, -1, + 1605, 1580, 1605, -1, 1605, 1582, 1580, -1, + 1605, 1582, 1605, -1, 1605, 1580, 1582, -1, + 1607, 1605, 1580, -1, 1607, 1605, 1605, -1, + 1606, 1581, 1605, -1, 1606, 1581, 1609, -1, + 1606, 1580, 1605, -1, 1606, 1580, 1609, -1, + 1606, 1605, 1610, -1, 1606, 1605, 1609, -1, + 1610, 1605, 1605, -1, 1576, 1582, 1610, -1, + 1578, 1580, 1610, -1, 1578, 1580, 1609, -1, + 1578, 1582, 1610, -1, 1578, 1582, 1609, -1, + 1578, 1605, 1610, -1, 1578, 1605, 1609, -1, + 1580, 1605, 1610, -1, 1580, 1581, 1609, -1, + 1580, 1605, 1609, -1, 1587, 1582, 1609, -1, + 1589, 1581, 1610, -1, 1588, 1581, 1610, -1, + 1590, 1581, 1610, -1, 1604, 1580, 1610, -1, + 1604, 1605, 1610, -1, 1610, 1581, 1610, -1, + 1610, 1580, 1610, -1, 1610, 1605, 1610, -1, + 1605, 1605, 1610, -1, 1602, 1605, 1610, -1, + 1606, 1581, 1610, -1, 1593, 1605, 1610, -1, + 1603, 1605, 1610, -1, 1606, 1580, 1581, -1, + 1605, 1582, 1610, -1, 1604, 1580, 1605, -1, + 1603, 1605, 1605, -1, 1580, 1581, 1610, -1, + 1581, 1580, 1610, -1, 1605, 1580, 1610, -1, + 1601, 1605, 1610, -1, 1576, 1581, 1610, -1, + 1587, 1582, 1610, -1, 1606, 1580, 1610, -1, + 1589, 1604, 1746, -1, 1602, 1604, 1746, -1, + 1575, 1604, 1604, 1607, -1, 1575, 1603, 1576, + 1585, -1, 1605, 1581, 1605, 1583, -1, 1589, + 1604, 1593, 1605, -1, 1585, 1587, 1608, 1604, + -1, 1593, 1604, 1610, 1607, -1, 1608, 1587, + 1604, 1605, -1, 1589, 1604, 1609, -1, 1589, + 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, + 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, + 1605, -1, 1580, 1604, 32, 1580, 1604, 1575, + 1604, 1607, -1, 1585, 1740, 1575, 1604, -1, + 44, -1, 12289, -1, 12290, -1, 58, -1, + 33, -1, 63, -1, 12310, -1, 12311, -1, + 8230, -1, 8229, -1, 8212, -1, 8211, -1, + 95, -1, 123, -1, 125, -1, 12308, -1, + 12309, -1, 12304, -1, 12305, -1, 12298, -1, + 12299, -1, 12300, -1, 12301, -1, 12302, -1, + 12303, -1, 91, -1, 93, -1, 8254, -1, + 35, -1, 38, -1, 42, -1, 45, -1, + 60, -1, 62, -1, 92, -1, 36, -1, + 37, -1, 64, -1, 32, 1611, -1, 1600, + 1611, -1, 32, 1612, -1, 32, 1613, -1, + 32, 1614, -1, 1600, 1614, -1, 32, 1615, + -1, 1600, 1615, -1, 32, 1616, -1, 1600, + 1616, -1, 32, 1617, -1, 1600, 1617, -1, + 32, 1618, -1, 1600, 1618, -1, 1569, -1, + 1570, -1, 1571, -1, 1572, -1, 1573, -1, + 1574, -1, 1575, -1, 1576, -1, 1577, -1, + 1578, -1, 1579, -1, 1580, -1, 1581, -1, + 1582, -1, 1583, -1, 1584, -1, 1585, -1, + 1586, -1, 1587, -1, 1588, -1, 1589, -1, + 1590, -1, 1591, -1, 1592, -1, 1593, -1, + 1594, -1, 1601, -1, 1602, -1, 1603, -1, + 1604, -1, 1605, -1, 1606, -1, 1607, -1, + 1608, -1, 1610, -1, 1604, 1570, -1, 1604, + 1571, -1, 1604, 1573, -1, 1604, 1575, -1, + 34, -1, 39, -1, 47, -1, 65345, -1, + 65346, -1, 65347, -1, 65348, -1, 65349, -1, + 65350, -1, 65351, -1, 65352, -1, 65353, -1, + 65354, -1, 65355, -1, 65356, -1, 65357, -1, + 65358, -1, 65359, -1, 65360, -1, 65361, -1, + 65362, -1, 65363, -1, 65364, -1, 65365, -1, + 65366, -1, 65367, -1, 65368, -1, 65369, -1, + 65370, -1, 94, -1, 124, -1, 126, -1, + 10629, -1, 10630, -1, 12539, -1, 12449, -1, + 12451, -1, 12453, -1, 12455, -1, 12457, -1, + 12515, -1, 12517, -1, 12519, -1, 12483, -1, + 12540, -1, 12531, -1, 12441, -1, 12442, -1, + 12644, -1, 12593, -1, 12594, -1, 12595, -1, + 12596, -1, 12597, -1, 12598, -1, 12599, -1, + 12600, -1, 12601, -1, 12602, -1, 12603, -1, + 12604, -1, 12605, -1, 12606, -1, 12607, -1, + 12608, -1, 12609, -1, 12610, -1, 12611, -1, + 12612, -1, 12613, -1, 12614, -1, 12615, -1, + 12616, -1, 12617, -1, 12618, -1, 12619, -1, + 12620, -1, 12621, -1, 12622, -1, 12623, -1, + 12624, -1, 12625, -1, 12626, -1, 12627, -1, + 12628, -1, 12629, -1, 12630, -1, 12631, -1, + 12632, -1, 12633, -1, 12634, -1, 12635, -1, + 12636, -1, 12637, -1, 12638, -1, 12639, -1, + 12640, -1, 12641, -1, 12642, -1, 12643, -1, + 162, -1, 163, -1, 172, -1, 175, -1, + 166, -1, 165, -1, 8361, -1, 9474, -1, + 8592, -1, 8593, -1, 8594, -1, 8595, -1, + 9632, -1, 9675, -1, 66600, -1, 66601, -1, + 66602, -1, 66603, -1, 66604, -1, 66605, -1, + 66606, -1, 66607, -1, 66608, -1, 66609, -1, + 66610, -1, 66611, -1, 66612, -1, 66613, -1, + 66614, -1, 66615, -1, 66616, -1, 66617, -1, + 66618, -1, 66619, -1, 66620, -1, 66621, -1, + 66622, -1, 66623, -1, 66624, -1, 66625, -1, + 66626, -1, 66627, -1, 66628, -1, 66629, -1, + 66630, -1, 66631, -1, 66632, -1, 66633, -1, + 66634, -1, 66635, -1, 66636, -1, 66637, -1, + 66638, -1, 66639, -1, 119127, 119141, -1, 119128, + 119141, -1, 119135, 119150, -1, 119135, 119151, -1, + 119135, 119152, -1, 119135, 119153, -1, 119135, 119154, + -1, 119225, 119141, -1, 119226, 119141, -1, 119227, + 119150, -1, 119228, 119150, -1, 119227, 119151, -1, + 119228, 119151, -1, 305, -1, 567, -1, 913, + -1, 914, -1, 916, -1, 917, -1, 918, + -1, 919, -1, 921, -1, 922, -1, 923, + -1, 924, -1, 925, -1, 926, -1, 927, + -1, 929, -1, 1012, -1, 932, -1, 934, + -1, 935, -1, 936, -1, 8711, -1, 8706, + -1, 1013, -1, 977, -1, 1008, -1, 981, + -1, 1009, -1, 982, -1, 988, -1, 20029, + -1, 20024, -1, 20033, -1, 131362, -1, 20320, + -1, 20411, -1, 20482, -1, 20602, -1, 20633, + -1, 20687, -1, 13470, -1, 132666, -1, 20820, + -1, 20836, -1, 20855, -1, 132380, -1, 13497, + -1, 20839, -1, 20877, -1, 132427, -1, 20887, + -1, 20900, -1, 20172, -1, 20908, -1, 168415, + -1, 20995, -1, 13535, -1, 21051, -1, 21062, + -1, 21106, -1, 21111, -1, 13589, -1, 21253, + -1, 21254, -1, 21321, -1, 21338, -1, 21363, + -1, 21373, -1, 21375, -1, 133676, -1, 28784, + -1, 21450, -1, 21471, -1, 133987, -1, 21483, + -1, 21489, -1, 21510, -1, 21662, -1, 21560, + -1, 21576, -1, 21608, -1, 21666, -1, 21750, + -1, 21776, -1, 21843, -1, 21859, -1, 21892, + -1, 21931, -1, 21939, -1, 21954, -1, 22294, + -1, 22295, -1, 22097, -1, 22132, -1, 22766, + -1, 22478, -1, 22516, -1, 22541, -1, 22411, + -1, 22578, -1, 22577, -1, 22700, -1, 136420, + -1, 22770, -1, 22775, -1, 22790, -1, 22810, + -1, 22818, -1, 22882, -1, 136872, -1, 136938, + -1, 23020, -1, 23067, -1, 23079, -1, 23000, + -1, 23142, -1, 14062, -1, 14076, -1, 23304, + -1, 23358, -1, 137672, -1, 23491, -1, 23512, + -1, 23539, -1, 138008, -1, 23551, -1, 23558, + -1, 24403, -1, 14209, -1, 23648, -1, 23744, + -1, 23693, -1, 138724, -1, 23875, -1, 138726, + -1, 23918, -1, 23915, -1, 23932, -1, 24033, + -1, 24034, -1, 14383, -1, 24061, -1, 24104, + -1, 24125, -1, 24169, -1, 14434, -1, 139651, + -1, 14460, -1, 24240, -1, 24243, -1, 24246, + -1, 172946, -1, 140081, -1, 33281, -1, 24354, + -1, 14535, -1, 144056, -1, 156122, -1, 24418, + -1, 24427, -1, 14563, -1, 24474, -1, 24525, + -1, 24535, -1, 24569, -1, 24705, -1, 14650, + -1, 14620, -1, 141012, -1, 24775, -1, 24904, + -1, 24908, -1, 24954, -1, 25010, -1, 24996, + -1, 25007, -1, 25054, -1, 25104, -1, 25115, + -1, 25181, -1, 25265, -1, 25300, -1, 25424, + -1, 142092, -1, 25405, -1, 25340, -1, 25448, + -1, 25475, -1, 25572, -1, 142321, -1, 25634, + -1, 25541, -1, 25513, -1, 14894, -1, 25705, + -1, 25726, -1, 25757, -1, 25719, -1, 14956, + -1, 25964, -1, 143370, -1, 26083, -1, 26360, + -1, 26185, -1, 15129, -1, 15112, -1, 15076, + -1, 20882, -1, 20885, -1, 26368, -1, 26268, + -1, 32941, -1, 17369, -1, 26401, -1, 26462, + -1, 26451, -1, 144323, -1, 15177, -1, 26618, + -1, 26501, -1, 26706, -1, 144493, -1, 26766, + -1, 26655, -1, 26900, -1, 26946, -1, 27043, + -1, 27114, -1, 27304, -1, 145059, -1, 27355, + -1, 15384, -1, 27425, -1, 145575, -1, 27476, + -1, 15438, -1, 27506, -1, 27551, -1, 27579, + -1, 146061, -1, 138507, -1, 146170, -1, 27726, + -1, 146620, -1, 27839, -1, 27853, -1, 27751, + -1, 27926, -1, 27966, -1, 28009, -1, 28024, + -1, 28037, -1, 146718, -1, 27956, -1, 28207, + -1, 28270, -1, 15667, -1, 28359, -1, 147153, + -1, 28153, -1, 28526, -1, 147294, -1, 147342, + -1, 28614, -1, 28729, -1, 28699, -1, 15766, + -1, 28746, -1, 28797, -1, 28791, -1, 28845, + -1, 132389, -1, 28997, -1, 148067, -1, 29084, + -1, 148395, -1, 29224, -1, 29264, -1, 149000, + -1, 29312, -1, 29333, -1, 149301, -1, 149524, + -1, 29562, -1, 29579, -1, 16044, -1, 29605, + -1, 16056, -1, 29767, -1, 29788, -1, 29829, + -1, 29898, -1, 16155, -1, 29988, -1, 150582, + -1, 30014, -1, 150674, -1, 139679, -1, 30224, + -1, 151457, -1, 151480, -1, 151620, -1, 16380, + -1, 16392, -1, 151795, -1, 151794, -1, 151833, + -1, 151859, -1, 30494, -1, 30495, -1, 30603, + -1, 16454, -1, 16534, -1, 152605, -1, 30798, + -1, 16611, -1, 153126, -1, 153242, -1, 153285, + -1, 31211, -1, 16687, -1, 31306, -1, 31311, + -1, 153980, -1, 154279, -1, 31470, -1, 16898, + -1, 154539, -1, 31686, -1, 31689, -1, 16935, + -1, 154752, -1, 31954, -1, 17056, -1, 31976, + -1, 31971, -1, 32000, -1, 155526, -1, 32099, + -1, 17153, -1, 32199, -1, 32258, -1, 32325, + -1, 17204, -1, 156200, -1, 156231, -1, 17241, + -1, 156377, -1, 32634, -1, 156478, -1, 32661, + -1, 32762, -1, 156890, -1, 156963, -1, 32864, + -1, 157096, -1, 32880, -1, 144223, -1, 17365, + -1, 32946, -1, 33027, -1, 17419, -1, 33086, + -1, 23221, -1, 157607, -1, 157621, -1, 144275, + -1, 144284, -1, 33284, -1, 36766, -1, 17515, + -1, 33425, -1, 33419, -1, 33437, -1, 21171, + -1, 33457, -1, 33459, -1, 33469, -1, 33510, + -1, 158524, -1, 33565, -1, 33635, -1, 33709, + -1, 33571, -1, 33725, -1, 33767, -1, 33619, + -1, 33738, -1, 33740, -1, 33756, -1, 158774, + -1, 159083, -1, 158933, -1, 17707, -1, 34033, + -1, 34035, -1, 34070, -1, 160714, -1, 34148, + -1, 159532, -1, 17757, -1, 17761, -1, 159665, + -1, 159954, -1, 17771, -1, 34384, -1, 34407, + -1, 34409, -1, 34473, -1, 34440, -1, 34574, + -1, 34530, -1, 34600, -1, 34667, -1, 34694, + -1, 17879, -1, 34785, -1, 34817, -1, 17913, + -1, 34912, -1, 161383, -1, 35031, -1, 35038, + -1, 17973, -1, 35066, -1, 13499, -1, 161966, + -1, 162150, -1, 18110, -1, 18119, -1, 35488, + -1, 162984, -1, 36011, -1, 36033, -1, 36123, + -1, 36215, -1, 163631, -1, 133124, -1, 36299, + -1, 36284, -1, 36336, -1, 133342, -1, 36564, + -1, 165330, -1, 165357, -1, 37012, -1, 37105, + -1, 37137, -1, 165678, -1, 37147, -1, 37432, + -1, 37591, -1, 37592, -1, 37500, -1, 37881, + -1, 37909, -1, 166906, -1, 38283, -1, 18837, + -1, 38327, -1, 167287, -1, 18918, -1, 38595, + -1, 23986, -1, 38691, -1, 168261, -1, 168474, + -1, 19054, -1, 19062, -1, 38880, -1, 168970, + -1, 19122, -1, 169110, -1, 38953, -1, 169398, + -1, 39138, -1, 19251, -1, 39209, -1, 39335, + -1, 39362, -1, 39422, -1, 19406, -1, 170800, + -1, 40000, -1, 40189, -1, 19662, -1, 19693, + -1, 40295, -1, 172238, -1, 19704, -1, 172293, + -1, 172558, -1, 172689, -1, 19798, -1, 40702, + -1, 40709, -1, 40719, -1, 40726, -1, 173568, + -1, }; + +const uint16_t utf8proc_stage1table[] = { + 0, 256, 512, 768, 1024, 1280, 1536, + 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, + 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, + 5888, 6144, 6400, 6656, 6912, 2048, 7168, 7424, + 7680, 7936, 8192, 8448, 8704, 8960, 9216, 9472, + 9728, 9984, 10240, 10496, 10752, 11008, 11264, 11520, + 11776, 12032, 12288, 12544, 12800, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 13056, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 13312, 13568, 5376, 5376, 5376, 13824, 2048, 2048, + 14080, 14336, 2048, 2048, 2048, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 14592, 14848, 14848, 14848, 14848, 14848, 14848, 14848, + 14848, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15360, 15616, 15872, 16128, 16384, 16640, + 16896, 17152, 17408, 2048, 17664, 17920, 2048, 2048, + 2048, 18176, 18432, 18688, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 5376, 5376, 5376, 18944, 19200, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 19456, 19712, 19968, 20224, 20480, 20736, 20992, + 21248, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 5376, + 5376, 5376, 5376, 5376, 5376, 5376, 5376, 21504, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 21760, 22016, 22272, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 22528, 22784, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 23040, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 15104, 15104, 15104, 15104, 15104, 15104, 15104, 15104, + 23040, }; + +const uint16_t utf8proc_stage2table[] = { + 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 2, 4, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 5, 5, 5, + 6, 7, 8, 8, 9, 10, 9, 8, + 8, 11, 12, 8, 13, 14, 15, 14, + 14, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 14, 8, 17, 18, 19, + 8, 8, 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, 11, 8, 12, 46, + 47, 46, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 11, 74, 12, 74, + 1, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 75, 8, 10, 10, 10, 10, 76, + 76, 77, 76, 78, 79, 74, 80, 76, + 81, 82, 83, 84, 85, 86, 87, 76, + 8, 88, 89, 90, 91, 92, 93, 94, + 8, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, + 74, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, + 74, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 213, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 213, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 213, 213, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 213, 339, 340, 341, 213, + 342, 339, 339, 339, 339, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 213, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 213, 213, 213, + 213, 213, 213, 454, 455, 456, 457, 458, + 213, 213, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, + 473, 213, 213, 213, 474, 475, 213, 476, + 477, 213, 478, 213, 479, 213, 213, 213, + 213, 480, 213, 213, 481, 213, 213, 213, + 213, 482, 483, 213, 484, 213, 213, 213, + 485, 213, 213, 486, 213, 213, 487, 213, + 213, 213, 213, 213, 213, 213, 488, 213, + 213, 489, 213, 213, 490, 213, 213, 213, + 213, 491, 492, 493, 494, 495, 213, 213, + 213, 213, 213, 496, 213, 339, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 506, 507, 507, 507, 507, + 507, 507, 507, 46, 46, 46, 46, 506, + 506, 506, 506, 506, 506, 506, 506, 506, + 506, 507, 507, 46, 46, 46, 46, 46, + 46, 508, 509, 510, 511, 512, 513, 46, + 46, 514, 515, 516, 517, 518, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 507, + 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, + 46, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 524, 524, + 532, 524, 533, 524, 534, 535, 536, 537, + 537, 537, 537, 536, 538, 537, 537, 537, + 537, 537, 539, 539, 540, 541, 542, 543, + 544, 545, 537, 537, 537, 537, 546, 547, + 537, 548, 549, 537, 537, 550, 550, 550, + 550, 551, 537, 537, 537, 537, 524, 524, + 524, 552, 553, 554, 555, 556, 557, 524, + 537, 537, 537, 524, 524, 524, 537, 537, + 558, 524, 524, 524, 537, 537, 537, 537, + 524, 536, 537, 537, 524, 559, 560, 560, + 559, 560, 560, 559, 524, 524, 524, 524, + 524, 524, 524, 524, 524, 524, 524, 524, + 524, 0, 0, 0, 0, 561, 46, 0, + 0, 0, 0, 562, 563, 564, 565, 566, + 0, 0, 0, 0, 0, 86, 567, 568, + 569, 570, 571, 572, 0, 573, 0, 574, + 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 0, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, + 0, 638, 639, 640, 641, 642, 643, 644, + 213, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 213, 672, 673, 74, + 674, 675, 676, 677, 678, 213, 679, 680, + 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, + 769, 770, 771, 772, 773, 774, 775, 776, + 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 789, 790, 791, 792, + 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 807, 808, + 809, 810, 811, 812, 524, 524, 524, 524, + 0, 813, 813, 814, 815, 816, 817, 818, + 819, 820, 821, 822, 823, 824, 825, 826, + 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 877, 878, 879, 880, 881, 882, + 883, 884, 885, 886, 887, 888, 889, 890, + 891, 892, 893, 894, 895, 896, 897, 898, + 899, 900, 901, 902, 903, 904, 905, 906, + 907, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 936, 937, 938, + 939, 940, 941, 942, 943, 944, 945, 946, + 947, 948, 949, 950, 951, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, + 966, 967, 968, 969, 970, 971, 972, 973, + 974, 975, 976, 977, 978, 979, 980, 981, + 982, 983, 984, 985, 986, 987, 988, 989, + 0, 0, 507, 990, 990, 990, 990, 990, + 990, 0, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, + 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, + 1029, 0, 990, 1030, 0, 0, 0, 0, + 0, 0, 537, 524, 524, 524, 524, 537, + 524, 524, 524, 1031, 537, 524, 524, 524, + 524, 524, 524, 537, 537, 537, 537, 537, + 537, 524, 524, 537, 524, 524, 1031, 1032, + 524, 1033, 1034, 1035, 1036, 1037, 1038, 1039, + 1040, 1041, 1042, 1042, 1043, 1044, 1045, 1046, + 1047, 1046, 1048, 1049, 1046, 524, 537, 1046, + 1041, 0, 0, 0, 0, 0, 0, 0, + 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 0, 0, 0, 0, + 0, 1050, 1050, 1050, 1046, 1046, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1051, 1051, 1051, 1051, 0, 0, 0, + 0, 0, 0, 0, 1052, 14, 1053, 76, + 76, 524, 524, 524, 524, 524, 524, 0, + 0, 0, 0, 0, 1053, 0, 0, 1053, + 1053, 0, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 0, 0, 0, 0, + 0, 1061, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1062, 1054, 1063, 1064, 1065, 1066, 1067, + 1068, 1069, 1070, 1071, 1072, 1073, 1074, 537, + 524, 524, 524, 524, 524, 537, 524, 524, + 0, 1075, 1075, 1075, 1075, 1075, 1075, 1075, + 1075, 1075, 1075, 9, 1076, 1076, 1053, 1054, + 1054, 1077, 1054, 1054, 1054, 1054, 1078, 1079, + 1080, 1081, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1082, 1083, 1084, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1085, 1086, 1053, 1087, 524, + 524, 524, 524, 524, 524, 524, 1051, 813, + 524, 524, 524, 524, 537, 524, 1061, 1061, + 524, 524, 76, 537, 524, 524, 537, 1054, + 1054, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 1054, 1054, 1054, 1088, 1088, + 1054, 1053, 1053, 1053, 1053, 1053, 1053, 1053, + 1053, 1053, 1053, 1053, 1053, 1053, 1053, 0, + 80, 1054, 1089, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 524, 537, 524, 524, 537, 524, 524, + 537, 537, 537, 524, 537, 537, 524, 537, + 524, 524, 524, 537, 524, 537, 524, 537, + 524, 537, 524, 524, 0, 0, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1054, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1091, 1091, 1091, 1091, 1091, 1091, 1091, + 1091, 1091, 1091, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 524, 524, 524, 524, + 524, 524, 524, 537, 524, 1092, 1092, 76, + 8, 8, 8, 1092, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1090, 1090, 1093, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 1094, 1095, 339, 339, 339, 339, 339, + 339, 1096, 1097, 339, 1098, 1099, 339, 339, + 339, 339, 339, 0, 0, 1100, 339, 1093, + 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1093, 1093, 1093, 1093, 1101, 0, + 0, 339, 524, 537, 524, 524, 0, 0, + 0, 1102, 1103, 1104, 1105, 1106, 1107, 1108, + 1109, 339, 339, 1090, 1090, 990, 990, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 990, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 339, 339, 339, 339, + 339, 0, 1090, 1093, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 0, + 339, 339, 0, 0, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 0, 0, 0, 339, + 339, 339, 339, 0, 0, 1111, 339, 1112, + 1093, 1093, 1090, 1090, 1090, 1090, 0, 0, + 1113, 1093, 0, 0, 1114, 1115, 1101, 339, + 0, 0, 0, 0, 0, 0, 0, 0, + 1116, 0, 0, 0, 0, 1117, 1118, 0, + 1119, 339, 339, 1090, 1090, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 339, 339, 10, 10, 1120, 1120, 1120, + 1120, 1120, 1120, 812, 0, 0, 0, 0, + 0, 0, 1090, 1090, 1093, 0, 339, 339, + 339, 339, 339, 339, 0, 0, 0, 0, + 339, 339, 0, 0, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 1121, 0, 339, 1122, + 0, 339, 339, 0, 0, 1111, 0, 1093, + 1093, 1093, 1090, 1090, 0, 0, 0, 0, + 1090, 1090, 0, 0, 1090, 1090, 1101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1123, 1124, 1125, 339, 0, 1126, + 0, 0, 0, 0, 0, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1090, 1090, 339, 339, 339, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1090, 1090, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 339, 339, 339, 0, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 0, 339, 339, + 339, 339, 339, 0, 0, 1111, 339, 1093, + 1093, 1093, 1090, 1090, 1090, 1090, 1090, 0, + 1090, 1090, 1093, 0, 1093, 1093, 1101, 0, + 0, 339, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 1090, 1090, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1090, 1093, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 0, + 339, 339, 0, 0, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 0, 339, 339, + 339, 339, 339, 0, 0, 1111, 339, 1127, + 1090, 1093, 1090, 1090, 1090, 0, 0, 0, + 1128, 1129, 0, 0, 1130, 1131, 1101, 0, + 0, 0, 0, 0, 0, 0, 0, 1132, + 1133, 0, 0, 0, 0, 1134, 1135, 0, + 339, 339, 339, 0, 0, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 812, 339, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1090, 339, 0, 339, 339, + 339, 339, 339, 339, 0, 0, 0, 339, + 339, 339, 0, 1136, 339, 1137, 339, 0, + 0, 0, 339, 339, 0, 339, 0, 339, + 339, 0, 0, 0, 339, 339, 0, 0, + 0, 339, 339, 339, 0, 0, 0, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 0, 0, 0, 1138, + 1093, 1090, 1093, 1093, 0, 0, 0, 1139, + 1140, 1093, 0, 1141, 1142, 1143, 1101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1120, 1120, 1120, 76, 76, 76, 76, + 76, 76, 10, 76, 0, 0, 0, 0, + 0, 0, 1093, 1093, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 339, 339, + 339, 339, 339, 0, 0, 0, 0, 1090, + 1090, 1090, 1093, 1093, 1093, 1093, 0, 1145, + 1090, 1146, 0, 1090, 1090, 1090, 1101, 0, + 0, 0, 0, 0, 0, 0, 1147, 1148, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 0, 0, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1093, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 339, 339, + 339, 339, 339, 0, 0, 1111, 339, 1093, + 1149, 1150, 1093, 1151, 1093, 1093, 0, 1152, + 1153, 1154, 0, 1155, 1156, 1090, 1101, 0, + 0, 0, 0, 0, 0, 0, 1157, 1158, + 0, 0, 0, 0, 0, 0, 0, 339, + 0, 339, 339, 1090, 1090, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 0, 76, 76, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1093, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 0, 0, 0, 1159, + 1093, 1093, 1090, 1090, 1090, 0, 0, 1160, + 1161, 1093, 0, 1162, 1163, 1164, 1101, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1165, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 0, 0, 0, 0, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1093, 1093, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 1166, 0, 0, 0, 0, + 1167, 1093, 1093, 1090, 1090, 1090, 0, 1090, + 0, 1093, 1168, 1169, 1093, 1170, 1171, 1172, + 1173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1093, 1093, 990, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 1090, 339, 1174, 1090, 1090, 1090, + 1090, 1175, 1175, 1101, 0, 0, 0, 0, + 10, 339, 339, 339, 339, 339, 339, 507, + 1090, 1176, 1176, 1176, 1176, 1090, 1090, 1090, + 990, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 990, 990, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 339, 339, 0, 339, 0, 0, + 339, 339, 0, 339, 0, 0, 339, 0, + 0, 0, 0, 0, 0, 339, 339, 339, + 339, 0, 339, 339, 339, 339, 339, 339, + 339, 0, 339, 339, 339, 0, 339, 0, + 339, 0, 0, 339, 339, 0, 339, 339, + 339, 339, 1090, 339, 1177, 1090, 1090, 1090, + 1090, 1178, 1178, 0, 1090, 1090, 339, 0, + 0, 339, 339, 339, 339, 339, 0, 507, + 0, 1179, 1179, 1179, 1179, 1090, 1090, 0, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 0, 0, 1180, 1181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 812, 812, 812, 990, 990, 990, + 990, 990, 990, 990, 990, 1182, 990, 990, + 990, 990, 990, 990, 812, 812, 812, 812, + 812, 537, 537, 812, 812, 812, 812, 812, + 812, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 812, 537, 812, + 537, 812, 1183, 11, 12, 11, 12, 1093, + 1093, 339, 339, 339, 1184, 339, 339, 339, + 339, 0, 339, 339, 339, 339, 1185, 339, + 339, 339, 339, 1186, 339, 339, 339, 339, + 1187, 339, 339, 339, 339, 1188, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 1189, 339, 0, 0, 0, 0, + 0, 0, 1190, 1191, 1192, 1193, 1194, 1195, + 1196, 1197, 1198, 1191, 1191, 1191, 1191, 1090, + 1093, 1191, 1199, 524, 524, 1101, 990, 524, + 524, 339, 339, 339, 339, 0, 0, 0, + 0, 1090, 1090, 1090, 1200, 1090, 1090, 1090, + 1090, 0, 1090, 1090, 1090, 1090, 1201, 1090, + 1090, 1090, 1090, 1202, 1090, 1090, 1090, 1090, + 1203, 1090, 1090, 1090, 1090, 1204, 1090, 1090, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1205, 1090, 1090, 1090, 0, 812, + 812, 812, 812, 812, 812, 812, 812, 537, + 812, 812, 812, 812, 812, 812, 0, 0, + 812, 990, 990, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 339, 339, 1206, 1207, + 339, 0, 339, 339, 0, 1093, 1090, 1208, + 1090, 1090, 1093, 1090, 0, 0, 0, 1090, + 1111, 1093, 1101, 0, 0, 0, 0, 0, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 990, 990, 990, 990, 990, + 990, 339, 339, 339, 339, 339, 339, 1093, + 1093, 1090, 1090, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1209, 1210, 1211, 1212, 1213, 1214, 1215, + 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, + 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, + 1240, 1241, 1242, 1243, 1244, 1245, 1246, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 990, 1247, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 0, 0, 0, 0, + 1248, 1248, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 0, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 0, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 0, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 0, 0, 0, 0, + 524, 812, 990, 990, 990, 990, 990, 990, + 990, 990, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 990, 990, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 11, 12, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 990, 990, 990, 1249, + 1249, 1249, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 339, + 339, 339, 339, 1090, 1090, 1101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 1090, 1090, 1101, 990, 990, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 1090, 1090, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 339, + 339, 339, 0, 1090, 1090, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 1250, 1250, 1093, + 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1093, + 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1090, + 1093, 1093, 1090, 1090, 1090, 1090, 1090, 1090, + 1090, 1090, 1090, 1101, 1090, 990, 990, 990, + 507, 990, 990, 990, 10, 339, 524, 0, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 0, 0, 0, 0, 0, + 0, 1251, 1251, 1251, 1251, 1251, 1251, 1251, + 1251, 1251, 1251, 0, 0, 0, 0, 0, + 0, 8, 8, 8, 8, 8, 8, 1030, + 8, 8, 8, 8, 558, 558, 558, 7, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 507, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 1032, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 0, + 0, 1090, 1090, 1090, 1093, 1093, 1093, 1093, + 1090, 1090, 1252, 1252, 1252, 0, 0, 0, + 0, 1093, 1093, 1090, 1093, 1093, 1093, 1093, + 1093, 1093, 1031, 524, 537, 0, 0, 0, + 0, 76, 0, 0, 0, 8, 8, 1110, + 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 0, 0, 0, 0, 0, + 0, 1093, 1093, 1093, 1093, 1093, 1093, 1093, + 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, + 1093, 1093, 339, 339, 339, 339, 339, 339, + 339, 1093, 1093, 0, 0, 0, 0, 0, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 0, 0, 0, 0, 8, + 8, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 524, 537, 1093, 1093, 1093, 0, 0, 990, + 990, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1090, 1090, 1090, 1090, 1093, 1253, 1254, + 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, + 339, 339, 1263, 1264, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 1111, 1265, 1090, + 1090, 1090, 1090, 1266, 1267, 1268, 1269, 1270, + 1271, 1272, 1273, 1274, 1275, 1276, 339, 339, + 339, 339, 339, 339, 339, 0, 0, 0, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 990, 990, 990, 990, 990, + 990, 990, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 524, 537, 524, 524, + 524, 524, 524, 524, 524, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 1277, 1278, 1279, + 507, 1280, 1281, 1282, 1283, 1284, 1285, 1286, + 1287, 1288, 1289, 1290, 507, 1291, 1292, 1293, + 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, + 1302, 1303, 1304, 1305, 1306, 1307, 1308, 507, + 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, + 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, + 1333, 1334, 1335, 1336, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 1337, 213, 213, 213, 213, 1338, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 213, 213, 213, 213, + 213, 213, 213, 213, 1339, 1340, 1341, 1342, + 1307, 1343, 1344, 1345, 1346, 1347, 1348, 1349, + 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, + 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, + 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, + 1374, 524, 524, 537, 524, 524, 524, 524, + 524, 524, 524, 537, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 524, + 537, 1375, 1376, 1377, 1378, 1379, 1380, 1381, + 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, + 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, + 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, + 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, + 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, + 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, + 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, + 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, + 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, + 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, + 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, + 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, + 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, + 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, + 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, + 1526, 1527, 1528, 1529, 1530, 0, 0, 0, + 0, 1531, 1532, 1533, 1534, 1535, 1536, 1537, + 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, + 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, + 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, + 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, + 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, + 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, + 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, + 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, + 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1620, 0, 0, 0, 0, 0, + 0, 1621, 1622, 1623, 1624, 1625, 1626, 1627, + 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, + 1636, 1637, 1638, 1639, 1640, 1641, 1642, 0, + 0, 1643, 1644, 1645, 1646, 1647, 1648, 0, + 0, 1649, 1650, 1651, 1652, 1653, 1654, 1655, + 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, + 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, + 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, + 1680, 1681, 1682, 1683, 1684, 1685, 1686, 0, + 0, 1687, 1688, 1689, 1690, 1691, 1692, 0, + 0, 1693, 1694, 1695, 1696, 1697, 1698, 1699, + 1700, 0, 1701, 0, 1702, 0, 1703, 0, + 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, + 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, + 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, + 1728, 1729, 1730, 1731, 1732, 1733, 1734, 0, + 0, 1735, 1736, 1737, 1738, 1739, 1740, 1741, + 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, + 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, + 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, + 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 1782, 1783, 1784, 1785, 1786, 1787, 0, 1788, + 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, + 1797, 1798, 1799, 1800, 1801, 1802, 0, 1803, + 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, + 1812, 1813, 1814, 1815, 1816, 0, 0, 1817, + 1818, 1819, 1820, 1821, 1822, 0, 1823, 1824, + 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, + 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, + 1841, 0, 0, 1842, 1843, 1844, 0, 1845, + 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, + 0, 1854, 1855, 1856, 1856, 1856, 1856, 1856, + 1857, 1856, 1856, 1856, 80, 1858, 1858, 1250, + 1859, 1030, 1860, 1030, 1030, 1030, 1030, 8, + 1861, 79, 91, 11, 79, 79, 91, 11, + 79, 8, 8, 8, 8, 1862, 1863, 1864, + 8, 1865, 1866, 1867, 1868, 1869, 1870, 1871, + 75, 9, 9, 9, 1872, 1873, 8, 1874, + 1875, 8, 79, 91, 8, 1876, 8, 1877, + 47, 47, 8, 8, 8, 1878, 11, 12, + 1879, 1880, 1881, 8, 8, 8, 8, 8, + 8, 8, 8, 74, 8, 47, 8, 8, + 1882, 8, 8, 8, 8, 8, 8, 8, + 1856, 80, 80, 80, 80, 0, 0, 0, + 0, 0, 0, 80, 80, 80, 80, 80, + 80, 1883, 1884, 0, 0, 1885, 1886, 1887, + 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, + 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, + 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, + 0, 1912, 1913, 1914, 1915, 1916, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, + 10, 1917, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 524, 524, 550, 550, 524, 524, 524, + 524, 550, 550, 550, 524, 524, 813, 813, + 813, 813, 524, 813, 813, 813, 550, 550, + 524, 537, 524, 550, 550, 537, 537, 537, + 537, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1918, 1919, 1920, 1921, 76, 1922, 1923, + 1924, 76, 1925, 1926, 1927, 1927, 1927, 1928, + 1929, 1930, 1930, 1931, 1932, 76, 1933, 1934, + 76, 76, 1935, 1936, 1937, 1937, 1937, 76, + 76, 1938, 1939, 1940, 76, 1941, 76, 1942, + 76, 1941, 76, 1943, 1944, 1945, 1920, 82, + 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, + 1954, 1955, 1956, 76, 1957, 1958, 1959, 1960, + 1961, 1962, 74, 74, 74, 74, 1963, 1964, + 1946, 1956, 1965, 76, 74, 76, 76, 1966, + 0, 0, 0, 0, 1967, 1968, 1969, 1970, + 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, + 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, + 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 1249, 1249, 1249, 2012, 2013, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2014, 74, 2015, 74, 2016, 76, 76, + 76, 76, 76, 2017, 2018, 76, 76, 76, + 76, 74, 76, 76, 74, 76, 76, 74, + 76, 76, 76, 76, 76, 76, 76, 2019, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 2020, 2021, + 2022, 2023, 76, 2024, 76, 2025, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 2026, 2026, 2027, 2028, 74, 74, + 74, 2029, 2030, 2026, 2031, 2032, 2026, 74, + 74, 74, 2026, 13, 83, 74, 2026, 2026, + 74, 74, 74, 2026, 2026, 2026, 2026, 74, + 2026, 2026, 2026, 2026, 2033, 2034, 2035, 2036, + 74, 74, 74, 74, 2026, 2037, 2038, 2026, + 2039, 2040, 2026, 2026, 2026, 74, 74, 74, + 74, 74, 2026, 74, 2026, 2041, 2026, 2026, + 2026, 2026, 2042, 2026, 2043, 2044, 2045, 2026, + 2046, 2047, 2048, 2026, 2026, 2026, 2049, 74, + 74, 74, 74, 2026, 2026, 2026, 2026, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 2026, 2050, 2051, 2052, 74, 2053, 2054, 2026, + 2026, 2026, 2026, 2026, 2026, 74, 2055, 2056, + 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, + 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2026, + 2026, 2072, 2073, 2074, 2075, 2076, 2077, 2078, + 2079, 2080, 2081, 2026, 2026, 2026, 74, 74, + 2026, 2026, 2082, 2083, 74, 74, 74, 74, + 74, 2026, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 2084, 2026, 74, 74, 2026, + 2026, 2085, 2086, 2026, 2087, 2088, 2089, 2090, + 2091, 2026, 2026, 2092, 2093, 2094, 2095, 2026, + 2026, 2026, 74, 74, 74, 74, 74, 2026, + 2026, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 2026, 2026, 2026, 2026, 2026, 74, + 74, 2026, 2026, 74, 74, 74, 74, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2096, 2097, 2098, 2099, 2026, 2026, 2026, + 2026, 2026, 2026, 2100, 2101, 2102, 2103, 74, + 74, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 76, 76, 76, 76, 76, 76, 76, + 76, 2026, 2026, 2026, 2026, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 2026, 2026, 76, 76, 76, 76, 76, + 76, 76, 2104, 2105, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 76, 74, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 812, 76, + 76, 76, 76, 76, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 74, 74, 74, + 74, 74, 74, 76, 76, 76, 76, 76, + 76, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2106, 2107, 2108, 2109, 2110, 2111, 2112, + 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, + 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, + 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, + 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, + 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, + 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, + 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, + 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, + 2177, 2178, 2179, 2180, 2181, 2182, 2183, 2184, + 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, + 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, + 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, + 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, + 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, + 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, + 2233, 2234, 2235, 2236, 2237, 2238, 2239, 2240, + 2241, 2242, 2243, 2244, 1251, 1251, 1251, 1251, + 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, + 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, + 1251, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 74, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 74, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 74, 74, 74, 74, 74, 74, 74, + 74, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 74, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 812, 76, 76, + 76, 76, 76, 76, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 76, 76, 76, 76, 0, 76, + 76, 76, 76, 0, 0, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 0, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 0, 76, 0, + 76, 76, 76, 76, 0, 0, 0, 76, + 0, 76, 76, 76, 76, 76, 76, 76, + 0, 0, 76, 76, 76, 76, 76, 76, + 76, 11, 12, 11, 12, 11, 12, 11, + 12, 11, 12, 11, 12, 11, 12, 1251, + 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, + 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, + 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, + 1251, 1251, 1251, 1251, 1251, 76, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 0, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 0, 2026, 74, 74, 2026, 2026, 11, 12, + 74, 74, 74, 74, 0, 0, 0, 0, + 0, 74, 74, 74, 2026, 2026, 2026, 2026, + 74, 74, 74, 74, 74, 2026, 2026, 2026, + 74, 74, 74, 2026, 2026, 2026, 2026, 11, + 12, 11, 12, 11, 12, 0, 0, 0, + 0, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 11, 12, 11, 12, + 11, 12, 11, 12, 11, 12, 11, 12, + 11, 12, 11, 12, 11, 12, 11, 12, + 11, 12, 74, 74, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 74, 74, 74, 74, 74, 74, 74, + 74, 2026, 74, 74, 74, 74, 74, 74, + 74, 2026, 2026, 2026, 2026, 2026, 2026, 74, + 74, 74, 2026, 74, 74, 74, 74, 2026, + 2026, 2026, 2026, 2026, 74, 2026, 2026, 74, + 74, 11, 12, 11, 12, 2026, 74, 74, + 74, 74, 2026, 74, 2026, 2026, 2026, 74, + 74, 2026, 2026, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 2026, 2026, 2026, + 2026, 2026, 2026, 74, 74, 11, 12, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 2026, 2026, 2245, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 74, 2026, + 2026, 2026, 2026, 74, 74, 2026, 74, 2026, + 74, 74, 2026, 74, 2026, 2026, 2026, 2026, + 74, 74, 74, 74, 74, 2026, 2026, 74, + 74, 74, 74, 74, 74, 2026, 2026, 2026, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, + 2026, 2026, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 2026, 2026, 74, + 74, 74, 74, 2026, 2026, 2026, 2026, 74, + 2026, 2026, 74, 74, 2026, 2246, 2247, 2248, + 74, 74, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 74, 74, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 74, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, + 74, 74, 74, 74, 74, 2249, 2250, 2026, + 74, 74, 74, 2026, 2026, 2026, 2026, 2026, + 74, 74, 74, 74, 74, 2026, 2026, 2026, + 74, 74, 74, 74, 2026, 74, 74, 74, + 2026, 2026, 2026, 2026, 2026, 74, 2026, 74, + 74, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2251, 2252, 2253, 2254, 2255, 2256, 2257, + 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, + 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, + 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, + 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, + 0, 2298, 2299, 2300, 2301, 2302, 2303, 2304, + 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, + 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, + 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, + 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, + 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, + 0, 2345, 2346, 2347, 2348, 2349, 2350, 2351, + 2352, 2353, 2354, 2355, 2356, 2357, 0, 0, + 0, 0, 0, 0, 0, 213, 2358, 2359, + 213, 0, 0, 0, 0, 0, 0, 0, + 0, 2360, 2361, 2362, 2363, 2364, 2365, 2366, + 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, + 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, + 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, + 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, + 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, + 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, + 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, + 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, + 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, + 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, + 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, + 2455, 2456, 2457, 2458, 2459, 213, 76, 76, + 76, 76, 76, 76, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 8, 8, 8, 1251, 8, + 8, 2460, 2461, 2462, 2463, 2464, 2465, 2466, + 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, + 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, + 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, + 2491, 2492, 2493, 2494, 2495, 2496, 2497, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2498, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 8, 79, 91, 79, 91, 8, + 8, 8, 79, 91, 8, 79, 91, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 1030, 0, 0, 0, 0, 79, 91, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 0, 76, 76, 76, 76, + 2499, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 2500, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2501, 2502, 2503, 2504, 2505, 2506, 2507, + 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, + 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, + 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, + 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, + 2540, 2541, 2542, 2543, 2544, 2545, 2546, 2547, + 2548, 2549, 2550, 2551, 2552, 2553, 2554, 2555, + 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, + 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, + 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, + 2580, 2581, 2582, 2583, 2584, 2585, 2586, 2587, + 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, + 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, + 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, + 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, + 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, + 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, + 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, + 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651, + 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, + 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, + 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, + 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, + 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, + 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, + 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, + 2708, 2709, 2710, 2711, 2712, 2713, 2714, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 0, 0, 0, + 0, 2715, 8, 8, 8, 76, 507, 339, + 1249, 11, 12, 11, 12, 11, 12, 11, + 12, 11, 12, 76, 76, 11, 12, 11, + 12, 11, 12, 11, 12, 1030, 11, 12, + 12, 76, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 2716, 1032, 536, 1031, 2717, + 2717, 1030, 507, 507, 507, 507, 507, 2718, + 76, 2719, 2720, 2721, 507, 339, 8, 76, + 76, 0, 339, 339, 339, 339, 339, 2722, + 339, 339, 339, 339, 2723, 2724, 2725, 2726, + 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, + 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, + 2743, 2744, 2745, 2746, 339, 2747, 2748, 2749, + 2750, 2751, 2752, 339, 339, 339, 339, 339, + 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, + 2761, 2762, 2763, 2764, 2765, 2766, 2767, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 2768, 339, 339, + 0, 0, 2769, 2770, 2771, 2772, 2773, 2774, + 2775, 1030, 339, 339, 339, 339, 339, 2776, + 339, 339, 339, 339, 2777, 2778, 2779, 2780, + 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, + 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, + 2797, 2798, 2799, 2800, 339, 2801, 2802, 2803, + 2804, 2805, 2806, 339, 339, 339, 339, 339, + 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, + 2815, 2816, 2817, 2818, 2819, 2820, 2821, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 2822, 2823, 2824, 2825, 339, 2826, 339, 339, + 2827, 2828, 2829, 2830, 8, 507, 2831, 2832, + 2833, 0, 0, 0, 0, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 0, + 0, 0, 2834, 2835, 2836, 2837, 2838, 2839, + 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, + 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, + 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, + 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, + 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, + 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, + 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, + 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, + 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, + 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, + 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, + 0, 812, 812, 2928, 2929, 2930, 2931, 2932, + 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, + 2941, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 2942, 2943, 2944, 2945, 2946, 2947, 2948, + 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, + 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, + 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, + 0, 2973, 2974, 2975, 2976, 2977, 2978, 2979, + 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, + 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, + 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, + 3004, 3005, 3006, 3007, 3008, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3009, 3010, 3011, 3012, 3013, 3014, 3015, + 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, + 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, + 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, + 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, + 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, + 812, 3056, 3057, 3058, 3059, 3060, 3061, 3062, + 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, + 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, + 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, + 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, + 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, + 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, + 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, + 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, + 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, + 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, + 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, + 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, + 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, + 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, + 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, + 0, 3183, 3184, 3185, 3186, 3187, 3188, 3189, + 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, + 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, + 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, + 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, + 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, + 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, + 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, + 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, + 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, + 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, + 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, + 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, + 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, + 3294, 3295, 3296, 3297, 3298, 3299, 3300, 3301, + 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, + 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, + 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, + 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, + 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, + 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, + 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, + 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, + 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, + 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, + 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, + 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, + 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, + 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, + 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, + 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, + 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, + 3438, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 507, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, + 506, 506, 506, 506, 0, 0, 0, 0, + 0, 46, 46, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 1252, 339, 339, 339, 1101, + 339, 339, 339, 339, 1090, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 1093, 1093, 1090, 1090, + 1093, 76, 76, 76, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 8, 8, 8, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, + 3439, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, + 3448, 3448, 3449, 3450, 3451, 3452, 3453, 3454, + 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, + 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, + 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, + 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, + 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, + 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, + 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, + 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, + 3527, 3528, 3529, 3530, 3531, 3460, 3532, 3533, + 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, + 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, + 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, + 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, + 3566, 3567, 3568, 3569, 3570, 3571, 3572, 3573, + 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, + 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, + 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, + 3598, 3599, 3550, 3600, 3601, 3602, 3603, 3604, + 3605, 3606, 3607, 3534, 3608, 3609, 3610, 3611, + 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, + 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, + 3460, 3628, 3629, 3630, 3631, 3632, 3633, 3634, + 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, + 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, + 3651, 3652, 3653, 3654, 3536, 3655, 3656, 3657, + 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, + 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, + 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, + 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, + 3690, 3691, 3692, 3693, 3694, 3695, 3696, 3697, + 3698, 3699, 3700, 3701, 3702, 3703, 3704, 339, + 339, 3705, 339, 3706, 339, 339, 3707, 3708, + 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, + 339, 3717, 339, 3718, 339, 339, 3719, 3720, + 339, 339, 339, 3721, 3722, 3723, 3724, 0, + 0, 3725, 3726, 3727, 3728, 3729, 3730, 3731, + 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, + 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, + 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, + 3756, 3757, 3758, 3759, 3760, 3761, 3762, 3763, + 3589, 3764, 3765, 3766, 3767, 3768, 3769, 3769, + 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, + 3719, 3778, 3779, 3780, 0, 0, 0, 0, + 0, 3781, 3782, 3783, 3784, 3785, 3786, 3787, + 3788, 3731, 3789, 3790, 3791, 3705, 3792, 3793, + 3794, 3795, 3796, 3797, 3798, 3799, 3800, 3801, + 3802, 3803, 3740, 3804, 3741, 3805, 3806, 3807, + 3808, 3809, 3706, 3481, 3810, 3811, 3812, 3551, + 3638, 3813, 3814, 3748, 3815, 3749, 3816, 3817, + 3818, 3708, 3819, 3820, 3821, 3822, 3823, 3709, + 3824, 3825, 3826, 3827, 3828, 3829, 3763, 3830, + 3831, 3589, 3832, 3767, 3833, 3834, 3835, 3836, + 3837, 3772, 3838, 3718, 3839, 3773, 3532, 3840, + 3774, 3841, 3776, 3842, 3843, 3844, 3845, 3846, + 3778, 3714, 3847, 3779, 3848, 3780, 3849, 3448, + 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, + 3858, 3859, 3860, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3861, 3862, 3863, 3864, 3865, 3866, 3867, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3868, 3869, 3870, 3871, + 3872, 0, 0, 0, 0, 0, 3873, 3874, + 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, + 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, + 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, + 0, 3899, 3900, 3901, 3902, 3903, 0, 3904, + 0, 3905, 3906, 0, 3907, 3908, 0, 3909, + 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, + 3918, 3919, 3920, 3921, 3922, 3923, 3924, 3925, + 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, + 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, + 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, + 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, + 3958, 3959, 3960, 3961, 3962, 3963, 3964, 3965, + 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, + 3974, 3975, 3976, 3977, 3978, 3979, 3980, 3981, + 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, + 3990, 3991, 3992, 3993, 3994, 3995, 3996, 3997, + 3998, 3999, 4000, 4001, 4002, 4003, 4004, 4005, + 4006, 4007, 4008, 4009, 4010, 4011, 4012, 4013, + 4014, 4015, 4016, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4017, 4018, 4019, 4020, + 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, + 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, + 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, + 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, + 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, + 4061, 4062, 4063, 4064, 4055, 4065, 4066, 4067, + 4068, 4069, 4070, 4071, 4072, 4073, 4074, 4075, + 4076, 4077, 4078, 4079, 4080, 4081, 4082, 4083, + 4084, 4085, 4086, 4087, 4088, 4089, 4090, 4091, + 4092, 4093, 4094, 4095, 4096, 4097, 4098, 4099, + 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, + 4108, 4109, 4110, 4111, 4112, 4113, 4114, 4115, + 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, + 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, + 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, + 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, + 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, + 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, + 4164, 4056, 4165, 4166, 4167, 4168, 4169, 4170, + 4171, 4172, 4173, 4174, 4175, 4176, 4177, 4178, + 4179, 4180, 4181, 4182, 4183, 4184, 4185, 4186, + 4187, 4188, 4189, 4190, 4191, 4192, 4193, 4194, + 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, + 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4210, + 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, + 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, + 4227, 4228, 4229, 4230, 4231, 4232, 4233, 4234, + 4235, 4236, 4237, 4238, 4239, 4240, 4241, 4242, + 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, + 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, + 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4266, + 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, + 4275, 4276, 4277, 4278, 4279, 4280, 4281, 4282, + 4283, 4284, 4285, 4286, 4287, 4288, 4289, 4290, + 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, + 4299, 4300, 4301, 4302, 4303, 4304, 4305, 4306, + 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, + 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, + 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, + 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, + 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, + 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, + 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, + 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, + 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, + 4379, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4380, 4381, 4382, 4383, 4384, 4385, 4386, + 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, + 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, + 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, + 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, + 4419, 4420, 4421, 4422, 4423, 4424, 4425, 4426, + 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, + 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, + 4443, 0, 0, 4444, 4445, 4446, 4447, 4448, + 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, + 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, + 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, + 4473, 4474, 4475, 4476, 4477, 4478, 4479, 4480, + 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, + 4489, 4490, 4491, 4492, 4493, 4494, 4495, 4496, + 4497, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4498, 4499, 4500, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 76, 0, + 0, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4519, 4520, 0, 0, 0, 0, 0, + 0, 524, 524, 524, 524, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4521, 4522, 4523, 4524, 4524, 4525, 4526, + 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, + 4535, 4536, 4537, 4538, 4539, 4540, 8, 8, + 4541, 4542, 4543, 4543, 4543, 4543, 4544, 4544, + 4544, 4545, 4546, 4547, 0, 4548, 4549, 4550, + 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, + 4559, 4560, 4561, 4562, 4563, 4564, 4565, 4566, + 0, 4567, 4568, 4569, 4570, 0, 0, 0, + 0, 4571, 4572, 4573, 1054, 4574, 0, 4575, + 4576, 4577, 4578, 4579, 4580, 4581, 4582, 4583, + 4584, 4585, 4586, 4587, 4588, 4589, 4590, 4591, + 4592, 4593, 4594, 4595, 4596, 4597, 4598, 4599, + 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, + 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, + 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, + 4624, 4625, 4626, 4627, 4628, 4629, 4630, 4631, + 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, + 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, + 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, + 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, + 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, + 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, + 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, + 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, + 4696, 4697, 4698, 4699, 4700, 4701, 4702, 4703, + 4704, 4705, 4706, 4707, 4708, 4709, 0, 0, + 80, 0, 4710, 4711, 4712, 4713, 4714, 4715, + 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, + 4724, 4725, 4726, 4727, 4728, 4729, 4730, 4731, + 4732, 4733, 4734, 4735, 4736, 4737, 4738, 4739, + 4740, 4741, 4742, 4743, 4744, 4745, 4746, 4747, + 4748, 4749, 4750, 4751, 4752, 4753, 4754, 4755, + 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, + 4764, 4765, 4766, 4767, 4768, 4769, 4770, 4771, + 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, + 4780, 4781, 4782, 4783, 4784, 4785, 4786, 4787, + 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, + 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, + 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, + 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, + 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, + 4828, 4829, 4830, 4831, 4832, 4833, 4834, 4835, + 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, + 4844, 4845, 4846, 4847, 4848, 4849, 4850, 4851, + 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, + 4860, 4861, 4862, 4863, 4864, 4865, 4866, 4867, + 4868, 4869, 4870, 4871, 4872, 4873, 4874, 4875, + 4876, 4877, 4878, 4879, 4880, 4881, 4882, 4883, + 4884, 4885, 4886, 4887, 4888, 4889, 4890, 4891, + 4892, 4893, 4894, 4895, 4896, 4897, 4898, 4899, + 0, 0, 0, 4900, 4901, 4902, 4903, 4904, + 4905, 0, 0, 4906, 4907, 4908, 4909, 4910, + 4911, 0, 0, 4912, 4913, 4914, 4915, 4916, + 4917, 0, 0, 4918, 4919, 4920, 0, 0, + 0, 4921, 4922, 4923, 4924, 4925, 4926, 4927, + 0, 4928, 4929, 4930, 4931, 4932, 4933, 4934, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4935, 4935, 4935, 76, 76, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 0, 339, 339, 0, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 0, 0, 0, 0, + 0, 990, 8, 812, 0, 0, 0, 0, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 0, 0, 0, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 4936, 4936, 4936, 4936, 4936, 4936, 4936, + 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, + 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, + 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, + 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, + 4936, 4936, 4936, 4936, 4936, 4936, 4936, 4936, + 4936, 4936, 4936, 4936, 4936, 4936, 1251, 1251, + 1251, 1251, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 1251, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 1120, 1120, 1120, 1120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 1249, 339, 339, 339, 339, 339, + 339, 339, 339, 1249, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 990, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 990, 1249, 1249, 1249, 1249, 1249, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4937, 4938, 4939, 4940, 4941, 4942, 4943, + 4944, 4945, 4946, 4947, 4948, 4949, 4950, 4951, + 4952, 4953, 4954, 4955, 4956, 4957, 4958, 4959, + 4960, 4961, 4962, 4963, 4964, 4965, 4966, 4967, + 4968, 4969, 4970, 4971, 4972, 4973, 4974, 4975, + 4976, 4977, 4978, 4979, 4980, 4981, 4982, 4983, + 4984, 4985, 4986, 4987, 4988, 4989, 4990, 4991, + 4992, 4993, 4994, 4995, 4996, 4997, 4998, 4999, + 5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 0, + 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1050, 1050, 1050, 1050, 1050, 1050, 0, + 0, 1050, 0, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 0, + 1050, 1050, 0, 0, 0, 1050, 0, 0, + 1050, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 5017, + 5017, 5017, 5017, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1050, 1090, 1090, 1090, 0, 1090, 1090, + 0, 0, 0, 0, 0, 1090, 537, 1090, + 524, 1050, 1050, 1050, 1050, 0, 1050, 1050, + 1050, 0, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, + 1050, 1050, 1050, 1050, 1050, 0, 0, 0, + 0, 524, 550, 537, 0, 0, 0, 0, + 1101, 5017, 5017, 5017, 5017, 5017, 5017, 5017, + 5017, 0, 0, 0, 0, 0, 0, 0, + 0, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1249, 1249, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 990, 990, 990, 990, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 0, 0, 0, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 5018, 5019, 812, 812, 812, 812, 812, 5020, + 5021, 5022, 5023, 5024, 5025, 5026, 5027, 5028, + 550, 550, 550, 812, 812, 812, 5029, 5030, + 5031, 5032, 5033, 5034, 80, 80, 80, 80, + 80, 80, 80, 80, 537, 537, 537, 537, + 537, 537, 537, 537, 812, 812, 524, 524, + 524, 524, 524, 537, 537, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 524, 524, 524, 524, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 5035, 5036, 5037, 5038, 5039, 5040, + 5041, 5042, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 524, 524, 524, 76, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, + 1120, 1120, 1120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5043, 1945, 1920, 1963, 1947, 1948, 5044, + 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, + 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, + 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, + 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, + 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, + 5056, 5057, 1964, 1946, 5058, 1926, 0, 1956, + 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, + 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, + 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5043, 0, 1920, + 1963, 0, 0, 5044, 0, 0, 5045, 5046, + 0, 0, 1933, 5047, 1935, 1936, 0, 5048, + 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, + 5056, 5057, 1964, 0, 5058, 0, 1928, 1956, + 1965, 5059, 1932, 5060, 5061, 0, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, + 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, + 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5043, 1945, 0, + 1963, 1947, 1948, 5044, 0, 0, 5045, 5046, + 1931, 1950, 1933, 5047, 1935, 1936, 0, 5048, + 5049, 5050, 5051, 5052, 5053, 5054, 0, 5055, + 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, + 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5043, 1945, 0, 1963, 1947, 1948, 5044, + 0, 1930, 5045, 5046, 1931, 1950, 0, 5047, + 0, 0, 0, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 0, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, + 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, + 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, + 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, + 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, + 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, + 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, + 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, + 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, + 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, + 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, + 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, + 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, + 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, + 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5043, 1945, 1920, + 1963, 1947, 1948, 5044, 1927, 1930, 5045, 5046, + 1931, 1950, 1933, 5047, 1935, 1936, 1937, 5048, + 5049, 5050, 5051, 5052, 5053, 5054, 1941, 5055, + 5056, 5057, 1964, 1946, 5058, 1926, 1928, 1956, + 1965, 5059, 1932, 5060, 5061, 1951, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5043, 1945, 1920, 1963, 1947, 1948, 5044, + 1927, 1930, 5045, 5046, 1931, 1950, 1933, 5047, + 1935, 1936, 1937, 5048, 5049, 5050, 5051, 5052, + 5053, 5054, 1941, 5055, 5056, 5057, 1964, 1946, + 5058, 1926, 1928, 1956, 1965, 5059, 1932, 5060, + 5061, 1951, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5074, 0, + 0, 5075, 5076, 1960, 5077, 5078, 5079, 5080, + 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, + 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, + 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, + 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, + 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, + 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, + 5126, 5127, 5128, 5075, 5076, 1960, 5077, 5078, + 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, + 5087, 5088, 1961, 5089, 5090, 5091, 5092, 5093, + 5094, 5095, 5096, 5097, 5098, 5099, 5100, 1959, + 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, + 5109, 5110, 5111, 5112, 1958, 5113, 5114, 5115, + 5116, 5117, 5118, 5119, 5120, 5121, 5122, 5123, + 5124, 5125, 5126, 5127, 5128, 5075, 5076, 1960, + 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, + 5085, 5086, 5087, 5088, 1961, 5089, 5090, 5091, + 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, + 5100, 1959, 5101, 5102, 5103, 5104, 5105, 5106, + 5107, 5108, 5109, 5110, 5111, 5112, 1958, 5113, + 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, + 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5075, + 5076, 1960, 5077, 5078, 5079, 5080, 5081, 5082, + 5083, 5084, 5085, 5086, 5087, 5088, 1961, 5089, + 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, + 5098, 5099, 5100, 1959, 5101, 5102, 5103, 5104, + 5105, 5106, 5107, 5108, 5109, 5110, 5111, 5112, + 1958, 5113, 5114, 5115, 5116, 5117, 5118, 5119, + 5120, 5121, 5122, 5123, 5124, 5125, 5126, 5127, + 5128, 5075, 5076, 1960, 5077, 5078, 5079, 5080, + 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, + 1961, 5089, 5090, 5091, 5092, 5093, 5094, 5095, + 5096, 5097, 5098, 5099, 5100, 1959, 5101, 5102, + 5103, 5104, 5105, 5106, 5107, 5108, 5109, 5110, + 5111, 5112, 1958, 5113, 5114, 5115, 5116, 5117, + 5118, 5119, 5120, 5121, 5122, 5123, 5124, 5125, + 5126, 5127, 5128, 5129, 5130, 0, 0, 5131, + 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, + 5140, 5131, 5132, 5133, 5134, 5135, 5136, 5137, + 5138, 5139, 5140, 5131, 5132, 5133, 5134, 5135, + 5136, 5137, 5138, 5139, 5140, 5131, 5132, 5133, + 5134, 5135, 5136, 5137, 5138, 5139, 5140, 5131, + 5132, 5133, 5134, 5135, 5136, 5137, 5138, 5139, + 5140, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 339, 339, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5141, 5142, 5143, 5144, 5145, 3725, 5146, + 5147, 5148, 5149, 3726, 5150, 5151, 5152, 3727, + 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, + 5161, 5162, 5163, 5164, 3782, 5165, 5166, 5167, + 5168, 5169, 5170, 5171, 5172, 5173, 3787, 3728, + 3729, 3788, 5174, 5175, 3538, 5176, 3730, 5177, + 5178, 5179, 5180, 5180, 5180, 5181, 5182, 5183, + 5184, 5185, 5186, 5187, 5188, 5189, 5190, 5191, + 5192, 5193, 5194, 5195, 5196, 5197, 5198, 5198, + 3790, 5199, 5200, 5201, 5202, 3732, 5203, 5204, + 5205, 3691, 5206, 5207, 5208, 5209, 5210, 5211, + 5212, 5213, 5214, 5215, 5216, 5217, 5218, 5219, + 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, + 5228, 5229, 5230, 5231, 5231, 5232, 5233, 5234, + 3534, 5235, 5236, 5237, 5238, 5239, 5240, 5241, + 5242, 3737, 5243, 5244, 5245, 5246, 5247, 5248, + 5249, 5250, 5251, 5252, 5253, 5254, 5255, 5256, + 5257, 5258, 5259, 5260, 5261, 5262, 5263, 3480, + 5264, 5265, 5266, 5266, 5267, 5268, 5268, 5269, + 5270, 5271, 5272, 5273, 5274, 5275, 5276, 5277, + 5278, 5279, 5280, 5281, 3738, 5282, 5283, 5284, + 5285, 3802, 5285, 5286, 3740, 5287, 5288, 5289, + 5290, 3741, 3453, 5291, 5292, 5293, 5294, 5295, + 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, + 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, + 5312, 3742, 5313, 5314, 5315, 5316, 5317, 5318, + 3744, 5319, 5320, 5321, 5322, 5323, 5324, 5325, + 5326, 3481, 3810, 5327, 5328, 5329, 5330, 5331, + 5332, 5333, 5334, 3745, 5335, 5336, 5337, 5338, + 3853, 5339, 5340, 5341, 5342, 5343, 5344, 5345, + 5346, 5347, 5348, 5349, 5350, 5351, 3551, 5352, + 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, + 5361, 5362, 3746, 3638, 5363, 5364, 5365, 5366, + 5367, 5368, 5369, 5370, 3814, 5371, 5372, 5373, + 5374, 5375, 5376, 5377, 5378, 3815, 5379, 5380, + 5381, 5382, 5383, 5384, 5385, 5386, 5387, 5388, + 5389, 5390, 3817, 5391, 5392, 5393, 5394, 5395, + 5396, 5397, 5398, 5399, 5400, 5401, 5401, 5402, + 5403, 3819, 5404, 5405, 5406, 5407, 5408, 5409, + 5410, 3537, 5411, 5412, 5413, 5414, 5415, 5416, + 5417, 3825, 5418, 5419, 5420, 5421, 5422, 5423, + 5423, 3826, 3855, 5424, 5425, 5426, 5427, 5428, + 3499, 3828, 5429, 5430, 3757, 5431, 5432, 3713, + 5433, 5434, 3761, 5435, 5436, 5437, 5438, 5438, + 5439, 5440, 5441, 5442, 5443, 5444, 5445, 5446, + 5447, 5448, 5449, 5450, 5451, 5452, 5453, 5454, + 5455, 5456, 5457, 5458, 5459, 5460, 5461, 5462, + 5463, 5464, 5465, 3767, 5466, 5467, 5468, 5469, + 5470, 5471, 5472, 5473, 5474, 5475, 5476, 5477, + 5478, 5479, 5480, 5481, 5267, 5482, 5483, 5484, + 5485, 5486, 5487, 5488, 5489, 5490, 5491, 5492, + 5493, 3555, 5494, 5495, 5496, 5497, 5498, 5499, + 3770, 5500, 5501, 5502, 5503, 5504, 5505, 5506, + 5507, 5508, 5509, 5510, 5511, 5512, 5513, 5514, + 5515, 5516, 5517, 5518, 5519, 3494, 5520, 5521, + 5522, 5523, 5524, 5525, 3835, 5526, 5527, 5528, + 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, + 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, + 5545, 3840, 3841, 5546, 5547, 5548, 5549, 5550, + 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558, + 3842, 5559, 5560, 5561, 5562, 5563, 5564, 5565, + 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, + 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, + 5582, 5583, 5584, 5585, 5586, 5587, 5588, 3848, + 3848, 5589, 5590, 5591, 5592, 5593, 5594, 5595, + 5596, 5597, 5598, 3849, 5599, 5600, 5601, 5602, + 5603, 5604, 5605, 5606, 5607, 5608, 5609, 5610, + 5611, 5612, 5613, 5614, 5615, 5616, 5617, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 558, 558, 558, 558, + 558, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, + 3440, 3440, 3440, 3440, 3440, 3440, 3440, 0, + 0, }; + +const utf8proc_property_t utf8proc_properties[] = { + {0, 0, 0, 0, NULL, false, -1, -1, -1, -1, -1, false}, + {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, + {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, + {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, + {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_CC, 0, UTF8PROC_BIDI_CLASS_S, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17580, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17400, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17640, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 97, -1, 0, -1, false, false, false, false, utf8proc_sequences + 0}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 98, -1, 8640, -1, false, false, false, false, utf8proc_sequences + 2}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 99, -1, 60, -1, false, false, false, false, utf8proc_sequences + 4}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 100, -1, 960, -1, false, false, false, false, utf8proc_sequences + 6}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 101, -1, 120, -1, false, false, false, false, utf8proc_sequences + 8}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 102, -1, 9120, -1, false, false, false, false, utf8proc_sequences + 10}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 103, -1, 1080, -1, false, false, false, false, utf8proc_sequences + 12}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 104, -1, 1200, -1, false, false, false, false, utf8proc_sequences + 14}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 105, -1, 180, -1, false, false, false, false, utf8proc_sequences + 16}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 106, -1, 1320, -1, false, false, false, false, utf8proc_sequences + 18}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 107, -1, 1440, -1, false, false, false, false, utf8proc_sequences + 20}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 108, -1, 1560, -1, false, false, false, false, utf8proc_sequences + 22}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 109, -1, 9480, -1, false, false, false, false, utf8proc_sequences + 24}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 110, -1, 240, -1, false, false, false, false, utf8proc_sequences + 26}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 111, -1, 300, -1, false, false, false, false, utf8proc_sequences + 28}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 112, -1, 9720, -1, false, false, false, false, utf8proc_sequences + 30}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 32}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 114, -1, 1680, -1, false, false, false, false, utf8proc_sequences + 34}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 115, -1, 1800, -1, false, false, false, false, utf8proc_sequences + 36}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 116, -1, 1920, -1, false, false, false, false, utf8proc_sequences + 38}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 117, -1, 360, -1, false, false, false, false, utf8proc_sequences + 40}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 118, -1, 10560, -1, false, false, false, false, utf8proc_sequences + 42}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 119, -1, 2040, -1, false, false, false, false, utf8proc_sequences + 44}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 120, -1, 10680, -1, false, false, false, false, utf8proc_sequences + 46}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 121, -1, 420, -1, false, false, false, false, utf8proc_sequences + 48}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 122, -1, 2160, -1, false, false, false, false, utf8proc_sequences + 50}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 65, -1, 65, 480, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66, -1, 66, 8700, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 67, -1, 67, 540, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 68, -1, 68, 1020, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 69, -1, 69, 600, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 70, -1, 70, 9180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 71, -1, 71, 1140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 72, -1, 72, 1260, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, 660, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 74, -1, 74, 1380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 75, -1, 75, 1500, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 76, -1, 76, 1620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 77, -1, 77, 9540, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 78, -1, 78, 720, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 79, -1, 79, 780, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 80, -1, 80, 9780, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 81, -1, 81, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 82, -1, 82, 1740, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 83, -1, 83, 1860, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 84, -1, 84, 1980, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 85, -1, 85, 840, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 86, -1, 86, 10620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 87, -1, 87, 2100, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 88, -1, 88, 10740, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 89, -1, 89, 900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 90, -1, 90, 2220, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 54, false, -1, -1, -1, 3600, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PI, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 57, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ET, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 64, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 67, false, 924, -1, 924, -1, -1, false, false, false, false, utf8proc_sequences + 67}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 69, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 74, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 78, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 82, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 86, false, -1, 224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 89}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 91, false, -1, 225, -1, -1, -1, false, false, false, false, utf8proc_sequences + 94}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 96, false, -1, 226, -1, 10860, -1, false, false, false, false, utf8proc_sequences + 99}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 101, false, -1, 227, -1, -1, -1, false, false, false, false, utf8proc_sequences + 104}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 106, false, -1, 228, -1, 2400, -1, false, false, false, false, utf8proc_sequences + 109}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 111, false, -1, 229, -1, 3000, -1, false, false, false, false, utf8proc_sequences + 114}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 230, -1, 2640, -1, false, false, false, false, utf8proc_sequences + 116}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 118, false, -1, 231, -1, 8760, -1, false, false, false, false, utf8proc_sequences + 121}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 123, false, -1, 232, -1, -1, -1, false, false, false, false, utf8proc_sequences + 126}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 128, false, -1, 233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 131}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 133, false, -1, 234, -1, 11220, -1, false, false, false, false, utf8proc_sequences + 136}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 138, false, -1, 235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 141}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 143, false, -1, 236, -1, -1, -1, false, false, false, false, utf8proc_sequences + 146}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 148, false, -1, 237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 151}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 153, false, -1, 238, -1, -1, -1, false, false, false, false, utf8proc_sequences + 156}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 158, false, -1, 239, -1, 9240, -1, false, false, false, false, utf8proc_sequences + 161}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 240, -1, -1, -1, false, false, false, false, utf8proc_sequences + 163}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 165, false, -1, 241, -1, -1, -1, false, false, false, false, utf8proc_sequences + 168}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 170, false, -1, 242, -1, -1, -1, false, false, false, false, utf8proc_sequences + 173}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 175, false, -1, 243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 178}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 180, false, -1, 244, -1, 11460, -1, false, false, false, false, utf8proc_sequences + 183}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 185, false, -1, 245, -1, 3360, -1, false, false, false, false, utf8proc_sequences + 188}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 190, false, -1, 246, -1, 3240, -1, false, false, false, false, utf8proc_sequences + 193}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 248, -1, 3120, -1, false, false, false, false, utf8proc_sequences + 195}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 197, false, -1, 249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 200}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 202, false, -1, 250, -1, -1, -1, false, false, false, false, utf8proc_sequences + 205}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 207, false, -1, 251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 210}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 212, false, -1, 252, -1, 2280, -1, false, false, false, false, utf8proc_sequences + 215}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 217, false, -1, 253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 220}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 254, -1, -1, -1, false, false, false, false, utf8proc_sequences + 222}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 224}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 227, false, 192, -1, 192, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 230, false, 193, -1, 193, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 233, false, 194, -1, 194, 10920, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 236, false, 195, -1, 195, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 239, false, 196, -1, 196, 2460, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 242, false, 197, -1, 197, 3060, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 198, -1, 198, 2700, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 245, false, 199, -1, 199, 8820, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 248, false, 200, -1, 200, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 251, false, 201, -1, 201, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 254, false, 202, -1, 202, 11280, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 257, false, 203, -1, 203, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 260, false, 204, -1, 204, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 263, false, 205, -1, 205, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 266, false, 206, -1, 206, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 269, false, 207, -1, 207, 9300, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 208, -1, 208, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 272, false, 209, -1, 209, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 275, false, 210, -1, 210, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 278, false, 211, -1, 211, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 281, false, 212, -1, 212, 11520, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 284, false, 213, -1, 213, 3420, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 287, false, 214, -1, 214, 3300, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 216, -1, 216, 3180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 290, false, 217, -1, 217, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 293, false, 218, -1, 218, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 296, false, 219, -1, 219, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 299, false, 220, -1, 220, 2340, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 302, false, 221, -1, 221, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 222, -1, 222, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 305, false, 376, -1, 376, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 308, false, -1, 257, -1, -1, -1, false, false, false, false, utf8proc_sequences + 311}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 313, false, 256, -1, 256, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 316, false, -1, 259, -1, 11100, -1, false, false, false, false, utf8proc_sequences + 319}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 321, false, 258, -1, 258, 11160, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 324, false, -1, 261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 327}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 329, false, 260, -1, 260, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 332, false, -1, 263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 335}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 337, false, 262, -1, 262, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 340, false, -1, 265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 343}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 345, false, 264, -1, 264, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 348, false, -1, 267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 351}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 353, false, 266, -1, 266, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 356, false, -1, 269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 359}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 361, false, 268, -1, 268, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 364, false, -1, 271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 367}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 369, false, 270, -1, 270, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 372}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 272, -1, 272, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 374, false, -1, 275, -1, 8880, -1, false, false, false, false, utf8proc_sequences + 377}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 379, false, 274, -1, 274, 8940, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 382, false, -1, 277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 385}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 387, false, 276, -1, 276, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 390, false, -1, 279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 393}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 395, false, 278, -1, 278, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 398, false, -1, 281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 401}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 403, false, 280, -1, 280, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 406, false, -1, 283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 409}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 411, false, 282, -1, 282, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 414, false, -1, 285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 417}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 419, false, 284, -1, 284, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 422, false, -1, 287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 425}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 427, false, 286, -1, 286, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 430, false, -1, 289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 433}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 435, false, 288, -1, 288, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 438, false, -1, 291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 441}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 443, false, 290, -1, 290, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 446, false, -1, 293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 449}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 451, false, 292, -1, 292, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 454}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 294, -1, 294, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 456, false, -1, 297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 459}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 461, false, 296, -1, 296, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 464, false, -1, 299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 467}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 469, false, 298, -1, 298, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 472, false, -1, 301, -1, -1, -1, false, false, false, false, utf8proc_sequences + 475}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 477, false, 300, -1, 300, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 480, false, -1, 303, -1, -1, -1, false, false, false, false, utf8proc_sequences + 483}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 485, false, 302, -1, 302, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 488, false, -1, 105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 491}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 73, -1, 73, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 494, false, -1, 307, -1, -1, -1, false, false, false, false, utf8proc_sequences + 497}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 499, false, 306, -1, 306, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 502, false, -1, 309, -1, -1, -1, false, false, false, false, utf8proc_sequences + 505}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 507, false, 308, -1, 308, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 510, false, -1, 311, -1, -1, -1, false, false, false, false, utf8proc_sequences + 513}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 515, false, 310, -1, 310, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 518, false, -1, 314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 521}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 523, false, 313, -1, 313, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 526, false, -1, 316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 529}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 531, false, 315, -1, 315, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 534, false, -1, 318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 537}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 539, false, 317, -1, 317, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 542, false, -1, 320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 545}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 547, false, 319, -1, 319, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 550}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 321, -1, 321, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 552, false, -1, 324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 555}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 557, false, 323, -1, 323, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 560, false, -1, 326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 563}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 565, false, 325, -1, 325, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 568, false, -1, 328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 571}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 573, false, 327, -1, 327, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 576, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 576}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 579}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 330, -1, 330, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 581, false, -1, 333, -1, 9600, -1, false, false, false, false, utf8proc_sequences + 584}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 586, false, 332, -1, 332, 9660, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 589, false, -1, 335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 592}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 594, false, 334, -1, 334, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 597, false, -1, 337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 600}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 602, false, 336, -1, 336, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 605}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 338, -1, 338, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 607, false, -1, 341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 610}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 612, false, 340, -1, 340, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 615, false, -1, 343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 618}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 620, false, 342, -1, 342, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 623, false, -1, 345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 626}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 628, false, 344, -1, 344, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 631, false, -1, 347, -1, 9960, -1, false, false, false, false, utf8proc_sequences + 634}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 636, false, 346, -1, 346, 10020, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 639, false, -1, 349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 642}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 644, false, 348, -1, 348, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 647, false, -1, 351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 650}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 652, false, 350, -1, 350, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 655, false, -1, 353, -1, 10080, -1, false, false, false, false, utf8proc_sequences + 658}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 660, false, 352, -1, 352, 10140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 663, false, -1, 355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 666}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 668, false, 354, -1, 354, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 671, false, -1, 357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 674}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 676, false, 356, -1, 356, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 679}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 358, -1, 358, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 681, false, -1, 361, -1, 10320, -1, false, false, false, false, utf8proc_sequences + 684}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 686, false, 360, -1, 360, 10380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 689, false, -1, 363, -1, 10440, -1, false, false, false, false, utf8proc_sequences + 692}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 694, false, 362, -1, 362, 10500, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 697, false, -1, 365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 700}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 702, false, 364, -1, 364, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 705, false, -1, 367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 708}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 710, false, 366, -1, 366, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 713, false, -1, 369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 716}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 718, false, 368, -1, 368, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 721, false, -1, 371, -1, -1, -1, false, false, false, false, utf8proc_sequences + 724}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 726, false, 370, -1, 370, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 729, false, -1, 373, -1, -1, -1, false, false, false, false, utf8proc_sequences + 732}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 734, false, 372, -1, 372, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 737, false, -1, 375, -1, -1, -1, false, false, false, false, utf8proc_sequences + 740}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 742, false, 374, -1, 374, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 745, false, -1, 255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 748}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 750, false, -1, 378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 753}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 755, false, 377, -1, 377, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 758, false, -1, 380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 761}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 763, false, 379, -1, 379, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 766, false, -1, 382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 769}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 771, false, 381, -1, 381, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 36, false, 83, -1, 83, 10800, -1, false, false, false, false, utf8proc_sequences + 36}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 579, -1, 579, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 595, -1, -1, -1, false, false, false, false, utf8proc_sequences + 774}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 776}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 386, -1, 386, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 778}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 388, -1, 388, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 596, -1, -1, -1, false, false, false, false, utf8proc_sequences + 780}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 782}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 391, -1, 391, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 598, -1, -1, -1, false, false, false, false, utf8proc_sequences + 784}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 599, -1, -1, -1, false, false, false, false, utf8proc_sequences + 786}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 788}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 395, -1, 395, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 790}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 792}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 794}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 796}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 401, -1, 401, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 798}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 800}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 502, -1, 502, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 802}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 804}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 806}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 408, -1, 408, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 573, -1, 573, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 808}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 810}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 544, -1, 544, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 812}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 814, false, -1, 417, -1, 11700, -1, false, false, false, false, utf8proc_sequences + 817}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 819, false, 416, -1, 416, 11760, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 822}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 418, -1, 418, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 824}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 420, -1, 420, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 640, -1, -1, -1, false, false, false, false, utf8proc_sequences + 826}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 828}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 423, -1, 423, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 643, -1, -1, -1, false, false, false, false, utf8proc_sequences + 830}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 832}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 428, -1, 428, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 648, -1, -1, -1, false, false, false, false, utf8proc_sequences + 834}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 836, false, -1, 432, -1, 11820, -1, false, false, false, false, utf8proc_sequences + 839}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 841, false, 431, -1, 431, 11880, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 650, -1, -1, -1, false, false, false, false, utf8proc_sequences + 844}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 651, -1, -1, -1, false, false, false, false, utf8proc_sequences + 846}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 848}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 435, -1, 435, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 850}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 437, -1, 437, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 658, -1, 2880, -1, false, false, false, false, utf8proc_sequences + 852}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 854}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 440, -1, 440, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 856}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 444, -1, 444, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 503, -1, 503, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 858, false, -1, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 863, false, 452, 454, 453, -1, -1, false, false, false, false, utf8proc_sequences + 861}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 866, false, 452, -1, 453, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 869, false, -1, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 874, false, 455, 457, 456, -1, -1, false, false, false, false, utf8proc_sequences + 872}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 877, false, 455, -1, 456, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 880, false, -1, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 885, false, 458, 460, 459, -1, -1, false, false, false, false, utf8proc_sequences + 883}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 888, false, 458, -1, 459, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 891, false, -1, 462, -1, -1, -1, false, false, false, false, utf8proc_sequences + 894}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 896, false, 461, -1, 461, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 899, false, -1, 464, -1, -1, -1, false, false, false, false, utf8proc_sequences + 902}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 904, false, 463, -1, 463, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 907, false, -1, 466, -1, -1, -1, false, false, false, false, utf8proc_sequences + 910}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 912, false, 465, -1, 465, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 915, false, -1, 468, -1, -1, -1, false, false, false, false, utf8proc_sequences + 918}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 920, false, 467, -1, 467, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 923, false, -1, 470, -1, -1, -1, false, false, false, false, utf8proc_sequences + 926}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 928, false, 469, -1, 469, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 931, false, -1, 472, -1, -1, -1, false, false, false, false, utf8proc_sequences + 934}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 936, false, 471, -1, 471, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 939, false, -1, 474, -1, -1, -1, false, false, false, false, utf8proc_sequences + 942}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 944, false, 473, -1, 473, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 947, false, -1, 476, -1, -1, -1, false, false, false, false, utf8proc_sequences + 950}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 952, false, 475, -1, 475, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 398, -1, 398, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 955, false, -1, 479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 958}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 960, false, 478, -1, 478, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 963, false, -1, 481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 966}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 968, false, 480, -1, 480, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 971, false, -1, 483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 974}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 976, false, 482, -1, 482, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 979}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 484, -1, 484, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 981, false, -1, 487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 984}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 986, false, 486, -1, 486, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 989, false, -1, 489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 992}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 994, false, 488, -1, 488, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 997, false, -1, 491, -1, 2760, -1, false, false, false, false, utf8proc_sequences + 1000}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1002, false, 490, -1, 490, 2820, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1005, false, -1, 493, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1008}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1010, false, 492, -1, 492, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1013, false, -1, 495, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1016}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1018, false, 494, -1, 494, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1021, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1021}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1024, false, -1, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1029, false, 497, 499, 498, -1, -1, false, false, false, false, utf8proc_sequences + 1027}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1032, false, 497, -1, 498, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1035, false, -1, 501, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1038}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1040, false, 500, -1, 500, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1043}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1045}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1047, false, -1, 505, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1050}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1052, false, 504, -1, 504, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1055, false, -1, 507, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1058}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1060, false, 506, -1, 506, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1063, false, -1, 509, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1066}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1068, false, 508, -1, 508, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1071, false, -1, 511, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1074}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1076, false, 510, -1, 510, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1079, false, -1, 513, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1082}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1084, false, 512, -1, 512, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1087, false, -1, 515, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1090}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1092, false, 514, -1, 514, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1095, false, -1, 517, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1098}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1100, false, 516, -1, 516, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1103, false, -1, 519, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1106}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1108, false, 518, -1, 518, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1111, false, -1, 521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1114}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1116, false, 520, -1, 520, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1119, false, -1, 523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1122}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1124, false, 522, -1, 522, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1127, false, -1, 525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1130}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1132, false, 524, -1, 524, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1135, false, -1, 527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1138}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1140, false, 526, -1, 526, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1143, false, -1, 529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1146}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1148, false, 528, -1, 528, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1151, false, -1, 531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1154}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1156, false, 530, -1, 530, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1159, false, -1, 533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1162}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1164, false, 532, -1, 532, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1167, false, -1, 535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1170}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1172, false, 534, -1, 534, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1175, false, -1, 537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1178}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1180, false, 536, -1, 536, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1183, false, -1, 539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1186}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1188, false, 538, -1, 538, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1191}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 540, -1, 540, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1193, false, -1, 543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1196}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1198, false, 542, -1, 542, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1201}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1203}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 546, -1, 546, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1205}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 548, -1, 548, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1207, false, -1, 551, -1, 2520, -1, false, false, false, false, utf8proc_sequences + 1210}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1212, false, 550, -1, 550, 2580, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1215, false, -1, 553, -1, 9000, -1, false, false, false, false, utf8proc_sequences + 1218}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1220, false, 552, -1, 552, 9060, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1223, false, -1, 555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1226}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1228, false, 554, -1, 554, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1231, false, -1, 557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1234}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1236, false, 556, -1, 556, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1239, false, -1, 559, -1, 3480, -1, false, false, false, false, utf8proc_sequences + 1242}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1244, false, 558, -1, 558, 3540, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1247, false, -1, 561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1250}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1252, false, 560, -1, 560, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1255, false, -1, 563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1258}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1260, false, 562, -1, 562, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1263}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1265}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 571, -1, 571, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1267}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1269}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 578, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1271}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 577, -1, 577, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1273}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 649, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1275}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 652, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1277}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 583, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1279}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 582, -1, 582, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 585, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1281}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 584, -1, 584, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 587, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1283}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 586, -1, 586, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 589, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1285}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 588, -1, 588, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 591, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1287}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 590, -1, 590, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 385, -1, 385, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 390, -1, 390, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 393, -1, 393, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 394, -1, 394, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 399, -1, 399, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 400, -1, 400, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 403, -1, 403, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 404, -1, 404, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 407, -1, 407, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 406, -1, 406, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11362, -1, 11362, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 412, -1, 412, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 413, -1, 413, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 415, -1, 415, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11364, -1, 11364, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 422, -1, 422, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 425, -1, 425, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 430, -1, 430, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 580, -1, 580, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 433, -1, 433, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 434, -1, 434, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 581, -1, 581, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 439, -1, 439, 2940, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 0, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 2, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 3, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 7, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 8, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 10, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 4, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 46, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 5, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 12, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 11, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 14, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 15, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 47, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 48, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 13, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 40, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 45, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 39, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 16, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 6, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 9, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 42, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 44, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 43, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 41, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 1, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 51, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1317, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1319, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 49, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1321, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 1323, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 240, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, 921, -1, 921, -1, 50, false, false, false, true, utf8proc_sequences + 1326}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 233, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1021, -1, 1021, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1022, -1, 1022, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1023, -1, 1023, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1338, false, -1, 940, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1341}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 1343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1345, false, -1, 941, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1348}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1350, false, -1, 942, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1353}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1355, false, -1, 943, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1358}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1360, false, -1, 972, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1363}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1365, false, -1, 973, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1368}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1370, false, -1, 974, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1373}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1375, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 945, -1, 3660, -1, false, false, false, false, utf8proc_sequences + 1382}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 946, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1384}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 947, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1386}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 948, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1388}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 949, -1, 3720, -1, false, false, false, false, utf8proc_sequences + 1390}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 950, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1392}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 951, -1, 3780, -1, false, false, false, false, utf8proc_sequences + 1394}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 953, -1, 3840, -1, false, false, false, false, utf8proc_sequences + 1326}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1398}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1400}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 67}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1402}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 958, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1404}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 959, -1, 3900, -1, false, false, false, false, utf8proc_sequences + 1406}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 960, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1408}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 961, -1, 16260, -1, false, false, false, false, utf8proc_sequences + 1410}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 963, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1412}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 964, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1414}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 965, -1, 3960, -1, false, false, false, false, utf8proc_sequences + 1416}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 966, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1418}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 967, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1420}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 968, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1422}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 969, -1, 4020, -1, false, false, false, false, utf8proc_sequences + 1424}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1426, false, -1, 970, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1429}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1431, false, -1, 971, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1434}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1436, false, 902, -1, 902, 15780, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1439, false, 904, -1, 904, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1442, false, 905, -1, 905, 15960, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1445, false, 906, -1, 906, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1448, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 913, -1, 913, 4140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 914, -1, 914, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 915, -1, 915, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 916, -1, 916, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 917, -1, 917, 4200, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 918, -1, 918, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 919, -1, 919, 4260, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 920, -1, 920, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 921, -1, 921, 4320, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 922, -1, 922, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 923, -1, 923, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 924, -1, 924, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 925, -1, 925, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 926, -1, 926, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 927, -1, 927, 4500, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 928, -1, 928, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 929, -1, 929, 16200, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, utf8proc_sequences + 1412}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 931, -1, 931, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 932, -1, 932, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 933, -1, 933, 4440, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 934, -1, 934, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 935, -1, 935, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 936, -1, 936, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 937, -1, 937, 4560, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1455, false, 938, -1, 938, 4080, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1458, false, 939, -1, 939, 4380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1461, false, 908, -1, 908, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1464, false, 910, -1, 910, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1467, false, 911, -1, 911, 16380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1384, false, 914, -1, 914, -1, -1, false, false, false, false, utf8proc_sequences + 1384}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1396, false, 920, -1, 920, -1, -1, false, false, false, false, utf8proc_sequences + 1396}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1470, false, -1, -1, -1, 4620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1418, false, 934, -1, 934, -1, -1, false, false, false, false, utf8proc_sequences + 1418}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1408, false, 928, -1, 928, -1, -1, false, false, false, false, utf8proc_sequences + 1408}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 985, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1478}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 984, -1, 984, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1480}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 986, -1, 986, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1482}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 988, -1, 988, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1484}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 990, -1, 990, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 993, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1486}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 992, -1, 992, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 995, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1488}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 994, -1, 994, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 997, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1490}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 996, -1, 996, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 999, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1492}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 998, -1, 998, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1001, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1494}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1000, -1, 1000, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1496}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1002, -1, 1002, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1498}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1004, -1, 1004, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1007, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1500}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1006, -1, 1006, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1398, false, 922, -1, 922, -1, -1, false, false, false, false, utf8proc_sequences + 1398}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1410, false, 929, -1, 929, -1, -1, false, false, false, false, utf8proc_sequences + 1410}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1502, false, 1017, -1, 1017, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1504, false, -1, 952, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1396}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1390, false, 917, -1, 917, -1, -1, false, false, false, false, utf8proc_sequences + 1390}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1016, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1506}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1015, -1, 1015, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 1508, false, -1, 1010, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1510}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1512}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1018, -1, 1018, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1514}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 892, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1516}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1518}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1520, false, -1, 1104, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1523}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1525, false, -1, 1105, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1528}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1106, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1530}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1532, false, -1, 1107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1535}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1108, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1537}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1109, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1539}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1110, -1, 4800, -1, false, false, false, false, utf8proc_sequences + 1541}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1543, false, -1, 1111, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1546}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1548}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1550}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1114, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1552}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1554}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1556, false, -1, 1116, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1559}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1561, false, -1, 1117, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1564}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1566, false, -1, 1118, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1569}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1119, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1571}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1072, -1, 5640, -1, false, false, false, false, utf8proc_sequences + 1573}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1073, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1575}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1074, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1577}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1075, -1, 4740, -1, false, false, false, false, utf8proc_sequences + 1579}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1076, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1581}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1077, -1, 4680, -1, false, false, false, false, utf8proc_sequences + 1583}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1078, -1, 5520, -1, false, false, false, false, utf8proc_sequences + 1585}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1079, -1, 5880, -1, false, false, false, false, utf8proc_sequences + 1587}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1080, -1, 4920, -1, false, false, false, false, utf8proc_sequences + 1589}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1591, false, -1, 1081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1594}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1082, -1, 4860, -1, false, false, false, false, utf8proc_sequences + 1596}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1598}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1600}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1602}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1086, -1, 6000, -1, false, false, false, false, utf8proc_sequences + 1604}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1606}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1088, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1608}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1089, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1610}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1090, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1612}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1091, -1, 4980, -1, false, false, false, false, utf8proc_sequences + 1614}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1092, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1616}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1093, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1618}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1094, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1620}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1095, -1, 6360, -1, false, false, false, false, utf8proc_sequences + 1622}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1624}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1626}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1628}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1099, -1, 6480, -1, false, false, false, false, utf8proc_sequences + 1630}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1632}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1101, -1, 6240, -1, false, false, false, false, utf8proc_sequences + 1634}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1636}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1638}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1040, -1, 1040, 5700, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1041, -1, 1041, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1042, -1, 1042, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1043, -1, 1043, 5160, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1044, -1, 1044, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1045, -1, 1045, 5100, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1046, -1, 1046, 5580, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1047, -1, 1047, 5940, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1048, -1, 1048, 5040, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1640, false, 1049, -1, 1049, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1050, -1, 1050, 5280, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1051, -1, 1051, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1052, -1, 1052, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1053, -1, 1053, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1054, -1, 1054, 6060, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1055, -1, 1055, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1056, -1, 1056, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1057, -1, 1057, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1058, -1, 1058, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1059, -1, 1059, 5340, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1060, -1, 1060, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1061, -1, 1061, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1062, -1, 1062, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1063, -1, 1063, 6420, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1064, -1, 1064, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1065, -1, 1065, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1066, -1, 1066, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1067, -1, 1067, 6540, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1068, -1, 1068, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1069, -1, 1069, 6300, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1070, -1, 1070, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1071, -1, 1071, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1643, false, 1024, -1, 1024, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1646, false, 1025, -1, 1025, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1026, -1, 1026, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1649, false, 1027, -1, 1027, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1028, -1, 1028, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1029, -1, 1029, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1030, -1, 1030, 5220, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1652, false, 1031, -1, 1031, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1032, -1, 1032, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1033, -1, 1033, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1034, -1, 1034, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1035, -1, 1035, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1655, false, 1036, -1, 1036, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1658, false, 1037, -1, 1037, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1661, false, 1038, -1, 1038, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1039, -1, 1039, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1121, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1664}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1120, -1, 1120, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1123, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1666}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1122, -1, 1122, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1125, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1668}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1124, -1, 1124, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1127, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1670}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1126, -1, 1126, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1129, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1672}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1128, -1, 1128, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1674}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1130, -1, 1130, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1133, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1676}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1132, -1, 1132, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1135, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1678}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1134, -1, 1134, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1137, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1680}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1136, -1, 1136, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1139, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1682}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1138, -1, 1138, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1141, -1, 5400, -1, false, false, false, false, utf8proc_sequences + 1684}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1140, -1, 1140, 5460, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1686, false, -1, 1143, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1689}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1691, false, 1142, -1, 1142, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1694}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1144, -1, 1144, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1147, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1696}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1146, -1, 1146, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1149, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1698}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1148, -1, 1148, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1151, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1700}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1150, -1, 1150, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1153, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1702}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1152, -1, 1152, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ME, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1163, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1704}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1162, -1, 1162, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1706}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1164, -1, 1164, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1167, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1708}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1166, -1, 1166, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1169, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1710}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1168, -1, 1168, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1171, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1712}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1170, -1, 1170, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1173, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1714}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1172, -1, 1172, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1175, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1716}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1174, -1, 1174, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1177, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1718}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1176, -1, 1176, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1720}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1178, -1, 1178, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1181, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1722}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1180, -1, 1180, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1183, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1724}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1182, -1, 1182, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1185, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1726}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1184, -1, 1184, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1187, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1728}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1186, -1, 1186, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1189, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1730}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1188, -1, 1188, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1191, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1732}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1190, -1, 1190, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1193, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1734}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1192, -1, 1192, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1195, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1736}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1194, -1, 1194, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1197, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1738}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1196, -1, 1196, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1199, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1740}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1198, -1, 1198, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1201, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1742}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1200, -1, 1200, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1203, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1744}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1202, -1, 1202, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1205, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1746}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1204, -1, 1204, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1207, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1748}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1206, -1, 1206, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1209, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1750}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1208, -1, 1208, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1211, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1752}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1210, -1, 1210, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1213, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1754}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1212, -1, 1212, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1215, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1756}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1214, -1, 1214, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1231, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1758}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1760, false, -1, 1218, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1763}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1765, false, 1217, -1, 1217, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1220, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1768}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1219, -1, 1219, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1222, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1770}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1221, -1, 1221, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1224, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1772}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1223, -1, 1223, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1226, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1774}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1225, -1, 1225, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1228, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1776}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1227, -1, 1227, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1230, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1778}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1229, -1, 1229, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1216, -1, 1216, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1780, false, -1, 1233, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1783}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1785, false, 1232, -1, 1232, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1788, false, -1, 1235, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1791}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1793, false, 1234, -1, 1234, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1237, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1796}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1236, -1, 1236, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1798, false, -1, 1239, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1801}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1803, false, 1238, -1, 1238, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1241, -1, 5760, -1, false, false, false, false, utf8proc_sequences + 1806}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1240, -1, 1240, 5820, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1808, false, -1, 1243, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1811}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1813, false, 1242, -1, 1242, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1816, false, -1, 1245, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1819}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1821, false, 1244, -1, 1244, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1824, false, -1, 1247, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1827}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1829, false, 1246, -1, 1246, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1249, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1832}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1248, -1, 1248, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1834, false, -1, 1251, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1837}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1839, false, 1250, -1, 1250, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1842, false, -1, 1253, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1845}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1847, false, 1252, -1, 1252, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1850, false, -1, 1255, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1853}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1855, false, 1254, -1, 1254, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1257, -1, 6120, -1, false, false, false, false, utf8proc_sequences + 1858}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1256, -1, 1256, 6180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1860, false, -1, 1259, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1863}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1865, false, 1258, -1, 1258, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1868, false, -1, 1261, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1871}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1873, false, 1260, -1, 1260, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1876, false, -1, 1263, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1879}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1881, false, 1262, -1, 1262, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1884, false, -1, 1265, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1887}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1889, false, 1264, -1, 1264, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1892, false, -1, 1267, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1895}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1897, false, 1266, -1, 1266, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1900, false, -1, 1269, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1903}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1905, false, 1268, -1, 1268, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1271, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1908}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1270, -1, 1270, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1910, false, -1, 1273, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1913}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1915, false, 1272, -1, 1272, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1275, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1918}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1274, -1, 1274, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1277, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1920}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1276, -1, 1276, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1279, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1922}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1278, -1, 1278, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1281, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1924}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1280, -1, 1280, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1283, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1926}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1282, -1, 1282, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1285, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1928}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1284, -1, 1284, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1287, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1930}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1286, -1, 1286, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1289, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1932}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1288, -1, 1288, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1291, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1934}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1290, -1, 1290, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1293, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1936}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1292, -1, 1292, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1295, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1938}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1294, -1, 1294, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1297, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1940}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1296, -1, 1296, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1299, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1942}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1298, -1, 1298, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1377, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1944}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1378, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1946}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1379, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1948}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1380, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1950}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1381, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1952}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1954}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1383, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1956}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1384, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1958}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1385, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1960}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1386, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1962}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1387, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1964}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1388, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1966}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1389, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1968}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1390, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1970}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1391, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1972}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1392, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1974}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1976}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1394, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1978}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1980}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1396, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1982}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1984}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1398, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1986}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1988}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1400, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1990}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1992}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1402, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1994}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1996}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1404, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1998}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2000}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1406, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2002}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2004}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1408, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2006}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2008}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1410, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2010}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2012}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1412, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2014}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2016}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 1414, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2018}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1329, -1, 1329, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1330, -1, 1330, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1331, -1, 1331, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1332, -1, 1332, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1333, -1, 1333, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1334, -1, 1334, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1335, -1, 1335, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1336, -1, 1336, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1337, -1, 1337, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1338, -1, 1338, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1339, -1, 1339, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1340, -1, 1340, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1341, -1, 1341, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1342, -1, 1342, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1343, -1, 1343, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1344, -1, 1344, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1345, -1, 1345, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1346, -1, 1346, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1347, -1, 1347, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1348, -1, 1348, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1349, -1, 1349, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1350, -1, 1350, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1351, -1, 1351, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1352, -1, 1352, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1353, -1, 1353, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1354, -1, 1354, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1355, -1, 1355, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1356, -1, 1356, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1357, -1, 1357, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1358, -1, 1358, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1359, -1, 1359, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1360, -1, 1360, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1361, -1, 1361, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1362, -1, 1362, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1363, -1, 1363, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1364, -1, 1364, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1365, -1, 1365, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 1366, -1, 1366, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2020, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2020}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 222, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 228, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 10, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 11, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 12, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 13, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 14, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 15, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 16, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 17, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 18, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 19, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 20, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 21, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 22, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 23, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 24, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 25, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6600, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6660, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6720, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 27, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 28, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 29, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 30, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 31, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 32, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 33, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 34, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 17, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 18, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 220, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 19, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_AN, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 35, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6840, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, utf8proc_sequences + 2056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, 6780, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_AL, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 36, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 6960, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7020, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7080, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 20, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2068, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2071, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2074, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2077, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2080, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2083, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2086, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2089, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 7, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 21, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 22, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2098, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2101, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2104, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2107, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2110, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2113, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2116, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2119, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2122, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 24, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7200, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 23, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 25, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2134, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2137, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7260, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 27, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7320, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 26, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 7440, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2152, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 84, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 91, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 28, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7500, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 31, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7560, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2164, false, -1, -1, -1, 7620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 29, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 30, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 32, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7680, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7740, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 33, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 34, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 35, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7800, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2182, false, -1, -1, -1, 7860, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 36, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 103, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 107, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 118, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 122, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 2203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 216, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2205, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2208, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2211, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2214, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2217, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2220, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 129, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 130, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2223, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 132, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2226, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2229, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2232, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2235, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2238, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2241, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2244, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2247, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2250, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2253, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2256, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, utf8proc_sequences + 2259, false, -1, -1, -1, -1, -1, true, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7920, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 37, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11520, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2265}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11521, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2267}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11522, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2269}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11523, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2271}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11524, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2273}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11525, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2275}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2277}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11527, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2279}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11528, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2281}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11529, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2283}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11530, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2285}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11531, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2287}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11532, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2289}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11533, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2291}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11534, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2293}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11535, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2295}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11536, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2297}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11537, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2299}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11538, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2301}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11539, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2303}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11540, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2305}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11541, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2307}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11542, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2309}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11543, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2311}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11544, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2313}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11545, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2315}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11546, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2317}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11547, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2319}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11548, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2321}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2323}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11550, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2325}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11551, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2327}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11552, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2329}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11553, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2331}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11554, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2333}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11555, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2335}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11556, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2337}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11557, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2339}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 7980, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8040, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8100, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8160, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8220, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8280, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 38, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8340, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8400, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8460, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 8520, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, 8580, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11363, -1, 11363, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 2474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2476, false, -1, 7681, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2479}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2481, false, 7680, -1, 7680, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2484, false, -1, 7683, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2487}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2489, false, 7682, -1, 7682, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2492, false, -1, 7685, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2495}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2497, false, 7684, -1, 7684, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2500, false, -1, 7687, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2503}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2505, false, 7686, -1, 7686, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2508, false, -1, 7689, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2511}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2513, false, 7688, -1, 7688, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2516, false, -1, 7691, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2519}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2521, false, 7690, -1, 7690, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2524, false, -1, 7693, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2527}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2529, false, 7692, -1, 7692, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2532, false, -1, 7695, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2535}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2537, false, 7694, -1, 7694, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2540, false, -1, 7697, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2543}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2545, false, 7696, -1, 7696, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2548, false, -1, 7699, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2551}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2553, false, 7698, -1, 7698, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2556, false, -1, 7701, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2559}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2561, false, 7700, -1, 7700, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2564, false, -1, 7703, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2567}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2569, false, 7702, -1, 7702, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2572, false, -1, 7705, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2575}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2577, false, 7704, -1, 7704, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2580, false, -1, 7707, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2583}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2585, false, 7706, -1, 7706, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2588, false, -1, 7709, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2591}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2593, false, 7708, -1, 7708, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2596, false, -1, 7711, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2599}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2601, false, 7710, -1, 7710, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2604, false, -1, 7713, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2607}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2609, false, 7712, -1, 7712, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2612, false, -1, 7715, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2615}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2617, false, 7714, -1, 7714, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2620, false, -1, 7717, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2623}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2625, false, 7716, -1, 7716, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2628, false, -1, 7719, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2631}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2633, false, 7718, -1, 7718, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2636, false, -1, 7721, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2639}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2641, false, 7720, -1, 7720, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2644, false, -1, 7723, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2647}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2649, false, 7722, -1, 7722, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2652, false, -1, 7725, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2655}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2657, false, 7724, -1, 7724, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2660, false, -1, 7727, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2663}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2665, false, 7726, -1, 7726, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2668, false, -1, 7729, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2671}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2673, false, 7728, -1, 7728, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2676, false, -1, 7731, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2679}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2681, false, 7730, -1, 7730, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2684, false, -1, 7733, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2687}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2689, false, 7732, -1, 7732, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2692, false, -1, 7735, -1, 9360, -1, false, false, false, false, utf8proc_sequences + 2695}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2697, false, 7734, -1, 7734, 9420, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2700, false, -1, 7737, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2703}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2705, false, 7736, -1, 7736, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2708, false, -1, 7739, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2711}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2713, false, 7738, -1, 7738, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2716, false, -1, 7741, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2719}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2721, false, 7740, -1, 7740, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2724, false, -1, 7743, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2727}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2729, false, 7742, -1, 7742, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2732, false, -1, 7745, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2735}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2737, false, 7744, -1, 7744, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2740, false, -1, 7747, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2743}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2745, false, 7746, -1, 7746, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2748, false, -1, 7749, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2751}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2753, false, 7748, -1, 7748, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2756, false, -1, 7751, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2759}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2761, false, 7750, -1, 7750, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2764, false, -1, 7753, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2767}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2769, false, 7752, -1, 7752, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2772, false, -1, 7755, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2775}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2777, false, 7754, -1, 7754, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2780, false, -1, 7757, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2783}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2785, false, 7756, -1, 7756, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2788, false, -1, 7759, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2791}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2793, false, 7758, -1, 7758, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2796, false, -1, 7761, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2799}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2801, false, 7760, -1, 7760, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2804, false, -1, 7763, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2807}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2809, false, 7762, -1, 7762, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2812, false, -1, 7765, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2815}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2817, false, 7764, -1, 7764, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2820, false, -1, 7767, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2823}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2825, false, 7766, -1, 7766, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2828, false, -1, 7769, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2831}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2833, false, 7768, -1, 7768, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2836, false, -1, 7771, -1, 9840, -1, false, false, false, false, utf8proc_sequences + 2839}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2841, false, 7770, -1, 7770, 9900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2844, false, -1, 7773, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2847}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2849, false, 7772, -1, 7772, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2852, false, -1, 7775, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2855}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2857, false, 7774, -1, 7774, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2860, false, -1, 7777, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2863}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2865, false, 7776, -1, 7776, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2868, false, -1, 7779, -1, 10200, -1, false, false, false, false, utf8proc_sequences + 2871}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2873, false, 7778, -1, 7778, 10260, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2876, false, -1, 7781, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2879}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2881, false, 7780, -1, 7780, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2884, false, -1, 7783, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2887}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2889, false, 7782, -1, 7782, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2892, false, -1, 7785, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2895}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2897, false, 7784, -1, 7784, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2900, false, -1, 7787, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2903}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2905, false, 7786, -1, 7786, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2908, false, -1, 7789, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2911}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2913, false, 7788, -1, 7788, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2916, false, -1, 7791, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2919}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2921, false, 7790, -1, 7790, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2924, false, -1, 7793, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2927}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2929, false, 7792, -1, 7792, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2932, false, -1, 7795, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2935}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2937, false, 7794, -1, 7794, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2940, false, -1, 7797, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2943}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2945, false, 7796, -1, 7796, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2948, false, -1, 7799, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2951}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2953, false, 7798, -1, 7798, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2956, false, -1, 7801, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2959}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2961, false, 7800, -1, 7800, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2964, false, -1, 7803, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2967}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2969, false, 7802, -1, 7802, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2972, false, -1, 7805, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2975}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2977, false, 7804, -1, 7804, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2980, false, -1, 7807, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2983}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2985, false, 7806, -1, 7806, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2988, false, -1, 7809, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2991}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2993, false, 7808, -1, 7808, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2996, false, -1, 7811, -1, -1, -1, false, false, false, false, utf8proc_sequences + 2999}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3001, false, 7810, -1, 7810, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3004, false, -1, 7813, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3007}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3009, false, 7812, -1, 7812, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3012, false, -1, 7815, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3015}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3017, false, 7814, -1, 7814, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3020, false, -1, 7817, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3023}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3025, false, 7816, -1, 7816, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3028, false, -1, 7819, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3031}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3033, false, 7818, -1, 7818, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3036, false, -1, 7821, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3039}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3041, false, 7820, -1, 7820, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3044, false, -1, 7823, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3047}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3049, false, 7822, -1, 7822, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3052, false, -1, 7825, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3055}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3057, false, 7824, -1, 7824, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3060, false, -1, 7827, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3063}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3065, false, 7826, -1, 7826, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3068, false, -1, 7829, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3071}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3073, false, 7828, -1, 7828, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3076, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3076}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3079, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3079}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3082, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3082}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3085, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3085}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 3088, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3088}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3091, false, 7776, -1, 7776, -1, -1, false, false, false, false, utf8proc_sequences + 2863}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3094, false, -1, 7841, -1, 10980, -1, false, false, false, false, utf8proc_sequences + 3097}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3099, false, 7840, -1, 7840, 11040, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3102, false, -1, 7843, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3105}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3107, false, 7842, -1, 7842, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3110, false, -1, 7845, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3113}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3115, false, 7844, -1, 7844, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3118, false, -1, 7847, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3121}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3123, false, 7846, -1, 7846, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3126, false, -1, 7849, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3129}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3131, false, 7848, -1, 7848, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3134, false, -1, 7851, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3137}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3139, false, 7850, -1, 7850, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3142, false, -1, 7853, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3145}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3147, false, 7852, -1, 7852, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3150, false, -1, 7855, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3153}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3155, false, 7854, -1, 7854, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3158, false, -1, 7857, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3161}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3163, false, 7856, -1, 7856, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3166, false, -1, 7859, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3169}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3171, false, 7858, -1, 7858, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3174, false, -1, 7861, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3177}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3179, false, 7860, -1, 7860, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3182, false, -1, 7863, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3185}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3187, false, 7862, -1, 7862, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3190, false, -1, 7865, -1, 11340, -1, false, false, false, false, utf8proc_sequences + 3193}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3195, false, 7864, -1, 7864, 11400, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3198, false, -1, 7867, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3201}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3203, false, 7866, -1, 7866, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3206, false, -1, 7869, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3209}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3211, false, 7868, -1, 7868, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3214, false, -1, 7871, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3217}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3219, false, 7870, -1, 7870, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3222, false, -1, 7873, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3225}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3227, false, 7872, -1, 7872, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3230, false, -1, 7875, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3233}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3235, false, 7874, -1, 7874, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3238, false, -1, 7877, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3241}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3243, false, 7876, -1, 7876, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3246, false, -1, 7879, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3249}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3251, false, 7878, -1, 7878, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3254, false, -1, 7881, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3257}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3259, false, 7880, -1, 7880, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3262, false, -1, 7883, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3265}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3267, false, 7882, -1, 7882, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3270, false, -1, 7885, -1, 11580, -1, false, false, false, false, utf8proc_sequences + 3273}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3275, false, 7884, -1, 7884, 11640, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3278, false, -1, 7887, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3281}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3283, false, 7886, -1, 7886, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3286, false, -1, 7889, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3289}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3291, false, 7888, -1, 7888, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3294, false, -1, 7891, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3297}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3299, false, 7890, -1, 7890, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3302, false, -1, 7893, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3305}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3307, false, 7892, -1, 7892, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3310, false, -1, 7895, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3313}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3315, false, 7894, -1, 7894, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3318, false, -1, 7897, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3321}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3323, false, 7896, -1, 7896, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3326, false, -1, 7899, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3329}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3331, false, 7898, -1, 7898, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3334, false, -1, 7901, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3337}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3339, false, 7900, -1, 7900, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3342, false, -1, 7903, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3345}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3347, false, 7902, -1, 7902, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3350, false, -1, 7905, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3353}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3355, false, 7904, -1, 7904, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3358, false, -1, 7907, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3361}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3363, false, 7906, -1, 7906, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3366, false, -1, 7909, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3369}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3371, false, 7908, -1, 7908, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3374, false, -1, 7911, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3377}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3379, false, 7910, -1, 7910, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3382, false, -1, 7913, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3385}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3387, false, 7912, -1, 7912, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3390, false, -1, 7915, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3393}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3395, false, 7914, -1, 7914, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3398, false, -1, 7917, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3401}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3403, false, 7916, -1, 7916, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3406, false, -1, 7919, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3409}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3411, false, 7918, -1, 7918, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3414, false, -1, 7921, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3417}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3419, false, 7920, -1, 7920, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3422, false, -1, 7923, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3425}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3427, false, 7922, -1, 7922, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3430, false, -1, 7925, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3433}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3435, false, 7924, -1, 7924, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3438, false, -1, 7927, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3441}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3443, false, 7926, -1, 7926, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3446, false, -1, 7929, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3449}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3451, false, 7928, -1, 7928, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3454, false, 7944, -1, 7944, 11940, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3457, false, 7945, -1, 7945, 12000, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3460, false, 7946, -1, 7946, 13560, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3463, false, 7947, -1, 7947, 13620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3466, false, 7948, -1, 7948, 13680, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3469, false, 7949, -1, 7949, 13740, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3472, false, 7950, -1, 7950, 13800, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3475, false, 7951, -1, 7951, 13860, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3478, false, -1, 7936, -1, 12060, -1, false, false, false, false, utf8proc_sequences + 3481}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3483, false, -1, 7937, -1, 12120, -1, false, false, false, false, utf8proc_sequences + 3486}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3488, false, -1, 7938, -1, 13920, -1, false, false, false, false, utf8proc_sequences + 3491}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3493, false, -1, 7939, -1, 13980, -1, false, false, false, false, utf8proc_sequences + 3496}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3498, false, -1, 7940, -1, 14040, -1, false, false, false, false, utf8proc_sequences + 3501}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3503, false, -1, 7941, -1, 14100, -1, false, false, false, false, utf8proc_sequences + 3506}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3508, false, -1, 7942, -1, 14160, -1, false, false, false, false, utf8proc_sequences + 3511}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3513, false, -1, 7943, -1, 14220, -1, false, false, false, false, utf8proc_sequences + 3516}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3518, false, 7960, -1, 7960, 12180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3521, false, 7961, -1, 7961, 12240, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3524, false, 7962, -1, 7962, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3527, false, 7963, -1, 7963, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3530, false, 7964, -1, 7964, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3533, false, 7965, -1, 7965, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3536, false, -1, 7952, -1, 12300, -1, false, false, false, false, utf8proc_sequences + 3539}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3541, false, -1, 7953, -1, 12360, -1, false, false, false, false, utf8proc_sequences + 3544}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3546, false, -1, 7954, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3549}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3551, false, -1, 7955, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3554}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3556, false, -1, 7956, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3559}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3561, false, -1, 7957, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3564}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3566, false, 7976, -1, 7976, 12420, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3569, false, 7977, -1, 7977, 12480, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3572, false, 7978, -1, 7978, 14280, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3575, false, 7979, -1, 7979, 14340, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3578, false, 7980, -1, 7980, 14400, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3581, false, 7981, -1, 7981, 14460, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3584, false, 7982, -1, 7982, 14520, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3587, false, 7983, -1, 7983, 14580, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3590, false, -1, 7968, -1, 12540, -1, false, false, false, false, utf8proc_sequences + 3593}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3595, false, -1, 7969, -1, 12600, -1, false, false, false, false, utf8proc_sequences + 3598}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3600, false, -1, 7970, -1, 14640, -1, false, false, false, false, utf8proc_sequences + 3603}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3605, false, -1, 7971, -1, 14700, -1, false, false, false, false, utf8proc_sequences + 3608}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3610, false, -1, 7972, -1, 14760, -1, false, false, false, false, utf8proc_sequences + 3613}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3615, false, -1, 7973, -1, 14820, -1, false, false, false, false, utf8proc_sequences + 3618}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3620, false, -1, 7974, -1, 14880, -1, false, false, false, false, utf8proc_sequences + 3623}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3625, false, -1, 7975, -1, 14940, -1, false, false, false, false, utf8proc_sequences + 3628}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3630, false, 7992, -1, 7992, 12660, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3633, false, 7993, -1, 7993, 12720, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3636, false, 7994, -1, 7994, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3639, false, 7995, -1, 7995, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3642, false, 7996, -1, 7996, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3645, false, 7997, -1, 7997, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3648, false, 7998, -1, 7998, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3651, false, 7999, -1, 7999, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3654, false, -1, 7984, -1, 12780, -1, false, false, false, false, utf8proc_sequences + 3657}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3659, false, -1, 7985, -1, 12840, -1, false, false, false, false, utf8proc_sequences + 3662}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3664, false, -1, 7986, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3667}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3669, false, -1, 7987, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3672}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3674, false, -1, 7988, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3677}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3679, false, -1, 7989, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3682}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3684, false, -1, 7990, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3687}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3689, false, -1, 7991, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3692}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3694, false, 8008, -1, 8008, 12900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3697, false, 8009, -1, 8009, 12960, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3700, false, 8010, -1, 8010, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3703, false, 8011, -1, 8011, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3706, false, 8012, -1, 8012, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3709, false, 8013, -1, 8013, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3712, false, -1, 8000, -1, 13020, -1, false, false, false, false, utf8proc_sequences + 3715}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3717, false, -1, 8001, -1, 13080, -1, false, false, false, false, utf8proc_sequences + 3720}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3722, false, -1, 8002, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3725}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3727, false, -1, 8003, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3730}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3732, false, -1, 8004, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3735}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3737, false, -1, 8005, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3740}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3742, false, -1, -1, -1, 13140, -1, false, false, false, false, utf8proc_sequences + 3742}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3745, false, 8025, -1, 8025, 13200, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3751}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3755, false, 8027, -1, 8027, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3761}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3765, false, 8029, -1, 8029, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3771}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3775, false, 8031, -1, 8031, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3778, false, -1, 8017, -1, 13260, -1, false, false, false, false, utf8proc_sequences + 3781}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3783, false, -1, 8019, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3786}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3788, false, -1, 8021, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3791}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3793, false, -1, 8023, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3796}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3798, false, 8040, -1, 8040, 13320, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3801, false, 8041, -1, 8041, 13380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3804, false, 8042, -1, 8042, 15000, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3807, false, 8043, -1, 8043, 15060, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3810, false, 8044, -1, 8044, 15120, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3813, false, 8045, -1, 8045, 15180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3816, false, 8046, -1, 8046, 15240, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3819, false, 8047, -1, 8047, 15300, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3822, false, -1, 8032, -1, 13440, -1, false, false, false, false, utf8proc_sequences + 3825}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3827, false, -1, 8033, -1, 13500, -1, false, false, false, false, utf8proc_sequences + 3830}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3832, false, -1, 8034, -1, 15360, -1, false, false, false, false, utf8proc_sequences + 3835}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3837, false, -1, 8035, -1, 15420, -1, false, false, false, false, utf8proc_sequences + 3840}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3842, false, -1, 8036, -1, 15480, -1, false, false, false, false, utf8proc_sequences + 3845}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3847, false, -1, 8037, -1, 15540, -1, false, false, false, false, utf8proc_sequences + 3850}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3852, false, -1, 8038, -1, 15600, -1, false, false, false, false, utf8proc_sequences + 3855}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3857, false, -1, 8039, -1, 15660, -1, false, false, false, false, utf8proc_sequences + 3860}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3862, false, 8122, -1, 8122, 15720, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1341, false, 8123, -1, 8123, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3865, false, 8136, -1, 8136, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1348, false, 8137, -1, 8137, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3868, false, 8138, -1, 8138, 15900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1353, false, 8139, -1, 8139, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3871, false, 8154, -1, 8154, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1358, false, 8155, -1, 8155, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3874, false, 8184, -1, 8184, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1363, false, 8185, -1, 8185, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3877, false, 8170, -1, 8170, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1368, false, 8171, -1, 8171, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3880, false, 8186, -1, 8186, 16320, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1373, false, 8187, -1, 8187, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3883, false, 8072, -1, 8072, -1, -1, false, false, false, false, utf8proc_sequences + 3886}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3889, false, 8073, -1, 8073, -1, -1, false, false, false, false, utf8proc_sequences + 3892}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3895, false, 8074, -1, 8074, -1, -1, false, false, false, false, utf8proc_sequences + 3898}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3901, false, 8075, -1, 8075, -1, -1, false, false, false, false, utf8proc_sequences + 3904}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3907, false, 8076, -1, 8076, -1, -1, false, false, false, false, utf8proc_sequences + 3910}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3913, false, 8077, -1, 8077, -1, -1, false, false, false, false, utf8proc_sequences + 3916}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3919, false, 8078, -1, 8078, -1, -1, false, false, false, false, utf8proc_sequences + 3922}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3925, false, 8079, -1, 8079, -1, -1, false, false, false, false, utf8proc_sequences + 3928}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3931, false, -1, 8064, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3934}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3936, false, -1, 8065, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3939}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3941, false, -1, 8066, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3944}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3946, false, -1, 8067, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3949}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3951, false, -1, 8068, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3954}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3956, false, -1, 8069, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3959}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3961, false, -1, 8070, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3964}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3966, false, -1, 8071, -1, -1, -1, false, false, false, false, utf8proc_sequences + 3969}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3971, false, 8088, -1, 8088, -1, -1, false, false, false, false, utf8proc_sequences + 3974}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3977, false, 8089, -1, 8089, -1, -1, false, false, false, false, utf8proc_sequences + 3980}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3983, false, 8090, -1, 8090, -1, -1, false, false, false, false, utf8proc_sequences + 3986}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3989, false, 8091, -1, 8091, -1, -1, false, false, false, false, utf8proc_sequences + 3992}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 3995, false, 8092, -1, 8092, -1, -1, false, false, false, false, utf8proc_sequences + 3998}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4001, false, 8093, -1, 8093, -1, -1, false, false, false, false, utf8proc_sequences + 4004}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4007, false, 8094, -1, 8094, -1, -1, false, false, false, false, utf8proc_sequences + 4010}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4013, false, 8095, -1, 8095, -1, -1, false, false, false, false, utf8proc_sequences + 4016}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4019, false, -1, 8080, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4022}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4024, false, -1, 8081, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4027}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4029, false, -1, 8082, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4032}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4034, false, -1, 8083, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4037}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4039, false, -1, 8084, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4042}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4044, false, -1, 8085, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4047}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4049, false, -1, 8086, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4052}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4054, false, -1, 8087, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4057}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4059, false, 8104, -1, 8104, -1, -1, false, false, false, false, utf8proc_sequences + 4062}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4065, false, 8105, -1, 8105, -1, -1, false, false, false, false, utf8proc_sequences + 4068}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4071, false, 8106, -1, 8106, -1, -1, false, false, false, false, utf8proc_sequences + 4074}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4077, false, 8107, -1, 8107, -1, -1, false, false, false, false, utf8proc_sequences + 4080}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4083, false, 8108, -1, 8108, -1, -1, false, false, false, false, utf8proc_sequences + 4086}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4089, false, 8109, -1, 8109, -1, -1, false, false, false, false, utf8proc_sequences + 4092}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4095, false, 8110, -1, 8110, -1, -1, false, false, false, false, utf8proc_sequences + 4098}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4101, false, 8111, -1, 8111, -1, -1, false, false, false, false, utf8proc_sequences + 4104}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4107, false, -1, 8096, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4110}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4112, false, -1, 8097, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4115}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4117, false, -1, 8098, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4120}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4122, false, -1, 8099, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4125}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4127, false, -1, 8100, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4130}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4132, false, -1, 8101, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4135}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4137, false, -1, 8102, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4140}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4142, false, -1, 8103, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4145}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4147, false, 8120, -1, 8120, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4150, false, 8121, -1, 8121, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4153, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4156}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4159, false, 8124, -1, 8124, -1, -1, false, false, false, false, utf8proc_sequences + 4162}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4165, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4168}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4171, false, -1, -1, -1, 15840, -1, false, false, false, false, utf8proc_sequences + 4171}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4174, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4177}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4181, false, -1, 8112, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4184}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4186, false, -1, 8113, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4189}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4191, false, -1, 8048, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4194}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4196, false, -1, 8049, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4198}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4200, false, -1, 8115, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4203}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 1326, false, 921, -1, 921, -1, -1, false, false, false, false, utf8proc_sequences + 1326}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4205, false, -1, -1, -1, 16080, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4214, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4217}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4220, false, 8140, -1, 8140, -1, -1, false, false, false, false, utf8proc_sequences + 4223}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4226, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4229}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4232, false, -1, -1, -1, 16020, -1, false, false, false, false, utf8proc_sequences + 4232}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4235, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4238}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4242, false, -1, 8050, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4245}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4247, false, -1, 8051, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4249}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4251, false, -1, 8052, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4254}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4256, false, -1, 8053, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4258}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4260, false, -1, 8131, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4263}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4274, false, 8152, -1, 8152, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4277, false, 8153, -1, 8153, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4280, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4283}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4287, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1378}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4289, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4289}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4292, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4295}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4299, false, -1, 8144, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4302}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4304, false, -1, 8145, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4307}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4309, false, -1, 8054, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4312}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4314, false, -1, 8055, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4316}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4327, false, 8168, -1, 8168, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4330, false, 8169, -1, 8169, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4333, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4336}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4340, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1451}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4342, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4342}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4345, false, 8172, -1, 8172, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4348, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4348}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4351, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4354}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4358, false, -1, 8160, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4361}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4363, false, -1, 8161, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4366}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4368, false, -1, 8058, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4371}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4373, false, -1, 8059, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4375}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4377, false, -1, 8165, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4380}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4389, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4392}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4395, false, 8188, -1, 8188, -1, -1, false, false, false, false, utf8proc_sequences + 4398}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4401, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4404}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4407, false, -1, -1, -1, 16440, -1, false, false, false, false, utf8proc_sequences + 4407}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4410, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4413}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4417, false, -1, 8056, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4420}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4422, false, -1, 8057, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4424}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4426, false, -1, 8060, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4429}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4431, false, -1, 8061, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4433}, + {UTF8PROC_CATEGORY_LT, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4435, false, -1, 8179, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4438}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4442, false, -1, -1, -1, 16140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, 0, utf8proc_sequences + 4447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, true, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NOBREAK, utf8proc_sequences + 4449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZL, 0, UTF8PROC_BIDI_CLASS_WS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, + {UTF8PROC_CATEGORY_ZP, 0, UTF8PROC_BIDI_CLASS_B, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLE, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_PDF, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_LRO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_RLO, 0, NULL, false, -1, -1, -1, -1, -1, false, true, true, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_CS, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, utf8proc_sequences + 792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 12, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 14, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 22, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 4562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4567, false, -1, 969, -1, -1, -1, false, false, false, false, utf8proc_sequences + 1424}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 2396, false, -1, 107, -1, -1, -1, false, false, false, false, utf8proc_sequences + 20}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 4569, false, -1, 229, -1, -1, -1, false, false, false, false, utf8proc_sequences + 114}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8526, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4573}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 28, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 16, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4591, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 6, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 18, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8498, -1, 8498, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FRACTION, utf8proc_sequences + 4641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2392, false, -1, 8560, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4644}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4646, false, -1, 8561, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4649}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4651, false, -1, 8562, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4655}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4657, false, -1, 8563, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4660}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4662, false, -1, 8564, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4664}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4666, false, -1, 8565, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4669}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4671, false, -1, 8566, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4675}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4677, false, -1, 8567, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4682}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4684, false, -1, 8568, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4687}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4689, false, -1, 8569, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4691}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4693, false, -1, 8570, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4696}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4698, false, -1, 8571, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4702}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2398, false, -1, 8572, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4704}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4532, false, -1, 8573, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4706}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2382, false, -1, 8574, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4708}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 2400, false, -1, 8575, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4710}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 16, false, 8544, -1, 8544, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4712, false, 8545, -1, 8545, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4715, false, 8546, -1, 8546, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4719, false, 8547, -1, 8547, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 42, false, 8548, -1, 8548, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4722, false, 8549, -1, 8549, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4725, false, 8550, -1, 8550, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4729, false, 8551, -1, 8551, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4734, false, 8552, -1, 8552, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 46, false, 8553, -1, 8553, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4737, false, 8554, -1, 8554, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4740, false, 8555, -1, 8555, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 22, false, 8556, -1, 8556, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4, false, 8557, -1, 8557, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6, false, 8558, -1, 8558, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 24, false, 8559, -1, 8559, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 8580, -1, -1, -1, false, false, false, false, utf8proc_sequences + 4744}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 8579, -1, 8579, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16500, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16560, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16680, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16800, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 16740, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16860, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4764, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16920, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4767, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 16980, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4770, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17040, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4773, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17100, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4776, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4779, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4782, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4786, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4789, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17160, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4793, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17220, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4796, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17280, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4799, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17340, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4802, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17520, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4805, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 17460, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4808, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17700, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17760, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4814, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4817, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4820, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4823, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17820, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17880, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4826, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4829, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 17940, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18000, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4832, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4835, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18060, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18120, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18660, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18720, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4838, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4841, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18240, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4844, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4847, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18300, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18360, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4850, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4853, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18780, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18840, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18420, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18480, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18540, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18600, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4856, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4859, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4862, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4865, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 18960, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19020, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, true, -1, -1, -1, 19080, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4868, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4871, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4874, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4877, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4880, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4883, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4886, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4889, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4892, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 4894, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 4995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2376, false, -1, 9424, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5195}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2380, false, -1, 9425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5197}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4532, false, -1, 9426, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5199}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2382, false, -1, 9427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5201}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2384, false, -1, 9428, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5203}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4571, false, -1, 9429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5205}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2388, false, -1, 9430, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5207}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2390, false, -1, 9431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5209}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2392, false, -1, 9432, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5211}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2394, false, -1, 9433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5213}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2396, false, -1, 9434, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5215}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2398, false, -1, 9435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5217}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2400, false, -1, 9436, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5219}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2402, false, -1, 9437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5221}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2404, false, -1, 9438, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5223}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2408, false, -1, 9439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5225}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4553, false, -1, 9440, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5227}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2410, false, -1, 9441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5229}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5231, false, -1, 9442, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5233}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2412, false, -1, 9443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5235}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2414, false, -1, 9444, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5237}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4662, false, -1, 9445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5239}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2416, false, -1, 9446, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5241}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4689, false, -1, 9447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5243}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5245, false, -1, 9448, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5247}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4565, false, -1, 9449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5249}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 0, false, 9398, -1, 9398, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 2, false, 9399, -1, 9399, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4, false, 9400, -1, 9400, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6, false, 9401, -1, 9401, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 8, false, 9402, -1, 9402, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 10, false, 9403, -1, 9403, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 12, false, 9404, -1, 9404, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 14, false, 9405, -1, 9405, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 16, false, 9406, -1, 9406, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 18, false, 9407, -1, 9407, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 20, false, 9408, -1, 9408, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 22, false, 9409, -1, 9409, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 24, false, 9410, -1, 9410, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 26, false, 9411, -1, 9411, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 28, false, 9412, -1, 9412, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 30, false, 9413, -1, 9413, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 32, false, 9414, -1, 9414, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 34, false, 9415, -1, 9415, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 36, false, 9416, -1, 9416, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 38, false, 9417, -1, 9417, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 40, false, 9418, -1, 9418, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 42, false, 9419, -1, 9419, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 44, false, 9420, -1, 9420, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 46, false, 9421, -1, 9421, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 48, false, 9422, -1, 9422, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 50, false, 9423, -1, 9423, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5251, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5256, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, utf8proc_sequences + 5267, true, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, 19140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11312, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5270}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11313, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5272}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11314, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5274}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11315, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5276}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11316, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5278}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11317, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5280}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11318, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5282}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11319, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5284}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11320, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5286}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11321, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5288}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11322, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5290}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11323, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5292}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11324, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5294}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11325, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5296}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11326, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5298}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11327, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5300}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11328, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5302}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11329, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5304}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11330, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5306}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11331, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5308}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11332, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5310}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11333, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5312}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11334, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5314}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11335, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5316}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11336, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5318}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11337, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5320}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11338, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5322}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11339, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5324}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11340, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5326}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11341, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5328}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11342, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5330}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11343, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5332}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11344, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5334}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5336}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5338}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5340}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5342}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5344}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5346}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5348}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5350}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5352}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5354}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5356}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5358}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5360}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5362}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11264, -1, 11264, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11265, -1, 11265, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11266, -1, 11266, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11267, -1, 11267, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11268, -1, 11268, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11269, -1, 11269, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11270, -1, 11270, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11271, -1, 11271, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11272, -1, 11272, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11273, -1, 11273, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11274, -1, 11274, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11275, -1, 11275, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11276, -1, 11276, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11277, -1, 11277, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11278, -1, 11278, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11279, -1, 11279, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11280, -1, 11280, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11281, -1, 11281, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11282, -1, 11282, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11283, -1, 11283, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11284, -1, 11284, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11285, -1, 11285, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11286, -1, 11286, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11287, -1, 11287, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11288, -1, 11288, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11289, -1, 11289, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11290, -1, 11290, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11291, -1, 11291, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11292, -1, 11292, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11293, -1, 11293, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11294, -1, 11294, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11295, -1, 11295, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11296, -1, 11296, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11297, -1, 11297, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11298, -1, 11298, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11299, -1, 11299, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11300, -1, 11300, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11301, -1, 11301, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11302, -1, 11302, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11303, -1, 11303, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11304, -1, 11304, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11305, -1, 11305, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11306, -1, 11306, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11307, -1, 11307, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11308, -1, 11308, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11309, -1, 11309, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11310, -1, 11310, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5364}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11360, -1, 11360, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5366}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 7549, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5368}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5370}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 570, -1, 570, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 574, -1, 574, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5372}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11367, -1, 11367, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5374}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11369, -1, 11369, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11372, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5376}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11371, -1, 11371, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11382, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5378}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11381, -1, 11381, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11393, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5380}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11392, -1, 11392, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11395, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5382}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11394, -1, 11394, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11397, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5384}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11396, -1, 11396, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11399, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5386}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11398, -1, 11398, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11401, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5388}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11400, -1, 11400, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11403, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5390}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11402, -1, 11402, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11405, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5392}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11404, -1, 11404, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11407, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5394}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11406, -1, 11406, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11409, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5396}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11408, -1, 11408, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11411, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5398}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11410, -1, 11410, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11413, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5400}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11412, -1, 11412, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11415, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5402}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11414, -1, 11414, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11417, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5404}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11416, -1, 11416, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11419, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5406}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11418, -1, 11418, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11421, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5408}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11420, -1, 11420, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11423, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5410}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11422, -1, 11422, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11425, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5412}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11424, -1, 11424, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11427, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5414}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11426, -1, 11426, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11429, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5416}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11428, -1, 11428, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11431, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5418}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11430, -1, 11430, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11433, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5420}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11432, -1, 11432, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11435, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5422}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11434, -1, 11434, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11437, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5424}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11436, -1, 11436, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11439, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5426}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11438, -1, 11438, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11441, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5428}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11440, -1, 11440, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11443, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5430}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11442, -1, 11442, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11445, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5432}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11444, -1, 11444, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11447, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5434}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11446, -1, 11446, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11449, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5436}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11448, -1, 11448, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11451, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5438}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11450, -1, 11450, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11453, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5440}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11452, -1, 11452, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11455, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5442}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11454, -1, 11454, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11457, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5444}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11456, -1, 11456, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11459, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5446}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11458, -1, 11458, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11461, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5448}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11460, -1, 11460, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11463, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5450}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11462, -1, 11462, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11465, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5452}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11464, -1, 11464, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11467, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5454}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11466, -1, 11466, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11469, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5456}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11468, -1, 11468, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11471, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5458}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11470, -1, 11470, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11473, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5460}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11472, -1, 11472, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11475, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5462}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11474, -1, 11474, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11477, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5464}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11476, -1, 11476, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11479, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5466}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11478, -1, 11478, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11481, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5468}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11480, -1, 11480, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11483, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5470}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11482, -1, 11482, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11485, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5472}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11484, -1, 11484, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11487, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5474}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11486, -1, 11486, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11489, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5476}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11488, -1, 11488, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 11491, -1, -1, -1, false, false, false, false, utf8proc_sequences + 5478}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 11490, -1, 11490, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4256, -1, 4256, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4257, -1, 4257, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4258, -1, 4258, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4259, -1, 4259, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4260, -1, 4260, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4261, -1, 4261, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4262, -1, 4262, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4263, -1, 4263, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4264, -1, 4264, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4265, -1, 4265, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4266, -1, 4266, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4267, -1, 4267, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4268, -1, 4268, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4269, -1, 4269, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4270, -1, 4270, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4271, -1, 4271, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4272, -1, 4272, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4273, -1, 4273, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4274, -1, 4274, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4275, -1, 4275, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4276, -1, 4276, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4277, -1, 4277, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4278, -1, 4278, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4279, -1, 4279, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4280, -1, 4280, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4281, -1, 4281, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4282, -1, 4282, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4283, -1, 4283, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4284, -1, 4284, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4285, -1, 4285, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4286, -1, 4286, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4287, -1, 4287, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4288, -1, 4288, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4289, -1, 4289, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4290, -1, 4290, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4291, -1, 4291, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4292, -1, 4292, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 4293, -1, 4293, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ZS, 0, UTF8PROC_BIDI_CLASS_WS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 52, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 218, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 224, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20400, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19200, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19260, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19320, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19380, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19440, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19500, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19560, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19620, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19680, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19740, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19800, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19860, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19920, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 19980, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20040, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20100, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20160, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20220, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20280, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20340, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 52, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MN, 8, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, 53, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 5998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20460, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21720, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20520, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20580, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20640, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20700, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20760, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20820, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20880, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 20940, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21000, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21060, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21120, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21180, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21240, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21300, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21360, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21420, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21480, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21540, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21600, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21660, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21780, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21840, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21900, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 21960, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22020, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 6103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6208, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 6312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, utf8proc_sequences + 5502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6745, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6749, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6757, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6761, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6769, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6773, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6785, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6809, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6821, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6849, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 6853, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6857, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 6997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7550, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7753, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7765, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7781, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7813, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7833, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7845, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 7935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SQUARE, utf8proc_sequences + 7939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, + {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 7999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8025, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8037, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8039, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8043, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8045, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8049, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8051, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8055, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8057, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8061, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8063, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8067, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8069, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8073, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8075, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8151, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8157, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8165, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8169, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8171, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8175, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8177, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8181, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8183, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8187, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8189, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8193, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8195, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8199, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8201, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8205, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8207, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8211, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8213, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8223, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8225, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8255, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8391, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8393, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8397, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8399, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8403, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8405, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8409, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8413, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8417, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8421, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8423, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8427, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8429, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8433, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8435, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8439, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8441, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8445, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8447, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8451, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8453, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8457, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8459, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8463, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8465, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8469, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8471, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8475, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8477, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8481, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8483, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8487, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8489, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8493, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8495, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8513, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8521, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8525, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8529, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8533, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8537, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8541, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 6729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8545, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8549, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8553, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8557, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8561, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8565, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8569, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8573, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8577, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8585, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8589, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8593, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8597, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8601, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8605, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8609, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8613, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8617, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8621, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8625, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8629, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8633, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8637, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8641, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8645, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8649, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8653, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8657, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8661, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8665, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8669, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8673, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8677, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8681, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8685, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8693, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8697, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8701, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8705, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8709, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8713, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8717, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8721, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8725, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8729, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8733, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8737, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8741, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 8743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8745, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8745}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8748, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8748}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8751, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8751}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8754, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8754}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8758, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8758}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8762, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8765, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8765}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8768, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8768}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8771, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8771}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8774, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8774}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8777, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8777}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8780, false, -1, -1, -1, -1, -1, false, false, false, false, utf8proc_sequences + 8780}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8783, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8786, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8789, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4581, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8793, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8797, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 8801, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8803, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8806, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8809, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8812, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8815, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8818, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8821, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8824, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8827, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8830, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8833, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8836, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8839, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8842, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8845, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8848, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8851, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8854, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8857, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8860, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8863, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8866, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8869, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8872, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8875, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8878, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8881, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8884, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8887, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8890, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8893, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, utf8proc_sequences + 8896, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 8899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9155, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9167, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9191, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9209, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9023, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9149, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9173, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9179, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9197, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9215, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9389, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9395, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9185, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9203, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9407, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9411, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9415, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9419, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9425, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9431, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9437, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9443, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9449, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9455, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9461, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9467, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9473, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9491, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9401, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9479, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9485, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 9125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9523, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9527, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9531, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9535, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9539, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9543, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9547, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9551, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9555, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9559, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9563, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9575, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9579, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9583, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9587, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9591, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9595, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9599, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9603, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9607, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9615, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9619, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9623, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9627, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9631, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9635, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9643, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9651, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9655, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9659, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9663, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9667, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9671, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9675, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9679, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9683, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9687, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9691, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9695, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9699, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9703, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9707, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9711, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9715, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9719, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9723, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9727, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9731, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9735, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9739, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9743, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9747, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9751, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9755, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9759, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9763, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9767, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9771, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9775, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9779, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9783, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9787, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9791, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9795, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9799, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9803, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9807, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9811, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9815, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9819, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9823, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9639, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9647, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9827, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9831, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9839, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9843, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9835, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9851, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9855, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9859, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9863, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9867, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9847, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9611, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 9571, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 9875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 9954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9971, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9973, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9975, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9977, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9981, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4517, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4519, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9985, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9987, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9989, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9991, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9993, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9995, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9997, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 9999, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 4894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10001, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10003, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10005, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10007, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10009, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, utf8proc_sequences + 10011, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 10013, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9979, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9989, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 9991, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10035, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10041, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10047, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10053, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10059, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10065, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10071, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10077, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10079, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10081, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10083, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10085, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10087, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10089, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10091, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10093, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10095, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10097, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10099, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10101, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10103, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10105, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10107, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10109, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10111, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10113, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10115, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10117, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10119, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10121, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10123, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10125, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10127, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10129, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10131, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10133, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10135, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10137, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10139, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10141, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10143, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 8980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, utf8proc_sequences + 10145, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10147, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10153, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, utf8proc_sequences + 10156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9967, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10159, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10015, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10029, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10031, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10017, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10161, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4517, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4519, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10019, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4511, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9959, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10021, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10163, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9965, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 1333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10023, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4515, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10025, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9969, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10033, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2376, false, -1, 65345, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10165}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2380, false, -1, 65346, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10167}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4532, false, -1, 65347, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10169}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2382, false, -1, 65348, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10171}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2384, false, -1, 65349, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10173}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4571, false, -1, 65350, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10175}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2388, false, -1, 65351, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10177}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2390, false, -1, 65352, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10179}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2392, false, -1, 65353, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10181}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2394, false, -1, 65354, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10183}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2396, false, -1, 65355, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10185}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2398, false, -1, 65356, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10187}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2400, false, -1, 65357, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10189}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2402, false, -1, 65358, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10191}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2404, false, -1, 65359, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10193}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2408, false, -1, 65360, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10195}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4553, false, -1, 65361, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10197}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2410, false, -1, 65362, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10199}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5231, false, -1, 65363, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10201}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2412, false, -1, 65364, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10203}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2414, false, -1, 65365, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10205}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4662, false, -1, 65366, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10207}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2416, false, -1, 65367, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10209}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4689, false, -1, 65368, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10211}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 5245, false, -1, 65369, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10213}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4565, false, -1, 65370, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10215}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10009, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10027, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10011, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10217, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9983, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4387, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 0, false, 65313, -1, 65313, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 2, false, 65314, -1, 65314, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 4, false, 65315, -1, 65315, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 6, false, 65316, -1, 65316, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 8, false, 65317, -1, 65317, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10, false, 65318, -1, 65318, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 12, false, 65319, -1, 65319, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 14, false, 65320, -1, 65320, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 16, false, 65321, -1, 65321, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 18, false, 65322, -1, 65322, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 20, false, 65323, -1, 65323, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 22, false, 65324, -1, 65324, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 24, false, 65325, -1, 65325, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 26, false, 65326, -1, 65326, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 28, false, 65327, -1, 65327, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 30, false, 65328, -1, 65328, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 32, false, 65329, -1, 65329, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 34, false, 65330, -1, 65330, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 36, false, 65331, -1, 65331, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 38, false, 65332, -1, 65332, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 40, false, 65333, -1, 65333, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 42, false, 65334, -1, 65334, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 44, false, 65335, -1, 65335, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 46, false, 65336, -1, 65336, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 48, false, 65337, -1, 65337, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 50, false, 65338, -1, 65338, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9985, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10219, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 9987, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10221, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10223, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10225, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10001, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10003, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 9961, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10227, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6963, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10229, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10233, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10235, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10237, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10239, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10241, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10243, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10247, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6871, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6873, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6875, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6877, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6879, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6881, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6883, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6885, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6887, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6889, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6891, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6893, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6895, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6897, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6899, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6901, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6903, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6905, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6907, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6909, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6911, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6913, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6915, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6917, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6919, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6921, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6923, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6925, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6927, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6929, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6931, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6933, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6935, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6937, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6939, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6941, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6943, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6945, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6947, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6949, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6951, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6953, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6955, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 6957, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10249, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10251, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10253, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10255, false, -1, -1, -1, -1, -1, false, true, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10257, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10259, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10261, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10263, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10265, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10267, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10269, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10271, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10273, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10275, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10277, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10279, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10281, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10283, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10285, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10287, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10289, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10291, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10293, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10295, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10297, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10299, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10301, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10303, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10305, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10307, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10309, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10311, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10313, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10315, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10317, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10319, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10321, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10323, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10325, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10327, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10329, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10331, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10333, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10335, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10337, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10339, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10341, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10343, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10345, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10347, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10349, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10351, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10353, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10355, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10357, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10359, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10361, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10363, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10365, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10367, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10369, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, utf8proc_sequences + 10371, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10373, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10375, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10377, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10379, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10381, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10383, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, utf8proc_sequences + 10385, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, true, false, NULL}, + {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66600, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10387}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66601, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10389}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66602, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10391}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66603, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10393}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66604, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10395}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66605, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10397}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66606, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10399}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66607, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10401}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66608, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10403}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66609, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10405}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66610, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10407}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66611, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10409}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66612, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10411}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66613, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10413}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66614, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10415}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66615, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10417}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66616, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10419}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66617, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10421}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66618, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10423}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66619, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10425}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66620, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10427}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66621, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10429}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66622, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10431}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66623, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10433}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66624, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10435}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66625, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10437}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66626, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10439}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66627, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10441}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66628, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10443}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66629, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10445}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66630, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10447}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66631, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10449}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66632, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10451}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66633, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10453}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66634, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10455}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66635, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10457}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66636, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10459}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66637, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10461}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66638, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10463}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, 66639, -1, -1, -1, false, false, false, false, utf8proc_sequences + 10465}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66560, -1, 66560, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66561, -1, 66561, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66562, -1, 66562, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66563, -1, 66563, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66564, -1, 66564, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66565, -1, 66565, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66566, -1, 66566, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66567, -1, 66567, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66568, -1, 66568, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66569, -1, 66569, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66570, -1, 66570, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66571, -1, 66571, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66572, -1, 66572, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66573, -1, 66573, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66574, -1, 66574, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66575, -1, 66575, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66576, -1, 66576, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66577, -1, 66577, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66578, -1, 66578, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66579, -1, 66579, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66580, -1, 66580, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66581, -1, 66581, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66582, -1, 66582, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66583, -1, 66583, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66584, -1, 66584, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66585, -1, 66585, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66586, -1, 66586, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66587, -1, 66587, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66588, -1, 66588, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66589, -1, 66589, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66590, -1, 66590, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66591, -1, 66591, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66592, -1, 66592, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66593, -1, 66593, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66594, -1, 66594, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66595, -1, 66595, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66596, -1, 66596, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66597, -1, 66597, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66598, -1, 66598, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, 66599, -1, 66599, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22080, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22140, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10467, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10470, false, -1, -1, -1, 22200, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10473, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10476, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10479, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10482, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10485, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 54, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 55, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 56, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 57, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 58, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, -1, 59, false, false, false, true, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22260, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, NULL, false, -1, -1, -1, 22320, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10488, false, -1, -1, -1, 22380, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10491, false, -1, -1, -1, 22440, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10494, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10497, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10500, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10503, false, -1, -1, -1, -1, -1, true, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5231, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4689, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 5245, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 0, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 2, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 20, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 24, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 26, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 30, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 32, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 34, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 36, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 38, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 40, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 42, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 44, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 46, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 48, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 50, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10506, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10510, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10512, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10514, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10516, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10520, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1504, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10522, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10524, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10526, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10528, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10530, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10532, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10534, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10536, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10538, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1508, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10540, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10542, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10544, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10546, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4567, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10548, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 67, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10550, true, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10552, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10554, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10556, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10558, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10560, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10562, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 10564, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 1482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4497, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 72, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 60, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 62, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4499, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4501, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4503, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4505, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4507, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, utf8proc_sequences + 4509, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10566, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10568, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10572, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10574, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10576, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10578, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10580, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10582, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10584, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10586, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10588, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10590, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10592, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10596, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10598, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10600, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10602, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10604, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10606, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10608, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10610, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10612, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10614, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5518, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10616, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10618, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10620, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10622, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10624, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10626, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10628, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10630, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10632, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10634, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10636, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10638, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10640, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10642, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10644, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10646, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10648, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10650, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10652, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10654, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10656, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10658, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10660, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10662, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10664, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10666, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10668, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10670, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10672, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10674, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10676, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10678, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10680, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10682, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10684, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10686, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10688, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10690, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10692, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10694, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10696, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10698, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10700, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10702, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10704, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10706, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10708, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10710, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10712, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10714, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10716, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10718, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10720, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10722, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10724, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10726, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10728, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10730, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10732, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10734, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10736, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10738, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10740, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10742, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10744, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10746, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10748, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10750, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10752, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10754, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10756, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10758, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10760, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5570, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10762, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10764, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10766, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10768, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10770, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10772, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10776, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10778, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10780, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10782, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10784, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10786, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10790, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10792, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10794, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10796, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10798, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10800, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10802, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10804, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10806, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10808, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5594, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10810, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10812, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10814, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10816, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10818, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10820, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10822, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10824, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10826, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10828, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10830, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10832, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10834, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10836, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10838, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10840, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10842, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10844, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10846, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10848, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10850, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10852, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10854, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10856, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10858, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10860, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10862, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10864, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10866, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10868, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10870, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10872, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10874, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10876, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10878, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10880, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10882, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10886, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10888, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10890, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10894, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10896, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10898, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10900, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10904, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10906, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10908, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10910, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10912, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10914, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10916, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10918, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10920, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10922, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10924, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10926, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10928, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10930, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10932, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10934, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10936, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10938, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10940, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10942, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10944, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10946, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10948, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10950, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10952, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10954, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10956, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10958, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10960, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10962, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10964, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10966, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10968, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10970, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10972, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10974, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10976, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10978, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10980, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10982, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10984, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10986, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10988, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10990, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10992, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10994, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10996, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 10998, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11000, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11002, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11004, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11006, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11008, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11010, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11012, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11014, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11016, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11018, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11020, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11022, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11024, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11026, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11028, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11030, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11032, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11034, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11036, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11038, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11040, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11042, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11044, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11046, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11048, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11050, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11052, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11054, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11056, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11058, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11060, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11062, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11064, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11066, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11068, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11070, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11072, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11074, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11076, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11078, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11080, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11082, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11084, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11086, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11088, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11090, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11092, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11094, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11096, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11098, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11100, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11102, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11104, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11106, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11108, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11110, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11112, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11114, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11116, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11118, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11120, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11122, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11124, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11126, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11128, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11130, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11132, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11134, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11136, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11138, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11140, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11142, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11144, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11146, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11148, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11150, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11152, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11154, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11156, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11158, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11160, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11162, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11164, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11166, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11168, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11170, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11172, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11174, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11176, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11178, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11180, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11182, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11184, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11186, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11188, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11190, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11192, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11194, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11196, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11198, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11200, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11202, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11204, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11206, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11208, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11210, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11212, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11214, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11216, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11218, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11220, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11222, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11224, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11226, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11228, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11230, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11232, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11234, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11236, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11238, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11240, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11242, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11244, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11246, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11248, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11250, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11252, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11254, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11256, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11258, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11260, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11262, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11264, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11266, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11268, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11270, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11272, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11274, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11276, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11278, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11280, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11282, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11284, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11286, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11288, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11290, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11292, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11294, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11296, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11298, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11300, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11302, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11304, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11306, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11308, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11310, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11312, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11314, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11316, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11318, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11320, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11322, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11324, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11326, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11328, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11330, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11332, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11334, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11336, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11338, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11340, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11342, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11344, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5774, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11346, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11348, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11350, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11352, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11354, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11356, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11358, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11360, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11362, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11364, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11366, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5788, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11368, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11370, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11372, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11374, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11376, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11378, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11380, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11382, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11384, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11386, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11388, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11390, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11392, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11394, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11396, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11398, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11400, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11402, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11404, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11406, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11408, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11410, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11412, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11414, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11416, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11418, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11420, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11422, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11424, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11426, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11428, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11430, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11432, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11434, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11436, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11438, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11440, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11442, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11444, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11446, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11448, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11450, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11452, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11454, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11456, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11458, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11460, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11462, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11464, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11466, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11468, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11470, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11472, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11474, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11476, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11478, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11480, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11482, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11484, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11486, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11488, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11490, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5884, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11492, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5892, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11494, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11496, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11498, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11500, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 5902, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, utf8proc_sequences + 11502, false, -1, -1, -1, -1, -1, false, false, false, false, NULL}, +}; + +const int32_t utf8proc_combinations[] = { + 192, 193, 194, 195, 196, 197, -1, + 256, 258, 260, 550, 461, -1, -1, 512, + 514, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7680, 7840, -1, -1, -1, -1, -1, 7842, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 262, 264, + -1, -1, -1, 199, -1, -1, -1, 266, + 268, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 200, 201, 202, 7868, 203, -1, 552, + 274, 276, 280, 278, 282, -1, -1, 516, + 518, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7864, -1, 7704, 7706, -1, -1, 7866, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 204, 205, 206, + 296, 207, -1, -1, 298, 300, 302, 304, + 463, -1, -1, 520, 522, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7882, -1, -1, + 7724, -1, -1, 7880, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 504, 323, -1, 209, -1, -1, 325, + -1, -1, -1, 7748, 327, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7750, 7752, 7754, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 210, 211, 212, + 213, 214, -1, -1, 332, 334, 490, 558, + 465, 336, 416, 524, 526, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7884, -1, -1, + -1, -1, -1, 7886, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 217, 218, 219, 360, 220, 366, -1, + 362, 364, 370, -1, 467, 368, 431, 532, + 534, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7908, -1, 7798, 7796, -1, 7794, 7910, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7922, 221, 374, + 7928, 376, -1, -1, 562, -1, -1, 7822, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7924, -1, -1, + -1, -1, -1, 7926, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 224, 225, 226, 227, 228, 229, -1, + 257, 259, 261, 551, 462, -1, -1, 513, + 515, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7681, 7841, -1, -1, -1, -1, -1, 7843, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 263, 265, + -1, -1, -1, 231, -1, -1, -1, 267, + 269, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 232, 233, 234, 7869, 235, -1, 553, + 275, 277, 281, 279, 283, -1, -1, 517, + 519, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7865, -1, 7705, 7707, -1, -1, 7867, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 236, 237, 238, + 297, 239, -1, -1, 299, 301, 303, -1, + 464, -1, -1, 521, 523, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7883, -1, -1, + 7725, -1, -1, 7881, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 505, 324, -1, 241, -1, -1, 326, + -1, -1, -1, 7749, 328, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7751, 7753, 7755, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 242, 243, 244, + 245, 246, -1, -1, 333, 335, 491, 559, + 466, 337, 417, 525, 527, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7885, -1, -1, + -1, -1, -1, 7887, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 249, 250, 251, 361, 252, 367, -1, + 363, 365, 371, -1, 468, 369, 432, 533, + 535, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7909, -1, 7799, 7797, -1, 7795, 7911, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7923, 253, 375, + 7929, 255, 7833, -1, 563, -1, -1, 7823, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7925, -1, -1, + -1, -1, -1, 7927, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7696, + -1, -1, -1, 7690, 270, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7692, 7694, 7698, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7697, -1, -1, -1, 7691, + 271, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7693, 7695, 7699, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 500, 284, -1, -1, -1, 290, + 7712, 286, -1, 288, 486, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 501, 285, + -1, -1, -1, 291, 7713, 287, -1, 289, + 487, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 292, -1, 7718, -1, 7720, + -1, -1, -1, 7714, 542, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7716, -1, -1, -1, 7722, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 293, + -1, 7719, -1, 7721, -1, -1, -1, 7715, + 543, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7717, 7830, -1, + -1, 7723, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 308, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 309, + -1, -1, -1, -1, -1, -1, -1, -1, + 496, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7728, -1, -1, -1, -1, 310, + -1, -1, -1, -1, 488, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7730, 7732, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7729, -1, + -1, -1, -1, 311, -1, -1, -1, -1, + 489, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7731, 7733, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 313, -1, -1, -1, -1, 315, + -1, -1, -1, -1, 317, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7734, 7738, 7740, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 314, -1, + -1, -1, -1, 316, -1, -1, -1, -1, + 318, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7735, 7739, 7741, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 340, -1, -1, -1, -1, 342, + -1, -1, -1, 7768, 344, -1, -1, 528, + 530, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7770, 7774, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 341, -1, + -1, -1, -1, 343, -1, -1, -1, 7769, + 345, -1, -1, 529, 531, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7771, 7775, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 346, 348, -1, -1, -1, 350, + -1, -1, -1, 7776, 352, -1, -1, -1, + -1, 536, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7778, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 347, 349, + -1, -1, -1, 351, -1, -1, -1, 7777, + 353, -1, -1, -1, -1, 537, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7779, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, + -1, -1, -1, 7786, 356, -1, -1, -1, + -1, 538, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7788, 7790, 7792, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7831, -1, 355, -1, -1, -1, 7787, + 357, -1, -1, -1, -1, 539, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7789, 7791, 7793, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7808, 7810, 372, -1, 7812, -1, -1, + -1, -1, -1, 7814, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7816, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7809, 7811, 373, + -1, 7813, 7832, -1, -1, -1, -1, 7815, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7817, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 377, 7824, -1, -1, -1, -1, + -1, -1, -1, 379, 381, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7826, 7828, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 378, 7825, + -1, -1, -1, -1, -1, -1, -1, 380, + 382, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7827, 7829, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 475, 471, -1, -1, -1, -1, -1, + 469, -1, -1, -1, 473, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 476, 472, -1, + -1, -1, -1, -1, 470, -1, -1, -1, + 474, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 478, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 479, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 480, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 481, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 508, -1, -1, -1, -1, -1, + 482, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 509, -1, + -1, -1, -1, -1, 483, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 492, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 493, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 494, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 495, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 506, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 507, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 510, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 511, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 554, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 555, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7756, -1, -1, 7758, -1, -1, + 556, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7757, -1, + -1, 7759, -1, -1, 557, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 560, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 561, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8173, 901, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8129, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8122, 902, -1, + -1, -1, -1, -1, 8121, 8120, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7944, 7945, -1, 8124, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8136, 904, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7960, 7961, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8138, 905, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7976, 7977, -1, 8140, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8154, 906, -1, -1, 938, -1, -1, + 8153, 8152, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7992, 7993, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8184, 908, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8008, 8009, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8170, 910, -1, -1, 939, -1, -1, + 8169, 8168, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8025, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8186, 911, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8040, 8041, -1, 8188, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8146, 912, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8151, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8048, 940, -1, + -1, -1, -1, -1, 8113, 8112, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7936, 7937, 8118, 8115, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8050, 941, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7952, 7953, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8052, 942, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7968, 7969, 8134, 8131, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8054, 943, -1, -1, 970, -1, -1, + 8145, 8144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7984, 7985, 8150, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8162, 944, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8167, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8058, 973, -1, -1, 971, -1, -1, + 8161, 8160, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8016, 8017, 8166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8056, 972, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8000, 8001, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8060, 974, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8032, 8033, 8182, 8179, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 979, -1, + -1, 980, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1024, -1, -1, -1, 1025, -1, -1, + -1, 1238, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1027, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1031, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1036, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1037, -1, -1, -1, 1252, -1, -1, + 1250, 1049, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1264, -1, -1, 1262, 1038, -1, -1, + -1, 1266, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1117, -1, -1, -1, 1253, -1, -1, + 1251, 1081, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1104, -1, -1, + -1, 1105, -1, -1, -1, 1239, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1107, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1111, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1265, -1, -1, 1263, 1118, -1, -1, + -1, 1267, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1142, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1143, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1244, -1, -1, + -1, 1217, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1245, -1, -1, -1, 1218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1234, -1, -1, + -1, 1232, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1235, -1, -1, -1, 1233, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1242, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1243, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1246, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1247, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1254, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1255, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1258, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1259, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1261, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1268, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1269, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1272, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1273, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1570, 1571, 1573, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1572, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1574, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1728, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1730, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1747, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2345, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2353, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2356, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2507, 2508, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2888, 2891, 2892, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2964, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3020, 3018, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 3019, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3264, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3271, 3272, + 3274, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3275, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3402, 3404, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3403, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3546, 3548, 3550, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3549, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4134, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6918, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6920, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6922, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6924, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6926, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6930, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6971, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6973, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6976, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6977, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6979, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7682, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7684, 7686, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7683, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7685, 7687, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7688, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7689, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7700, 7702, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7701, 7703, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7708, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7709, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7710, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7711, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7726, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7727, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7736, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7737, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7742, -1, -1, -1, -1, -1, + -1, -1, -1, 7744, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7746, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7743, -1, + -1, -1, -1, -1, -1, -1, -1, 7745, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7747, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7760, 7762, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7761, 7763, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7764, -1, -1, -1, -1, -1, + -1, -1, -1, 7766, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7765, -1, + -1, -1, -1, -1, -1, -1, -1, 7767, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7772, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7773, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7780, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7781, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7782, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7783, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7784, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7785, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7800, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7801, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7802, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7803, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7804, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7806, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 7805, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7807, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7820, -1, -1, + -1, -1, -1, 7818, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7821, -1, -1, -1, -1, -1, 7819, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7835, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7846, 7844, -1, + 7850, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7848, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7847, 7845, -1, 7851, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7849, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7852, + -1, -1, -1, -1, -1, 7862, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7853, -1, -1, -1, -1, + -1, 7863, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7856, 7854, -1, + 7860, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7858, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7857, 7855, -1, 7861, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7859, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7872, 7870, -1, + 7876, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7874, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7873, 7871, -1, 7877, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7875, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7878, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7879, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7890, 7888, -1, + 7894, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7892, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7891, 7889, -1, 7895, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7893, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 7896, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 7897, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7900, 7898, -1, + 7904, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7906, -1, -1, + -1, -1, -1, 7902, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7901, 7899, -1, 7905, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7907, -1, -1, -1, -1, -1, 7903, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7914, 7912, -1, + 7918, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7920, -1, -1, + -1, -1, -1, 7916, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7915, 7913, -1, 7919, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7921, -1, -1, -1, -1, -1, 7917, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7938, 7940, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7942, 8064, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7939, 7941, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7943, 8065, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7946, 7948, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7950, 8072, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7947, 7949, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7951, 8073, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7954, 7956, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7955, 7957, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7962, 7964, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7963, 7965, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7970, 7972, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7974, 8080, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7971, 7973, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7975, 8081, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7978, 7980, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7982, 8088, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7979, 7981, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7983, 8089, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7986, 7988, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7990, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7987, 7989, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7991, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 7994, 7996, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7998, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 7995, 7997, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7999, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8002, 8004, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8003, 8005, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8010, 8012, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8011, 8013, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8018, 8020, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8022, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8019, 8021, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8023, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8027, 8029, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8031, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8034, 8036, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8038, 8096, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8035, 8037, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8039, 8097, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8042, 8044, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8046, 8104, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8043, 8045, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8047, 8105, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8066, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8067, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8068, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8069, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8070, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8071, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8074, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8075, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8076, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8077, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8078, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8079, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8082, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8083, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8084, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8085, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8086, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8087, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8090, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8091, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8092, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8093, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8094, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8095, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8098, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8099, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8100, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8101, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8103, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8106, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8107, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8108, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8109, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8110, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8111, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8114, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8116, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8119, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8130, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8132, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8135, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 8141, 8142, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8143, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8157, 8158, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8159, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8164, 8165, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 8172, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8178, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 8180, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 8183, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8602, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8603, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8622, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8653, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8654, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8655, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8708, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8713, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8716, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8740, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8742, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8769, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8772, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8775, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8777, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8800, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8802, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8813, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8814, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8815, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8816, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8817, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8820, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8821, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8824, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8825, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8832, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8833, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8836, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8837, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8840, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8841, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8876, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8877, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8878, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8879, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8928, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8929, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8930, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8931, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8938, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8939, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 8940, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8941, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 10972, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12364, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12366, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12368, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12370, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12372, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12374, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12376, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12378, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12380, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12382, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12384, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12386, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12389, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12391, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12393, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12400, 12401, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12403, 12404, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12406, 12407, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12409, 12410, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12412, 12413, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12436, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12446, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12460, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12462, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12464, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12466, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12468, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12470, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12472, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12474, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12476, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12478, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12480, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12482, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12485, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12487, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12489, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12496, 12497, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12499, 12500, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12502, 12503, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12505, 12506, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12508, 12509, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12532, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12535, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12536, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12537, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 12538, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12542, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 119134, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 119135, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 119136, 119137, 119138, 119139, 119140, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 119227, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 119228, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 119229, 119231, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 119230, 119232, -1, -1, -1, }; + diff --git a/extern/src_netcdf4/v1hpg.c b/extern/src_netcdf4/v1hpg.c new file mode 100644 index 0000000..11550fc --- /dev/null +++ b/extern/src_netcdf4/v1hpg.c @@ -0,0 +1,1400 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: v1hpg.c,v 1.70 2010/05/26 21:43:34 dmh Exp $ */ + +#include "config.h" +#include "nc.h" +#include +#include +#include +#include +#include "rnd.h" +#include "ncx.h" + +/* + * This module defines the external representation + * of the "header" of a netcdf version one file and + * the version two variant that uses 64-bit file + * offsets instead of the 32-bit file offsets in version + * one files. + * For each of the components of the NC structure, + * There are (static) ncx_len_XXX(), v1h_put_XXX() + * and v1h_get_XXX() functions. These define the + * external representation of the components. + * The exported entry points for the whole NC structure + * are built up from these. + */ + + +/* + * "magic number" at beginning of file: 0x43444601 (big endian) + * assert(sizeof(ncmagic) % X_ALIGN == 0); + */ +static const schar ncmagic[] = {'C', 'D', 'F', 0x02}; +static const schar ncmagic1[] = {'C', 'D', 'F', 0x01}; + + +/* + * v1hs == "Version 1 Header Stream" + * + * The netcdf file version 1 header is + * of unknown and potentially unlimited size. + * So, we don't know how much to get() on + * the initial read. We build a stream, 'v1hs' + * on top of ncio to do the header get. + */ +typedef struct v1hs { + ncio *nciop; + off_t offset; /* argument to nciop->get() */ + size_t extent; /* argument to nciop->get() */ + int flags; /* set to RGN_WRITE for write */ + int version; /* format variant: NC_FORMAT_CLASSIC or NC_FORMAT_64BIT */ + void *base; /* beginning of current buffer */ + void *pos; /* current position in buffer */ + void *end; /* end of current buffer = base + extent */ +} v1hs; + + +/* + * Release the stream, invalidate buffer + */ +static int +rel_v1hs(v1hs *gsp) +{ + int status; + if(gsp->offset == OFF_NONE || gsp->base == NULL) + return ENOERR; + status = ncio_rel(gsp->nciop, gsp->offset, + gsp->flags == RGN_WRITE ? RGN_MODIFIED : 0); + gsp->end = NULL; + gsp->pos = NULL; + gsp->base = NULL; + return status; +} + + +/* + * Release the current chunk and get the next one. + * Also used for initialization when gsp->base == NULL. + */ +static int +fault_v1hs(v1hs *gsp, size_t extent) +{ + int status; + + if(gsp->base != NULL) + { + const ptrdiff_t incr = (char *)gsp->pos - (char *)gsp->base; + status = rel_v1hs(gsp); + if(status) + return status; + gsp->offset += incr; + } + + if(extent > gsp->extent) + gsp->extent = extent; + + status = ncio_get(gsp->nciop, + gsp->offset, gsp->extent, + gsp->flags, &gsp->base); + if(status) + return status; + + gsp->pos = gsp->base; + gsp->end = (char *)gsp->base + gsp->extent; + + return ENOERR; +} + + +/* + * Ensure that 'nextread' bytes are available. + */ +static int +check_v1hs(v1hs *gsp, size_t nextread) +{ + +#if 0 /* DEBUG */ +fprintf(stderr, "nextread %lu, remaining %lu\n", + (unsigned long)nextread, + (unsigned long)((char *)gsp->end - (char *)gsp->pos)); +#endif + + if((char *)gsp->pos + nextread <= (char *)gsp->end) + return ENOERR; + return fault_v1hs(gsp, nextread); +} + +/* End v1hs */ + +/* Write a size_t to the header */ +static int +v1h_put_size_t(v1hs *psp, const size_t *sp) +{ + int status = check_v1hs(psp, X_SIZEOF_SIZE_T); + if(status != ENOERR) + return status; + return ncx_put_size_t(&psp->pos, sp); +} + + +/* Read a size_t from the header */ +static int +v1h_get_size_t(v1hs *gsp, size_t *sp) +{ + int status = check_v1hs(gsp, X_SIZEOF_SIZE_T); + if(status != ENOERR) + return status; + return ncx_get_size_t((const void **)(&gsp->pos), sp); +} + + +/* Begin nc_type */ + +#define X_SIZEOF_NC_TYPE X_SIZEOF_INT + +/* Write a nc_type to the header */ +static int +v1h_put_nc_type(v1hs *psp, const nc_type *typep) +{ + const int itype = (int) *typep; + int status = check_v1hs(psp, X_SIZEOF_INT); + if(status != ENOERR) + return status; + status = ncx_put_int_int(psp->pos, &itype); + psp->pos = (void *)((char *)psp->pos + X_SIZEOF_INT); + return status; +} + + +/* Read a nc_type from the header */ +static int +v1h_get_nc_type(v1hs *gsp, nc_type *typep) +{ + int type = 0; + int status = check_v1hs(gsp, X_SIZEOF_INT); + if(status != ENOERR) + return status; + status = ncx_get_int_int(gsp->pos, &type); + gsp->pos = (void *)((char *)gsp->pos + X_SIZEOF_INT); + if(status != ENOERR) + return status; + + assert(type == NC_BYTE + || type == NC_CHAR + || type == NC_SHORT + || type == NC_INT + || type == NC_FLOAT + || type == NC_DOUBLE); + + /* else */ + *typep = (nc_type) type; + + return ENOERR; +} + +/* End nc_type */ +/* Begin NCtype (internal tags) */ + +#define X_SIZEOF_NCTYPE X_SIZEOF_INT + +/* Write a NCtype to the header */ +static int +v1h_put_NCtype(v1hs *psp, NCtype type) +{ + const int itype = (int) type; + int status = check_v1hs(psp, X_SIZEOF_INT); + if(status != ENOERR) + return status; + status = ncx_put_int_int(psp->pos, &itype); + psp->pos = (void *)((char *)psp->pos + X_SIZEOF_INT); + return status; +} + +/* Read a NCtype from the header */ +static int +v1h_get_NCtype(v1hs *gsp, NCtype *typep) +{ + int type = 0; + int status = check_v1hs(gsp, X_SIZEOF_INT); + if(status != ENOERR) + return status; + status = ncx_get_int_int(gsp->pos, &type); + gsp->pos = (void *)((char *)gsp->pos + X_SIZEOF_INT); + if(status != ENOERR) + return status; + /* else */ + *typep = (NCtype) type; + return ENOERR; +} + +/* End NCtype */ +/* Begin NC_string */ + +/* + * How much space will the xdr'd string take. + * Formerly +NC_xlen_string(cdfstr) + */ +static size_t +ncx_len_NC_string(const NC_string *ncstrp) +{ + size_t sz = X_SIZEOF_SIZE_T; /* nchars */ + + assert(ncstrp != NULL); + + if(ncstrp->nchars != 0) + { +#if 0 + assert(ncstrp->nchars % X_ALIGN == 0); + sz += ncstrp->nchars; +#else + sz += _RNDUP(ncstrp->nchars, X_ALIGN); +#endif + } + return sz; +} + + +/* Write a NC_string to the header */ +static int +v1h_put_NC_string(v1hs *psp, const NC_string *ncstrp) +{ + int status; + +#if 0 + assert(ncstrp->nchars % X_ALIGN == 0); +#endif + + status = v1h_put_size_t(psp, &ncstrp->nchars); + if(status != ENOERR) + return status; + status = check_v1hs(psp, _RNDUP(ncstrp->nchars, X_ALIGN)); + if(status != ENOERR) + return status; + status = ncx_pad_putn_text(&psp->pos, ncstrp->nchars, ncstrp->cp); + if(status != ENOERR) + return status; + + return ENOERR; +} + + +/* Read a NC_string from the header */ +static int +v1h_get_NC_string(v1hs *gsp, NC_string **ncstrpp) +{ + int status; + size_t nchars = 0; + NC_string *ncstrp; + + status = v1h_get_size_t(gsp, &nchars); + if(status != ENOERR) + return status; + + ncstrp = new_NC_string(nchars, NULL); + if(ncstrp == NULL) + { + return NC_ENOMEM; + } + + +#if 0 +/* assert(ncstrp->nchars == nchars || ncstrp->nchars - nchars < X_ALIGN); */ + assert(ncstrp->nchars % X_ALIGN == 0); + status = check_v1hs(gsp, ncstrp->nchars); +#else + + status = check_v1hs(gsp, _RNDUP(ncstrp->nchars, X_ALIGN)); +#endif + if(status != ENOERR) + goto unwind_alloc; + + status = ncx_pad_getn_text((const void **)(&gsp->pos), + nchars, ncstrp->cp); + if(status != ENOERR) + goto unwind_alloc; + + *ncstrpp = ncstrp; + + return ENOERR; + +unwind_alloc: + free_NC_string(ncstrp); + return status; + +} + +/* End NC_string */ +/* Begin NC_dim */ + +/* + * How much space will the xdr'd dim take. + * Formerly +NC_xlen_dim(dpp) + */ +static size_t +ncx_len_NC_dim(const NC_dim *dimp) +{ + size_t sz; + + assert(dimp != NULL); + + sz = ncx_len_NC_string(dimp->name); + sz += X_SIZEOF_SIZE_T; + + return(sz); +} + + +/* Write a NC_dim to the header */ +static int +v1h_put_NC_dim(v1hs *psp, const NC_dim *dimp) +{ + int status; + + status = v1h_put_NC_string(psp, dimp->name); + if(status != ENOERR) + return status; + + status = v1h_put_size_t(psp, &dimp->size); + if(status != ENOERR) + return status; + + return ENOERR; +} + +/* Read a NC_dim from the header */ +static int +v1h_get_NC_dim(v1hs *gsp, NC_dim **dimpp) +{ + int status; + NC_string *ncstrp; + NC_dim *dimp; + + status = v1h_get_NC_string(gsp, &ncstrp); + if(status != ENOERR) + return status; + + dimp = new_x_NC_dim(ncstrp); + if(dimp == NULL) + { + status = NC_ENOMEM; + goto unwind_name; + } + + status = v1h_get_size_t(gsp, &dimp->size); + if(status != ENOERR) + { + free_NC_dim(dimp); /* frees name */ + return status; + } + + *dimpp = dimp; + + return ENOERR; + +unwind_name: + free_NC_string(ncstrp); + return status; +} + + +/* How much space in the header is required for this NC_dimarray? */ +static size_t +ncx_len_NC_dimarray(const NC_dimarray *ncap) +{ + size_t xlen = X_SIZEOF_NCTYPE; /* type */ + xlen += X_SIZEOF_SIZE_T; /* count */ + if(ncap == NULL) + return xlen; + /* else */ + { + const NC_dim **dpp = (const NC_dim **)ncap->value; + const NC_dim *const *const end = &dpp[ncap->nelems]; + for( /*NADA*/; dpp < end; dpp++) + { + xlen += ncx_len_NC_dim(*dpp); + } + } + return xlen; +} + + +/* Write a NC_dimarray to the header */ +static int +v1h_put_NC_dimarray(v1hs *psp, const NC_dimarray *ncap) +{ + int status; + + assert(psp != NULL); + + if(ncap == NULL +#if 1 + /* Backward: + * This clause is for 'byte for byte' + * backward compatibility. + * Strickly speaking, it is 'bug for bug'. + */ + || ncap->nelems == 0 +#endif + ) + { + /* + * Handle empty netcdf + */ + const size_t nosz = 0; + + status = v1h_put_NCtype(psp, NC_UNSPECIFIED); + if(status != ENOERR) + return status; + status = v1h_put_size_t(psp, &nosz); + if(status != ENOERR) + return status; + return ENOERR; + } + /* else */ + + status = v1h_put_NCtype(psp, NC_DIMENSION); + if(status != ENOERR) + return status; + status = v1h_put_size_t(psp, &ncap->nelems); + if(status != ENOERR) + return status; + + { + const NC_dim **dpp = (const NC_dim **)ncap->value; + const NC_dim *const *const end = &dpp[ncap->nelems]; + for( /*NADA*/; dpp < end; dpp++) + { + status = v1h_put_NC_dim(psp, *dpp); + if(status) + return status; + } + } + return ENOERR; +} + + +/* Read a NC_dimarray from the header */ +static int +v1h_get_NC_dimarray(v1hs *gsp, NC_dimarray *ncap) +{ + int status; + NCtype type = NC_UNSPECIFIED; + + assert(gsp != NULL && gsp->pos != NULL); + assert(ncap != NULL); + assert(ncap->value == NULL); + + status = v1h_get_NCtype(gsp, &type); + if(status != ENOERR) + return status; + + status = v1h_get_size_t(gsp, &ncap->nelems); + if(status != ENOERR) + return status; + + if(ncap->nelems == 0) + return ENOERR; + /* else */ + if(type != NC_DIMENSION) + return EINVAL; + + ncap->value = (NC_dim **) malloc(ncap->nelems * sizeof(NC_dim *)); + if(ncap->value == NULL) + return NC_ENOMEM; + ncap->nalloc = ncap->nelems; + + { + NC_dim **dpp = ncap->value; + NC_dim *const *const end = &dpp[ncap->nelems]; + for( /*NADA*/; dpp < end; dpp++) + { + status = v1h_get_NC_dim(gsp, dpp); + if(status) + { + ncap->nelems = (size_t)(dpp - ncap->value); + free_NC_dimarrayV(ncap); + return status; + } + } + } + + return ENOERR; +} + + +/* End NC_dim */ +/* Begin NC_attr */ + + +/* + * How much space will 'attrp' take in external representation? + * Formerly +NC_xlen_attr(app) + */ +static size_t +ncx_len_NC_attr(const NC_attr *attrp) +{ + size_t sz; + + assert(attrp != NULL); + + sz = ncx_len_NC_string(attrp->name); + sz += X_SIZEOF_NC_TYPE; /* type */ + sz += X_SIZEOF_SIZE_T; /* nelems */ + sz += attrp->xsz; + + return(sz); +} + + +#undef MIN +#define MIN(mm,nn) (((mm) < (nn)) ? (mm) : (nn)) + +/* + * Put the values of an attribute + * The loop is necessary since attrp->nelems + * could potentially be quite large. + */ +static int +v1h_put_NC_attrV(v1hs *psp, const NC_attr *attrp) +{ + int status; + const size_t perchunk = psp->extent; + size_t remaining = attrp->xsz; + void *value = attrp->xvalue; + size_t nbytes; + + assert(psp->extent % X_ALIGN == 0); + + do { + nbytes = MIN(perchunk, remaining); + + status = check_v1hs(psp, nbytes); + if(status != ENOERR) + return status; + + (void) memcpy(psp->pos, value, nbytes); + + psp->pos = (void *)((char *)psp->pos + nbytes); + value = (void *)((char *)value + nbytes); + remaining -= nbytes; + + } while(remaining != 0); + + return ENOERR; +} + +/* Write a NC_attr to the header */ +static int +v1h_put_NC_attr(v1hs *psp, const NC_attr *attrp) +{ + int status; + + status = v1h_put_NC_string(psp, attrp->name); + if(status != ENOERR) + return status; + + status = v1h_put_nc_type(psp, &attrp->type); + if(status != ENOERR) + return status; + + status = v1h_put_size_t(psp, &attrp->nelems); + if(status != ENOERR) + return status; + + status = v1h_put_NC_attrV(psp, attrp); + if(status != ENOERR) + return status; + + return ENOERR; +} + + +/* + * Get the values of an attribute + * The loop is necessary since attrp->nelems + * could potentially be quite large. + */ +static int +v1h_get_NC_attrV(v1hs *gsp, NC_attr *attrp) +{ + int status; + const size_t perchunk = gsp->extent; + size_t remaining = attrp->xsz; + void *value = attrp->xvalue; + size_t nget; + + do { + nget = MIN(perchunk, remaining); + + status = check_v1hs(gsp, nget); + if(status != ENOERR) + return status; + + (void) memcpy(value, gsp->pos, nget); + + gsp->pos = (void *)((char *)gsp->pos + nget); + value = (void *)((char *)value + nget); + remaining -= nget; + + } while(remaining != 0); + + return ENOERR; +} + + +/* Read a NC_attr from the header */ +static int +v1h_get_NC_attr(v1hs *gsp, NC_attr **attrpp) +{ + NC_string *strp; + int status; + nc_type type; + size_t nelems; + NC_attr *attrp; + + status = v1h_get_NC_string(gsp, &strp); + if(status != ENOERR) + return status; + + status = v1h_get_nc_type(gsp, &type); + if(status != ENOERR) + goto unwind_name; + + status = v1h_get_size_t(gsp, &nelems); + if(status != ENOERR) + goto unwind_name; + + attrp = new_x_NC_attr(strp, type, nelems); + if(attrp == NULL) + { + status = NC_ENOMEM; + goto unwind_name; + } + + status = v1h_get_NC_attrV(gsp, attrp); + if(status != ENOERR) + { + free_NC_attr(attrp); /* frees strp */ + return status; + } + + *attrpp = attrp; + + return ENOERR; + +unwind_name: + free_NC_string(strp); + return status; +} + + +/* How much space in the header is required for this NC_attrarray? */ +static size_t +ncx_len_NC_attrarray(const NC_attrarray *ncap) +{ + size_t xlen = X_SIZEOF_NCTYPE; /* type */ + xlen += X_SIZEOF_SIZE_T; /* count */ + if(ncap == NULL) + return xlen; + /* else */ + { + const NC_attr **app = (const NC_attr **)ncap->value; + const NC_attr *const *const end = &app[ncap->nelems]; + for( /*NADA*/; app < end; app++) + { + xlen += ncx_len_NC_attr(*app); + } + } + return xlen; +} + + +/* Write a NC_attrarray to the header */ +static int +v1h_put_NC_attrarray(v1hs *psp, const NC_attrarray *ncap) +{ + int status; + + assert(psp != NULL); + + if(ncap == NULL +#if 1 + /* Backward: + * This clause is for 'byte for byte' + * backward compatibility. + * Strickly speaking, it is 'bug for bug'. + */ + || ncap->nelems == 0 +#endif + ) + { + /* + * Handle empty netcdf + */ + const size_t nosz = 0; + + status = v1h_put_NCtype(psp, NC_UNSPECIFIED); + if(status != ENOERR) + return status; + status = v1h_put_size_t(psp, &nosz); + if(status != ENOERR) + return status; + return ENOERR; + } + /* else */ + + status = v1h_put_NCtype(psp, NC_ATTRIBUTE); + if(status != ENOERR) + return status; + status = v1h_put_size_t(psp, &ncap->nelems); + if(status != ENOERR) + return status; + + { + const NC_attr **app = (const NC_attr **)ncap->value; + const NC_attr *const *const end = &app[ncap->nelems]; + for( /*NADA*/; app < end; app++) + { + status = v1h_put_NC_attr(psp, *app); + if(status) + return status; + } + } + return ENOERR; +} + + +/* Read a NC_attrarray from the header */ +static int +v1h_get_NC_attrarray(v1hs *gsp, NC_attrarray *ncap) +{ + int status; + NCtype type = NC_UNSPECIFIED; + + assert(gsp != NULL && gsp->pos != NULL); + assert(ncap != NULL); + assert(ncap->value == NULL); + + status = v1h_get_NCtype(gsp, &type); + if(status != ENOERR) + return status; + status = v1h_get_size_t(gsp, &ncap->nelems); + if(status != ENOERR) + return status; + + if(ncap->nelems == 0) + return ENOERR; + /* else */ + if(type != NC_ATTRIBUTE) + return EINVAL; + + ncap->value = (NC_attr **) malloc(ncap->nelems * sizeof(NC_attr *)); + if(ncap->value == NULL) + return NC_ENOMEM; + ncap->nalloc = ncap->nelems; + + { + NC_attr **app = ncap->value; + NC_attr *const *const end = &app[ncap->nelems]; + for( /*NADA*/; app < end; app++) + { + status = v1h_get_NC_attr(gsp, app); + if(status) + { + ncap->nelems = (size_t)(app - ncap->value); + free_NC_attrarrayV(ncap); + return status; + } + } + } + + return ENOERR; +} + +/* End NC_attr */ +/* Begin NC_var */ + +/* + * How much space will the xdr'd var take. + * Formerly +NC_xlen_var(vpp) + */ +static size_t +ncx_len_NC_var(const NC_var *varp, size_t sizeof_off_t) +{ + size_t sz; + + assert(varp != NULL); + assert(sizeof_off_t != 0); + + sz = ncx_len_NC_string(varp->name); + sz += X_SIZEOF_SIZE_T; /* ndims */ + sz += ncx_len_int(varp->ndims); /* dimids */ + sz += ncx_len_NC_attrarray(&varp->attrs); + sz += X_SIZEOF_NC_TYPE; /* type */ + sz += X_SIZEOF_SIZE_T; /* len */ + sz += sizeof_off_t; /* begin */ + + return(sz); +} + + +/* Write a NC_var to the header */ +static int +v1h_put_NC_var(v1hs *psp, const NC_var *varp) +{ + int status; + + status = v1h_put_NC_string(psp, varp->name); + if(status != ENOERR) + return status; + + status = v1h_put_size_t(psp, &varp->ndims); + if(status != ENOERR) + return status; + + status = check_v1hs(psp, ncx_len_int(varp->ndims)); + if(status != ENOERR) + return status; + status = ncx_putn_int_int(&psp->pos, + varp->ndims, varp->dimids); + if(status != ENOERR) + return status; + + status = v1h_put_NC_attrarray(psp, &varp->attrs); + if(status != ENOERR) + return status; + + status = v1h_put_nc_type(psp, &varp->type); + if(status != ENOERR) + return status; + + status = v1h_put_size_t(psp, &varp->len); + if(status != ENOERR) + return status; + + status = check_v1hs(psp, psp->version == 1 ? 4 : 8); + if(status != ENOERR) + return status; + status = ncx_put_off_t(&psp->pos, &varp->begin, psp->version == 1 ? 4 : 8); + if(status != ENOERR) + return status; + + return ENOERR; +} + + +/* Read a NC_var from the header */ +static int +v1h_get_NC_var(v1hs *gsp, NC_var **varpp) +{ + NC_string *strp; + int status; + size_t ndims; + NC_var *varp; + + status = v1h_get_NC_string(gsp, &strp); + if(status != ENOERR) + return status; + + status = v1h_get_size_t(gsp, &ndims); + if(status != ENOERR) + goto unwind_name; + + varp = new_x_NC_var(strp, ndims); + if(varp == NULL) + { + status = NC_ENOMEM; + goto unwind_name; + } + + status = check_v1hs(gsp, ncx_len_int(ndims)); + if(status != ENOERR) + goto unwind_alloc; + status = ncx_getn_int_int((const void **)(&gsp->pos), + ndims, varp->dimids); + if(status != ENOERR) + goto unwind_alloc; + + status = v1h_get_NC_attrarray(gsp, &varp->attrs); + if(status != ENOERR) + goto unwind_alloc; + + status = v1h_get_nc_type(gsp, &varp->type); + if(status != ENOERR) + goto unwind_alloc; + + status = v1h_get_size_t(gsp, &varp->len); + if(status != ENOERR) + goto unwind_alloc; + + status = check_v1hs(gsp, gsp->version == 1 ? 4 : 8); + if(status != ENOERR) + goto unwind_alloc; + status = ncx_get_off_t((const void **)&gsp->pos, + &varp->begin, gsp->version == 1 ? 4 : 8); + if(status != ENOERR) + goto unwind_alloc; + + *varpp = varp; + return ENOERR; + +unwind_alloc: + free_NC_var(varp); /* frees name */ + return status; + +unwind_name: + free_NC_string(strp); + return status; +} + + +/* How much space in the header is required for this NC_vararray? */ +static size_t +ncx_len_NC_vararray(const NC_vararray *ncap, size_t sizeof_off_t) +{ + size_t xlen = X_SIZEOF_NCTYPE; /* type */ + xlen += X_SIZEOF_SIZE_T; /* count */ + if(ncap == NULL) + return xlen; + /* else */ + { + const NC_var **vpp = (const NC_var **)ncap->value; + const NC_var *const *const end = &vpp[ncap->nelems]; + for( /*NADA*/; vpp < end; vpp++) + { + xlen += ncx_len_NC_var(*vpp, sizeof_off_t); + } + } + return xlen; +} + + +/* Write a NC_vararray to the header */ +static int +v1h_put_NC_vararray(v1hs *psp, const NC_vararray *ncap) +{ + int status; + + assert(psp != NULL); + + if(ncap == NULL +#if 1 + /* Backward: + * This clause is for 'byte for byte' + * backward compatibility. + * Strickly speaking, it is 'bug for bug'. + */ + || ncap->nelems == 0 +#endif + ) + { + /* + * Handle empty netcdf + */ + const size_t nosz = 0; + + status = v1h_put_NCtype(psp, NC_UNSPECIFIED); + if(status != ENOERR) + return status; + status = v1h_put_size_t(psp, &nosz); + if(status != ENOERR) + return status; + return ENOERR; + } + /* else */ + + status = v1h_put_NCtype(psp, NC_VARIABLE); + if(status != ENOERR) + return status; + status = v1h_put_size_t(psp, &ncap->nelems); + if(status != ENOERR) + return status; + + { + const NC_var **vpp = (const NC_var **)ncap->value; + const NC_var *const *const end = &vpp[ncap->nelems]; + for( /*NADA*/; vpp < end; vpp++) + { + status = v1h_put_NC_var(psp, *vpp); + if(status) + return status; + } + } + return ENOERR; +} + + +/* Read a NC_vararray from the header */ +static int +v1h_get_NC_vararray(v1hs *gsp, NC_vararray *ncap) +{ + int status; + NCtype type = NC_UNSPECIFIED; + + assert(gsp != NULL && gsp->pos != NULL); + assert(ncap != NULL); + assert(ncap->value == NULL); + + status = v1h_get_NCtype(gsp, &type); + if(status != ENOERR) + return status; + + status = v1h_get_size_t(gsp, &ncap->nelems); + if(status != ENOERR) + return status; + + if(ncap->nelems == 0) + return ENOERR; + /* else */ + if(type != NC_VARIABLE) + return EINVAL; + + ncap->value = (NC_var **) malloc(ncap->nelems * sizeof(NC_var *)); + if(ncap->value == NULL) + return NC_ENOMEM; + ncap->nalloc = ncap->nelems; + + { + NC_var **vpp = ncap->value; + NC_var *const *const end = &vpp[ncap->nelems]; + for( /*NADA*/; vpp < end; vpp++) + { + status = v1h_get_NC_var(gsp, vpp); + if(status) + { + ncap->nelems = (size_t)(vpp - ncap->value); + free_NC_vararrayV(ncap); + return status; + } + } + } + + return ENOERR; +} + + +/* End NC_var */ +/* Begin NC */ + +/* + * Recompute the shapes of all variables + * Sets ncp->begin_var to start of first variable. + * Sets ncp->begin_rec to start of first record variable. + * Returns -1 on error. The only possible error is a reference + * to a non existent dimension, which could occur for a corrupted + * netcdf file. + */ +static int +NC_computeshapes(NC *ncp) +{ + NC_var **vpp = (NC_var **)ncp->vars.value; + NC_var *const *const end = &vpp[ncp->vars.nelems]; + NC_var *first_var = NULL; /* first "non-record" var */ + NC_var *first_rec = NULL; /* first "record" var */ + int status; + + ncp->begin_var = (off_t) ncp->xsz; + ncp->begin_rec = (off_t) ncp->xsz; + ncp->recsize = 0; + + if(ncp->vars.nelems == 0) + return(0); + + for( /*NADA*/; vpp < end; vpp++) + { + status = NC_var_shape(*vpp, &ncp->dims); + if(status != ENOERR) + return(status); + + if(IS_RECVAR(*vpp)) + { + if(first_rec == NULL) + first_rec = *vpp; + if((*vpp)->len == UINT32_MAX) + ncp->recsize += (*vpp)->dsizes[0]; + else + ncp->recsize += (*vpp)->len; + } + else + { + if(first_var == NULL) + first_var = *vpp; + /* + * Overwritten each time thru. + * Usually overwritten in first_rec != NULL clause below. + */ + ncp->begin_rec = (*vpp)->begin + (off_t)(*vpp)->len; + } + } + + if(first_rec != NULL) + { + assert(ncp->begin_rec <= first_rec->begin); + ncp->begin_rec = first_rec->begin; + /* + * for special case of exactly one record variable, pack value + */ + if(ncp->recsize == first_rec->len) + ncp->recsize = *first_rec->dsizes * first_rec->xsz; + } + + if(first_var != NULL) + { + ncp->begin_var = first_var->begin; + } + else + { + ncp->begin_var = ncp->begin_rec; + } + + assert(ncp->begin_var > 0); + assert(ncp->xsz <= (size_t)ncp->begin_var); + assert(ncp->begin_rec > 0); + assert(ncp->begin_var <= ncp->begin_rec); + + return(ENOERR); +} + +/* How much space in the header is required for the NC data structure? */ +size_t +ncx_len_NC(const NC *ncp, size_t sizeof_off_t) +{ + size_t xlen = sizeof(ncmagic); + + assert(ncp != NULL); + + xlen += X_SIZEOF_SIZE_T; /* numrecs */ + xlen += ncx_len_NC_dimarray(&ncp->dims); + xlen += ncx_len_NC_attrarray(&ncp->attrs); + xlen += ncx_len_NC_vararray(&ncp->vars, sizeof_off_t); + + return xlen; +} + + +/* Write the file header */ +int +ncx_put_NC(const NC *ncp, void **xpp, off_t offset, size_t extent) +{ + int status = ENOERR; + v1hs ps; /* the get stream */ + + assert(ncp != NULL); + + /* Initialize stream ps */ + + ps.nciop = ncp->nciop; + ps.flags = RGN_WRITE; + + if (ncp->flags & NC_64BIT_OFFSET) + ps.version = 2; + else + ps.version = 1; + + if(xpp == NULL) + { + /* + * Come up with a reasonable stream read size. + */ + extent = ncp->xsz; + if(extent <= MIN_NC_XSZ) + { + /* first time read */ + extent = ncp->chunk; + /* Protection for when ncp->chunk is huge; + * no need to read hugely. */ + if(extent > 4096) + extent = 4096; + } + else if(extent > ncp->chunk) + extent = ncp->chunk; + + ps.offset = 0; + ps.extent = extent; + ps.base = NULL; + ps.pos = ps.base; + + status = fault_v1hs(&ps, extent); + if(status) + return status; + } + else + { + ps.offset = offset; + ps.extent = extent; + ps.base = *xpp; + ps.pos = ps.base; + ps.end = (char *)ps.base + ps.extent; + } + + if (ps.version == 2) + status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic), ncmagic); + else + status = ncx_putn_schar_schar(&ps.pos, sizeof(ncmagic1), ncmagic1); + if(status != ENOERR) + goto release; + + { + const size_t nrecs = NC_get_numrecs(ncp); + status = ncx_put_size_t(&ps.pos, &nrecs); + if(status != ENOERR) + goto release; + } + + assert((char *)ps.pos < (char *)ps.end); + + status = v1h_put_NC_dimarray(&ps, &ncp->dims); + if(status != ENOERR) + goto release; + + status = v1h_put_NC_attrarray(&ps, &ncp->attrs); + if(status != ENOERR) + goto release; + + status = v1h_put_NC_vararray(&ps, &ncp->vars); + if(status != ENOERR) + goto release; + +release: + (void) rel_v1hs(&ps); + + return status; +} + + +/* Make the in-memory NC structure from reading the file header */ +int +nc_get_NC(NC *ncp) +{ + int status; + v1hs gs; /* the get stream */ + + assert(ncp != NULL); + + /* Initialize stream gs */ + + gs.nciop = ncp->nciop; + gs.offset = 0; /* beginning of file */ + gs.extent = 0; + gs.flags = 0; + gs.version = 0; + gs.base = NULL; + gs.pos = gs.base; + + { + /* + * Come up with a reasonable stream read size. + */ + off_t filesize; + size_t extent = MIN_NC_XSZ; + + extent = ncp->xsz; + if(extent <= MIN_NC_XSZ) + { + status = ncio_filesize(ncp->nciop, &filesize); + if(status) + return status; + if(filesize < sizeof(ncmagic)) { /* too small, not netcdf */ + + status = NC_ENOTNC; + return status; + } + /* first time read */ + extent = ncp->chunk; + /* Protection for when ncp->chunk is huge; + * no need to read hugely. */ + if(extent > 4096) + extent = 4096; + if(extent > filesize) + extent = filesize; + } + else if(extent > ncp->chunk) + extent = ncp->chunk; + + /* + * Invalidate the I/O buffers to force a read of the header + * region. + */ + status = ncio_sync(gs.nciop); + if(status) + return status; + + status = fault_v1hs(&gs, extent); + if(status) + return status; + } + + /* get the header from the stream gs */ + + { + /* Get & check magic number */ + schar magic[sizeof(ncmagic)]; + (void) memset(magic, 0, sizeof(magic)); + + status = ncx_getn_schar_schar( + (const void **)(&gs.pos), sizeof(magic), magic); + if(status != ENOERR) + goto unwind_get; + + if(memcmp(magic, ncmagic, sizeof(ncmagic)-1) != 0) + { + status = NC_ENOTNC; + goto unwind_get; + } + /* Check version number in last byte of magic */ + if (magic[sizeof(ncmagic)-1] == 0x1) { + gs.version = 1; + } else if (magic[sizeof(ncmagic)-1] == 0x2) { + gs.version = 2; + fSet(ncp->flags, NC_64BIT_OFFSET); + /* Now we support version 2 file access on non-LFS systems -- rkr */ +#if 0 + if (sizeof(off_t) != 8) { + fprintf(stderr, "NETCDF WARNING: Version 2 file on 32-bit system.\n"); + } +#endif + } else { + status = NC_ENOTNC; + goto unwind_get; + } + } + + { + size_t nrecs = 0; + status = ncx_get_size_t((const void **)(&gs.pos), &nrecs); + if(status != ENOERR) + goto unwind_get; + NC_set_numrecs(ncp, nrecs); + } + + assert((char *)gs.pos < (char *)gs.end); + + status = v1h_get_NC_dimarray(&gs, &ncp->dims); + if(status != ENOERR) + goto unwind_get; + + status = v1h_get_NC_attrarray(&gs, &ncp->attrs); + if(status != ENOERR) + goto unwind_get; + + status = v1h_get_NC_vararray(&gs, &ncp->vars); + if(status != ENOERR) + goto unwind_get; + + ncp->xsz = ncx_len_NC(ncp, (gs.version == 1) ? 4 : 8); + + status = NC_computeshapes(ncp); + if(status != ENOERR) + goto unwind_get; + +unwind_get: + (void) rel_v1hs(&gs); + return status; +} diff --git a/extern/src_netcdf4/var.c b/extern/src_netcdf4/var.c new file mode 100644 index 0000000..8bcbb8b --- /dev/null +++ b/extern/src_netcdf4/var.c @@ -0,0 +1,740 @@ +/* + * Copyright 1996, University Corporation for Atmospheric Research + * See netcdf/COPYRIGHT file for copying and redistribution conditions. + */ +/* $Id: var.c,v 1.144 2010/05/30 00:50:35 russ Exp $ */ + +#include "nc.h" +#include +#include +#include +#include +#include "ncx.h" +#include "rnd.h" +#include "utf8proc.h" + +#ifndef OFF_T_MAX +#define OFF_T_MAX (~ (off_t) 0 - (~ (off_t) 0 << (CHAR_BIT * sizeof (off_t) - 1))) +#endif + +/* + * Free var + * Formerly +NC_free_var(var) + */ +void +free_NC_var(NC_var *varp) +{ + if(varp == NULL) + return; + free_NC_attrarrayV(&varp->attrs); + free_NC_string(varp->name); +#ifndef MALLOCHACK + if(varp->dimids != NULL) free(varp->dimids); + if(varp->shape != NULL) free(varp->shape); + if(varp->dsizes != NULL) free(varp->dsizes); +#endif /*!MALLOCHACK*/ + free(varp); +} + + +/* + * Common code for new_NC_var() + * and ncx_get_NC_var() + */ +NC_var * +new_x_NC_var( + NC_string *strp, + size_t ndims) +{ + NC_var *varp; + const size_t o1 = M_RNDUP(ndims * sizeof(int)); + const size_t o2 = M_RNDUP(ndims * sizeof(size_t)); + +#ifdef MALLOCHACK + const size_t sz = M_RNDUP(sizeof(NC_var)) + + o1 + o2 + ndims * sizeof(off_t); +#else /*!MALLOCHACK*/ + const size_t o3 = ndims * sizeof(off_t); + const size_t sz = sizeof(NC_var); +#endif /*!MALLOCHACK*/ + + varp = (NC_var *) malloc(sz); + if(varp == NULL ) + return NULL; + (void) memset(varp, 0, sz); + varp->name = strp; + varp->ndims = ndims; + varp->hash = hash_fast(strp->cp, strlen(strp->cp)); + + if(ndims != 0) + { +#ifdef MALLOCHACK + /* + * NOTE: lint may complain about the next 3 lines: + * "pointer cast may result in improper alignment". + * We use the M_RNDUP() macro to get the proper alignment. + */ + varp->dimids = (int *)((char *)varp + M_RNDUP(sizeof(NC_var))); + varp->shape = (size_t *)((char *)varp->dimids + o1); + varp->dsizes = (off_t *)((char *)varp->shape + o2); +#else /*!MALLOCHACK*/ + varp->dimids = (int*)malloc(o1); + varp->shape = (size_t*)malloc(o2); + varp->dsizes = (off_t*)malloc(o3); +#endif /*!MALLOCHACK*/ + } + + varp->xsz = 0; + varp->len = 0; + varp->begin = 0; + + return varp; +} + + +/* + * Formerly +NC_new_var() + */ +static NC_var * +new_NC_var(const char *uname, nc_type type, + size_t ndims, const int *dimids) +{ + NC_string *strp; + NC_var *varp; + + char *name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NULL; + strp = new_NC_string(strlen(name), name); + free(name); + if(strp == NULL) + return NULL; + + varp = new_x_NC_var(strp, ndims); + if(varp == NULL ) + { + free_NC_string(strp); + return NULL; + } + + varp->type = type; + + if( ndims != 0 && dimids != NULL) + (void) memcpy(varp->dimids, dimids, ndims * sizeof(int)); + + return(varp); +} + + +static NC_var * +dup_NC_var(const NC_var *rvarp) +{ + NC_var *varp = new_NC_var(rvarp->name->cp, rvarp->type, + rvarp->ndims, rvarp->dimids); + if(varp == NULL) + return NULL; + + + if(dup_NC_attrarrayV(&varp->attrs, &rvarp->attrs) != NC_NOERR) + { + free_NC_var(varp); + return NULL; + } + + (void) memcpy(varp->shape, rvarp->shape, + rvarp->ndims * sizeof(size_t)); + (void) memcpy(varp->dsizes, rvarp->dsizes, + rvarp->ndims * sizeof(size_t)); + varp->xsz = rvarp->xsz; + varp->len = rvarp->len; + varp->begin = rvarp->begin; + + return varp; +} + + +/* vararray */ + + +/* + * Free the stuff "in" (referred to by) an NC_vararray. + * Leaves the array itself allocated. + */ +void +free_NC_vararrayV0(NC_vararray *ncap) +{ + assert(ncap != NULL); + + if(ncap->nelems == 0) + return; + + assert(ncap->value != NULL); + + { + NC_var **vpp = ncap->value; + NC_var *const *const end = &vpp[ncap->nelems]; + for( /*NADA*/; vpp < end; vpp++) + { + free_NC_var(*vpp); + *vpp = NULL; + } + } + ncap->nelems = 0; +} + + +/* + * Free NC_vararray values. + * formerly +NC_free_array() + */ +void +free_NC_vararrayV(NC_vararray *ncap) +{ + assert(ncap != NULL); + + if(ncap->nalloc == 0) + return; + + assert(ncap->value != NULL); + + free_NC_vararrayV0(ncap); + + free(ncap->value); + ncap->value = NULL; + ncap->nalloc = 0; +} + + +int +dup_NC_vararrayV(NC_vararray *ncap, const NC_vararray *ref) +{ + int status = NC_NOERR; + + assert(ref != NULL); + assert(ncap != NULL); + + if(ref->nelems != 0) + { + const size_t sz = ref->nelems * sizeof(NC_var *); + ncap->value = (NC_var **) malloc(sz); + if(ncap->value == NULL) + return NC_ENOMEM; + (void) memset(ncap->value, 0, sz); + ncap->nalloc = ref->nelems; + } + + ncap->nelems = 0; + { + NC_var **vpp = ncap->value; + const NC_var **drpp = (const NC_var **)ref->value; + NC_var *const *const end = &vpp[ref->nelems]; + for( /*NADA*/; vpp < end; drpp++, vpp++, ncap->nelems++) + { + *vpp = dup_NC_var(*drpp); + if(*vpp == NULL) + { + status = NC_ENOMEM; + break; + } + } + } + + if(status != NC_NOERR) + { + free_NC_vararrayV(ncap); + return status; + } + + assert(ncap->nelems == ref->nelems); + + return NC_NOERR; +} + + +/* + * Add a new handle on the end of an array of handles + * Formerly +NC_incr_array(array, tail) + */ +static int +incr_NC_vararray(NC_vararray *ncap, NC_var *newelemp) +{ + NC_var **vp; + + assert(ncap != NULL); + + if(ncap->nalloc == 0) + { + assert(ncap->nelems == 0); + vp = (NC_var **) malloc(NC_ARRAY_GROWBY * sizeof(NC_var *)); + if(vp == NULL) + return NC_ENOMEM; + ncap->value = vp; + ncap->nalloc = NC_ARRAY_GROWBY; + } + else if(ncap->nelems +1 > ncap->nalloc) + { + vp = (NC_var **) realloc(ncap->value, + (ncap->nalloc + NC_ARRAY_GROWBY) * sizeof(NC_var *)); + if(vp == NULL) + return NC_ENOMEM; + ncap->value = vp; + ncap->nalloc += NC_ARRAY_GROWBY; + } + + if(newelemp != NULL) + { + ncap->value[ncap->nelems] = newelemp; + ncap->nelems++; + } + return NC_NOERR; +} + + +static NC_var * +elem_NC_vararray(const NC_vararray *ncap, size_t elem) +{ + assert(ncap != NULL); + /* cast needed for braindead systems with signed size_t */ + if(ncap->nelems == 0 || (unsigned long)elem >= ncap->nelems) + return NULL; + + assert(ncap->value != NULL); + + return ncap->value[elem]; +} + + +/* End vararray per se */ + + +/* + * Step thru NC_VARIABLE array, seeking match on name. + * Return varid or -1 on not found. + * *varpp is set to the appropriate NC_var. + * Formerly (sort of) +NC_hvarid + */ +int +NC_findvar(const NC_vararray *ncap, const char *uname, NC_var **varpp) +{ + NC_var **loc; + uint32_t shash; + int varid; + char *name; + + assert(ncap != NULL); + + if(ncap->nelems == 0) + return -1; + + loc = (NC_var **) ncap->value; + + /* normalized version of uname */ + name = (char *)utf8proc_NFC((const unsigned char *)uname); + if(name == NULL) + return NC_ENOMEM; + shash = hash_fast(name, strlen(name)); + + for(varid = 0; (size_t) varid < ncap->nelems; varid++, loc++) + { + if((*loc)->hash == shash && + strncmp((*loc)->name->cp, name, strlen(name)) == 0) + { + if(varpp != NULL) + *varpp = *loc; + free(name); + return(varid); /* Normal return */ + } + } + free(name); + return(-1); /* not found */ +} + +/* + * For a netcdf type + * return the size of one element in the external representation. + * Note that arrays get rounded up to X_ALIGN boundaries. + * Formerly +NC_xtypelen + * See also ncx_len() + */ +size_t +ncx_szof(nc_type type) +{ + switch(type){ + case NC_BYTE: + case NC_CHAR: + return(1); + case NC_SHORT : + return(2); + case NC_INT: + return X_SIZEOF_INT; + case NC_FLOAT: + return X_SIZEOF_FLOAT; + case NC_DOUBLE : + return X_SIZEOF_DOUBLE; + default: + assert("ncx_szof invalid type" == 0); + return 0; + } +} + + +/* + * 'compile' the shape and len of a variable + * Formerly +NC_var_shape(var, dims) + */ +int +NC_var_shape(NC_var *varp, const NC_dimarray *dims) +{ + size_t *shp, *op; + off_t *dsp; + int *ip; + const NC_dim *dimp; + off_t product = 1; + + varp->xsz = ncx_szof(varp->type); + + if(varp->ndims == 0) + { + goto out; + } + + /* + * use the user supplied dimension indices + * to determine the shape + */ + for(ip = varp->dimids, op = varp->shape + ; ip < &varp->dimids[varp->ndims]; ip++, op++) + { + if(*ip < 0 || (size_t) (*ip) >= ((dims != NULL) ? dims->nelems : 1) ) + return NC_EBADDIM; + + dimp = elem_NC_dimarray(dims, (size_t)*ip); + *op = dimp->size; + if(*op == NC_UNLIMITED && ip != varp->dimids) + return NC_EUNLIMPOS; + } + + /* + * Compute the dsizes + */ + /* ndims is > 0 here */ + for(shp = varp->shape + varp->ndims -1, + dsp = varp->dsizes + varp->ndims -1; + shp >= varp->shape; + shp--, dsp--) + { + if(!(shp == varp->shape && IS_RECVAR(varp))) + { + if( (off_t)(*shp) <= OFF_T_MAX / product ) + { + product *= *shp; + } else + { + product = OFF_T_MAX ; + } + } + *dsp = product; + } + + +out : + if( varp->xsz <= (X_UINT_MAX - 1) / product ) /* if integer multiply will not overflow */ + { + varp->len = product * varp->xsz; + switch(varp->type) { + case NC_BYTE : + case NC_CHAR : + case NC_SHORT : + if( varp->len%4 != 0 ) + { + varp->len += 4 - varp->len%4; /* round up */ + /* *dsp += 4 - *dsp%4; */ + } + break; + default: + /* already aligned */ + break; + } + } else + { /* OK for last var to be "too big", indicated by this special len */ + varp->len = X_UINT_MAX; + } +#if 0 + arrayp("\tshape", varp->ndims, varp->shape); + arrayp("\tdsizes", varp->ndims, varp->dsizes); +#endif + return NC_NOERR; +} + +/* + * Check whether variable size is less than or equal to vlen_max, + * without overflowing in arithmetic calculations. If OK, return 1, + * else, return 0. For CDF1 format or for CDF2 format on non-LFS + * platforms, vlen_max should be 2^31 - 4, but for CDF2 format on + * systems with LFS it should be 2^32 - 4. + */ +int +NC_check_vlen(NC_var *varp, size_t vlen_max) { + size_t prod=varp->xsz; /* product of xsz and dimensions so far */ + + int ii; + + assert(varp != NULL); + for(ii = IS_RECVAR(varp) ? 1 : 0; ii < varp->ndims; ii++) { + if (varp->shape[ii] > vlen_max / prod) { + return 0; /* size in bytes won't fit in a 32-bit int */ + } + prod *= varp->shape[ii]; + } + return 1; /* OK */ +} + + +/* + * Given valid ncp and varid, return var + * else NULL on error + * Formerly +NC_hlookupvar() + */ +NC_var * +NC_lookupvar(NC *ncp, int varid) +{ + NC_var *varp; + + if(varid == NC_GLOBAL) + { + /* Global is error in this context */ + return(NULL); + } + + varp = elem_NC_vararray(&ncp->vars, (size_t)varid); + if(varp == NULL) + { + return NULL; + } + + assert(varp != NULL); + + return(varp); +} + + +/* Public */ + +int +NC3_def_var( int ncid, const char *name, nc_type type, + int ndims, const int *dimids, int *varidp) +{ + int status; + NC *ncp; + int varid; + NC_var *varp; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(!NC_indef(ncp)) + { + return NC_ENOTINDEFINE; + } + + status = NC_check_name(name); + if(status != NC_NOERR) + return status; + + status = nc_cktype(type); + if(status != NC_NOERR) + return status; + + /* cast needed for braindead systems with signed size_t */ + if((unsigned long) ndims > X_INT_MAX) /* Backward compat */ + { + return NC_EINVAL; + } + + if(ncp->vars.nelems >= NC_MAX_VARS) + { + return NC_EMAXVARS; + } + + varid = NC_findvar(&ncp->vars, name, &varp); + if(varid != -1) + { + return NC_ENAMEINUSE; + } + + varp = new_NC_var(name, type, ndims, dimids); + if(varp == NULL) + return NC_ENOMEM; + + status = NC_var_shape(varp, &ncp->dims); + if(status != NC_NOERR) + { + free_NC_var(varp); + return status; + } + + status = incr_NC_vararray(&ncp->vars, varp); + if(status != NC_NOERR) + { + free_NC_var(varp); + return status; + } + + if(varidp != NULL) + *varidp = (int)ncp->vars.nelems -1; /* varid */ + return NC_NOERR; +} + + +int +NC3_inq_varid(int ncid, const char *name, int *varid_ptr) +{ + int status; + NC *ncp; + NC_var *varp; + int varid; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + varid = NC_findvar(&ncp->vars, name, &varp); + if(varid == -1) + { + return NC_ENOTVAR; + } + + *varid_ptr = varid; + return NC_NOERR; +} + + +int +NC3_inq_var(int ncid, + int varid, + char *name, + nc_type *typep, + int *ndimsp, + int *dimids, + int *nattsp) +{ + int status; + NC *ncp; + NC_var *varp; + size_t ii; + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + varp = elem_NC_vararray(&ncp->vars, (size_t)varid); + if(varp == NULL) + return NC_ENOTVAR; + + if(name != NULL) + { + (void) strncpy(name, varp->name->cp, varp->name->nchars); + name[varp->name->nchars] = 0; + } + + if(typep != 0) + *typep = varp->type; + if(ndimsp != 0) + { + *ndimsp = (int) varp->ndims; + } + if(dimids != 0) + { + for(ii = 0; ii < varp->ndims; ii++) + { + dimids[ii] = varp->dimids[ii]; + } + } + if(nattsp != 0) + { + *nattsp = (int) varp->attrs.nelems; + } + + return NC_NOERR; +} + +int +NC3_rename_var(int ncid, int varid, const char *unewname) +{ + int status; + NC *ncp; + NC_var *varp; + NC_string *old, *newStr; + int other; + char *newname; /* normalized */ + + status = NC_check_id(ncid, &ncp); + if(status != NC_NOERR) + return status; + + if(NC_readonly(ncp)) + { + return NC_EPERM; + } + + status = NC_check_name(unewname); + if(status != NC_NOERR) + return status; + + /* check for name in use */ + other = NC_findvar(&ncp->vars, unewname, &varp); + if(other != -1) + { + return NC_ENAMEINUSE; + } + + varp = NC_lookupvar(ncp, varid); + if(varp == NULL) + { + /* invalid varid */ + return NC_ENOTVAR; /* TODO: is this the right error code? */ + } + + old = varp->name; + newname = (char *)utf8proc_NFC((const unsigned char *)unewname); + if(newname == NULL) + return NC_ENOMEM; + if(NC_indef(ncp)) + { + newStr = new_NC_string(strlen(newname),newname); + free(newname); + if(newStr == NULL) + return(-1); + varp->name = newStr; + varp->hash = hash_fast(newStr->cp, strlen(newStr->cp)); + free_NC_string(old); + return NC_NOERR; + } + + /* else, not in define mode */ + status = set_NC_string(varp->name, newname); + varp->hash = hash_fast(newname, strlen(newname)); + free(newname); + if(status != NC_NOERR) + return status; + + set_NC_hdirty(ncp); + + if(NC_doHsync(ncp)) + { + status = NC_sync(ncp); + if(status != NC_NOERR) + return status; + } + + return NC_NOERR; +} diff --git a/extern/src_netcdf4/xxdr.c b/extern/src_netcdf4/xxdr.c new file mode 100644 index 0000000..9a93038 --- /dev/null +++ b/extern/src_netcdf4/xxdr.c @@ -0,0 +1,463 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. */ + +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * from: @(#)xdr.h 1.19 87/04/22 SMI + * from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC + * $FreeBSD: src/include/rpc/xdr.h,v 1.23 2003/03/07 13:19:40 nectar Exp $ + * $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $ + */ + +/* Define our own implementation of the needed + elements of XDR. Assumes read-only +*/ + +#undef XXDRTRACE + +#include "config.h" +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "xxdr.h" + +int xxdr_network_order; /* network order is big endian */ +static int xxdr_big_endian; /* what is this machine? */ + +#ifdef XXDRTRACE +static void +xxdrtrace(XXDR* xdr, char* where, off_t arg) +{ +fprintf(stderr,"xxdr: %s: arg=%ld ; pos=%ld len=%ld\n", + where,arg,(long)xdr->pos,(long)xdr->length); +fflush(stderr); +} +#else +#define xxdrtrace(x,y,z) +#endif + +/* Read-only operations */ + +int xxdr_getbytes(XXDR* xdrs, char* memory, off_t count) +{ + if(!memory) return 0; + if(!xdrs->getbytes(xdrs,memory,count)) + return 0; + return 1; +} + + +/* get a unsigned int from underlying stream*/ +int +xxdr_uint(XXDR* xdr, unsigned int* ip) +{ + if(!ip) return 0; + if(!xdr->getbytes(xdr,(char*)ip,sizeof(*ip))) + return 0; + /*convert from network order*/ + if(!xxdr_network_order) { + swapinline32(ip); + } + return 1; +} + +/* get a long long from underlying stream*/ +int +xxdr_ulonglong(XXDR* xdr, unsigned long* llp) +{ + /* Pull two units */ + if(!llp) return 0; + if(!xdr->getbytes(xdr,(char*)llp,sizeof(*llp))) + return 0; + /* Convert to signed/unsigned */ + /*convert from network order*/ + if(!xxdr_network_order) { + swapinline64(llp); + } + return 1; +} + +/* get some bytes from underlying stream; + will move xdrs pointer to next XDRUNIT boundary*/ +int +xxdr_opaque(XXDR* xdr, char* mem, off_t count) +{ + off_t pos,rounded; + if(!xdr->getbytes(xdr,mem,count)) + return 0; + pos = xxdr_getpos(xdr); + rounded = RNDUP(pos); + return xxdr_skip(xdr,(rounded - pos)); +} + +/* get counted string from underlying stream*/ +int +xxdr_string(XXDR* xdrs, char** sp, off_t* lenp) +{ + char* s; + unsigned int len; + if(!xxdr_uint(xdrs,&len)) return 0; + s = (char*)malloc((off_t)len+1); + if(s == NULL) return 0; + if(!xxdr_opaque(xdrs,s,len)) { + free((void*)s); + return 0; + } + s[len] = '\0'; /* make sure it is null terminated */ + if(sp) *sp = s; + if(lenp) *lenp = len; + /* xxdr_opaque will have skippped any trailing bytes */ + return 1; +} + +/* returns bytes off from beginning*/ +off_t +xxdr_getpos(XXDR* xdr) +{ + return xdr->getpos(xdr); +} + +/* reposition the stream*/ +int +xxdr_setpos(XXDR* xdr, off_t pos) +{ + return xdr->setpos(xdr,pos); +} + +/* returns total available starting at current position */ +off_t +xxdr_getavail(XXDR* xdr) +{ + return xdr->getavail(xdr); +} + +/* free up XXDR structure */ +void +xxdr_free(XXDR* xdr) +{ + xdr->free(xdr); +} + +/***********************************/ + +/* Skip exacly "len" bytes in the input; any rounding must be done by the caller*/ +int +xxdr_skip(XXDR* xdrs, off_t len) +{ + unsigned int pos; + pos = xxdr_getpos(xdrs); + pos = (pos + len); + if(pos < 0) pos = 0; + return xxdr_setpos(xdrs,pos); +} + +/* skip "n" string/bytestring instances in the input*/ +int +xxdr_skip_strings(XXDR* xdrs, off_t n) +{ + while(n-- > 0) { + unsigned int slen; + if(!xxdr_uint(xdrs,&slen)) return 0; + slen = RNDUP(slen); + if(xxdr_skip(xdrs,slen)) return 0; + } + return 1; +} + +unsigned int +xdr_roundup(unsigned int n) +{ + unsigned int rounded; + rounded = RNDUP(n); + return rounded; +} + +unsigned int +ocbyteswap(unsigned int i) +{ + unsigned int swap,b0,b1,b2,b3; + b0 = (i>>24) & 0x000000ff; + b1 = (i>>16) & 0x000000ff; + b2 = (i>>8) & 0x000000ff; + b3 = (i) & 0x000000ff; + swap = (b0 | (b1 << 8) | (b2 << 16) | (b3 << 24)); + return swap; +} + +/**************************************************/ +/* File based xdr */ +static void +xxdr_filefree(XXDR* xdrs) +{ + if(xdrs != NULL) { + (void)fflush((FILE *)xdrs->data); + free(xdrs); + } +} + +static int +xxdr_filegetbytes(XXDR* xdrs, char* addr, off_t len) +{ + int ok = 1; + int count; + +xxdrtrace(xdrs,"getbytes",len); + if(len < 0) len = 0; + if(!xdrs->valid) + { + if(fseek((FILE *)xdrs->data, xdrs->pos + xdrs->base, 0) != 0) { + ok=0; + goto done; + } + xdrs->valid = 1; + } + if(xdrs->pos + len > xdrs->length) + return 0; + if(len > 0) { + count = fread(addr, len, 1, (FILE*)xdrs->data); + if(count <= 0) { + ok=0; + goto done; + } + } + xdrs->pos += len; +done: + return ok; +} + +static off_t +xxdr_filegetpos(XXDR* xdrs) +{ +xxdrtrace(xdrs,"getpos",0); + return xdrs->pos; +} + +static off_t +xxdr_filegetavail(XXDR* xdrs) +{ +xxdrtrace(xdrs,"getavail",0); + return (xdrs->length - xdrs->pos); +} + +static int +xxdr_filesetpos(XXDR* xdrs, off_t pos) +{ + int ok = 1; +xxdrtrace(xdrs,"setpos",pos); + if(pos == xdrs->pos) goto done; + if(pos < 0) pos = 0; + if(pos > xdrs->length) {ok=0;goto done;} + xdrs->pos = pos; + xdrs->valid = 0; +done: + return ok; +} + + +/* +Modified to track the current position to avoid the file io +operation. Not sure if this worth the effort because I +don't actually know the cost to doing an fseek +*/ + +/* + * Initialize a stdio xdr stream. + * Sets the xdr stream handle xdrs for use on the stream file. + * Operation flag is set to op. + */ +XXDR* +xxdr_filecreate(FILE* file, off_t base) +{ + XXDR* xdrs = (XXDR*)calloc(1,sizeof(XXDR)); + if(xdrs != NULL) { + xdrs->data = (void*)file; + xdrs->base = base; + xdrs->pos = 0; + xdrs->valid = 0; + if(fseek(file,0L,SEEK_END)) return NULL; + xdrs->length = (off_t)ftell(file); + xdrs->length -= xdrs->base; + xdrs->getbytes = xxdr_filegetbytes; + xdrs->setpos = xxdr_filesetpos; + xdrs->getpos = xxdr_filegetpos; + xdrs->getavail = xxdr_filegetavail; + xdrs->free = xxdr_filefree; + } +xxdrtrace(xdrs,"create",base); + return xdrs; +} + +/**************************************************/ +/* memory based xdr */ + +static void +xxdr_memfree(XXDR* xdrs) +{ + if(xdrs != NULL) { + free(xdrs); + } +} + +static int +xxdr_memgetbytes(XXDR* xdrs, char* addr, off_t len) +{ + int ok = 1; + +xxdrtrace(xdrs,"getbytes",len); + if(len < 0) len = 0; + if(xdrs->pos+len > xdrs->length) {ok=0; goto done;} + if(len > 0) { + memcpy(addr,(char*)xdrs->data+xdrs->base+xdrs->pos, len); + } + xdrs->pos += len; +done: + return ok; +} + +static off_t +xxdr_memgetpos(XXDR* xdrs) +{ +xxdrtrace(xdrs,"getpos",0); + return xdrs->pos; +} + +static off_t +xxdr_memgetavail(XXDR* xdrs) +{ +xxdrtrace(xdrs,"getavail",0); + return (xdrs->length - xdrs->pos); +} + + +static int +xxdr_memsetpos(XXDR* xdrs, off_t pos) +{ + int ok = 1; +xxdrtrace(xdrs,"setpos",pos); + if(pos == xdrs->pos) goto done; + if(pos > xdrs->length) {ok=0; goto done;} + xdrs->pos = pos; +done: + return ok; +} + +/* +Modified to track the current position to avoid the file io +operation. Not sure if this worth the effort because I +don't actually know the cost to doing an fseek +*/ + +/* + * Initialize a stdio xdr stream. + * Sets the xdr stream handle xdrs for use on the + * given memory starting at base offset. + */ +XXDR* +xxdr_memcreate(char* mem, off_t memsize, off_t base) +{ + XXDR* xdrs = (XXDR*)calloc(1,sizeof(XXDR)); + if(xdrs != NULL) { + /* zero base memory */ + xdrs->data = (void*)(mem + base); + xdrs->base = 0; + xdrs->length = memsize - base; + xdrs->pos = 0; + xdrs->getbytes = xxdr_memgetbytes; + xdrs->setpos = xxdr_memsetpos; + xdrs->getpos = xxdr_memgetpos; + xdrs->getavail = xxdr_memgetavail; + xdrs->free = xxdr_memfree; + } +xxdrtrace(xdrs,"create",base); + return xdrs; +} + +/* Float utility types */ + +/* get a float from underlying stream*/ +int +xxdr_float(XXDR* xdr, float* fp) +{ + int status = 0; + float f; + unsigned int* data = (unsigned int*)&f; + /* Pull one unit directly into a float */ + status = xxdr_uint(xdr,data); + if(status && fp) + *fp = f; + return status; +} + +/* Get a double from underlying stream */ +int +xxdr_double(XXDR* xdr, double* dp) +{ + int status = 0; + char data[2*XDRUNIT]; + /* Pull two units */ + status = xxdr_opaque(xdr,data,2*XDRUNIT); + if(status && dp) { + xxdrntohdouble(data,dp); + } + return status; +} + +/* Double needs special handling */ +void +xxdrntohdouble(char* c8, double* dp) +{ + unsigned int ii[2]; + memcpy(ii,c8,2*XDRUNIT); + if(!xxdr_big_endian) { + unsigned int tmp; + /* reverse byte order */ + swapinline32(&ii[0]); + swapinline32(&ii[1]); + /* interchange ii[0] and ii[1] */ + tmp = ii[0]; + ii[0] = ii[1]; + ii[1] = tmp; + } + if(dp) *dp = *(double*)ii; +} + +void +xxdr_init() +{ + /* Compute if we are same as network order v-a-v xdr */ + int testint = 0x00000001; + char *byte = (char *)&testint; + xxdr_big_endian = (byte[0] == 0 ? 1 : 0); + xxdr_network_order = xxdr_big_endian; +} diff --git a/extern/src_netcdf4/xxdr.h b/extern/src_netcdf4/xxdr.h new file mode 100644 index 0000000..d669c6e --- /dev/null +++ b/extern/src_netcdf4/xxdr.h @@ -0,0 +1,183 @@ +/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc. + See the COPYRIGHT file for more information. +*/ + +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * from: @(#)xdr.h 1.19 87/04/22 SMI + * from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC + * $FreeBSD: src/include/rpc/xdr.h,v 1.23 2003/03/07 13:19:40 nectar Exp $ + * $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $ + */ + +/* Define our own implementation of the needed + elements of XDR. Assumes read-only +*/ + +#ifndef XXDR_H +#define XXDR_H + +/* + * This is the number of bytes per unit of external data. + */ +#define XDRUNIT (4) + +#if 1 +/* faster version when XDRUNIT is a power of two */ +# define RNDUP(x) (((x) + XDRUNIT - 1) & ~(XDRUNIT - 1)) +#else /* old version */ +#define RNDUP(x) ((((x) + XDRUNIT - 1) / XDRUNIT) \ + * XDRUNIT) +#endif + +/* signature: void swapinline32(unsigned int* ip) */ +#define swapinline32(ip) \ +{ \ + char dst[4]; \ + char* src = (char*)(ip); \ + dst[0] = src[3]; \ + dst[1] = src[2]; \ + dst[2] = src[1]; \ + dst[3] = src[0]; \ + *(ip) = *((unsigned int*)dst); \ +} + +/* signature: void swapinline64(unsigned long long* ip) */ +#define swapinline64(ip) \ +{ \ + char dst[8]; \ + char* src = (char*)(ip); \ + dst[0] = src[7]; \ + dst[1] = src[6]; \ + dst[2] = src[5]; \ + dst[3] = src[4]; \ + dst[4] = src[3]; \ + dst[5] = src[2]; \ + dst[6] = src[1]; \ + dst[7] = src[0]; \ + *ip = *((unsigned long long*)dst); \ +} + + +#ifdef OCIGNORE +/* Warning dst and src should not be the same memory (assert &iswap != &i) */ +#define xxdrntoh(dst,src) if(xxdr_network_order){dst=src;}else{swapinline32(dst,src);} +#define xxdrntohll(dst,src) if(xxdr_network_order){dst=src;}else{swapinline64(dst,src);} +#define xxdrhton(dst,src) xxdrntoh(dst,src) +#define xxdrhtonll(dst,src) xxdrntohll(dst,src) +#endif + +/* Double needs special handling */ +extern void xxdrntohdouble(char*,double*); + +/* + * The XDR handle. + * Contains operation which is being applied to the stream, + * an operations vector for the particular implementation (e.g. see xdr_mem.c), + * and two private fields for the use of the particular implementation. + */ +typedef struct XXDR XXDR; /* forward */ + +/* Assume |off_t| == |void*| */ +struct XXDR { + char* data; + off_t pos; /* relative to data; + may be a cache of underlying stream pos */ + int valid; /* 1=>underlying stream pos == pos */ + off_t base; /* beginning of data in case bod != 0*/ + off_t length; /* total size of available data (relative to base)*/ + /* Define minimum needed case specific operators */ + int (*getbytes)(XXDR*,char*,off_t); + int (*setpos)(XXDR*,off_t); + off_t (*getpos)(XXDR*); + off_t (*getavail)(XXDR*); + void (*free)(XXDR*); /* xdr kind specific free function */ +}; + +/* Track network order */ +extern int xxdr_network_order; /* does this machine match network order? */ + +/* Read-only operations */ + +/* Get exactly count bytes from underlying + stream; unlike opaque, this will + not round up to the XDRUNIT boundary +*/ +extern int xxdr_getbytes(XXDR*,char*,off_t); + +/* get an int from underlying stream*/ +extern int xxdr_uint(XXDR* , unsigned int*); + +/* get an int from underlying stream*/ +extern int xxdr_ulonglong(XXDR* , unsigned long*); + +/* get a float from underlying stream*/ +extern int xxdr_float(XXDR* , float*); + +/* get a double from underlying stream*/ +extern int xxdr_double(XXDR* , double*); + +/* get some bytes from underlying stream; + Warning: will read upto the next XDRUNIT boundary +*/ +extern int xxdr_opaque(XXDR*, char*, off_t); + +/* get counted string from underlying stream*/ +extern int xxdr_string(XXDR*, char**, off_t*); + +/* returns bytes off from beginning*/ +extern off_t xxdr_getpos(XXDR*); + +/* reposition the stream*/ +extern int xxdr_setpos(XXDR*, off_t); + +/* get remaining data available starting at current position */ +extern off_t xxdr_getavail(XXDR*); + +/* free up XXDR structure */ +void xxdr_free(XXDR*); + +/* File and memory creators */ +extern XXDR* xxdr_filecreate(FILE* file, off_t bod); +extern XXDR* xxdr_memcreate(char* mem, off_t memsize, off_t bod); + +/* Misc */ +extern int xxdr_skip(XXDR* xdrs, off_t len); /* WARNING: will skip exactly len bytes; + any rounding must be done by caller */ + +extern int xxdr_skip_strings(XXDR* xdrs, off_t n); + +extern unsigned int xxdr_roundup(off_t n); /* procedural version of RNDUP macro */ + +extern void xxdr_init(); + +/* Define some inlines */ +#define xxdr_length(xdrs) ((xdrs)->length) + +#endif /*XXDR_H*/ + diff --git a/header_licence b/header_licence new file mode 100644 index 0000000..0ef6d76 --- /dev/null +++ b/header_licence @@ -0,0 +1,10 @@ +Software name : XIOS (Xml I/O Server) + http://forge.ipsl.jussieu.fr/ioserver +Creation date : January 2009 +Licence : CeCCIL version2 + see license file in root directory : Licence_CeCILL_V2-en.txt + or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html +Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement) + CNRS/IPSL (Institut Pierre Simon Laplace) +Project Manager : Yann Meurdesoif + yann.meurdesoif@cea.fr diff --git a/inputs/COMPLETE/context_atmosphere.xml b/inputs/COMPLETE/context_atmosphere.xml new file mode 100644 index 0000000..a42eb86 --- /dev/null +++ b/inputs/COMPLETE/context_atmosphere.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputs/COMPLETE/context_surface.xml b/inputs/COMPLETE/context_surface.xml new file mode 100644 index 0000000..1f34086 --- /dev/null +++ b/inputs/COMPLETE/context_surface.xml @@ -0,0 +1,56 @@ + + + + + + + field_A_srf + 273.15 + + field_A_srf + field_C_srf + + + + + + + surf_att + 10 + 6.8 + 100.201 + + + + + + @field_A_srf_max + file_6h + + + + + surf_att + 10 + 6.8 + 100.201 + + + + + + @field_A_srf_max + file_1d + false + + + + + + + + + + + + + + diff --git a/inputs/COMPLETE/iodef.xml b/inputs/COMPLETE/iodef.xml new file mode 100644 index 0000000..78dfc3f --- /dev/null +++ b/inputs/COMPLETE/iodef.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + buffer_size = 80000000 + buffer_server_factor_size = 2 + + + + 100 + true + + + + + diff --git a/inputs/iodef.xml b/inputs/iodef.xml new file mode 100644 index 0000000..dbbefa1 --- /dev/null +++ b/inputs/iodef.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + buffer_size = 80000000 + buffer_server_factor_size = 2 + + + + false + 50 + + + + + + diff --git a/make_xios b/make_xios new file mode 100755 index 0000000..17a5ec2 --- /dev/null +++ b/make_xios @@ -0,0 +1,202 @@ +#!/bin/bash + +install_dir=$PWD +compil_full="false" +use_oasis="false" +oasis="oasis3_mct" +use_memtrack="false" +job="1" +netcdf_lib="netcdf4_par" +compil_mode="prod" + +# Traitement de la ligne de commande +while (($# > 0)) + do + case $1 in + "-h"|"--help"|"-help") + echo "make_xios - installs XIOS on your architecture" + echo "make_xios [options]" + echo "options :" + echo " [--prod] : compilation in production mode (default)" + echo " [--dev] : compilation in development mode" + echo " [--debug] : compilation in debug mode" + echo " --arch arch : to choose target architecture" + echo " [--avail] : to know available target architectures " + echo " [--full] : to generate dependencies and recompile from scratch" + echo " [--use_oasis 'oasis3' 'oasis3_mct' : default oasis3_mct] : to use Oasis coupler" + echo " [--doc] : to generate Doxygen documentation (not available yet)" + echo " [--job ntasks] : to use parallel compilation with ntasks" + echo " [--netcdf_lib 'netcdf4_par'/'netcdf4_seq'/'netcdf4_internal' : default netcdf4_par] : choice of netcdf library" + echo " [--memtrack] : tracking memory leak - developper only" + echo "Example : ./make_xios --prod --arch PW6_VARGAS" + echo "Example : ./make_xios --avail" + exit;; + "--prod") compil_mode="prod" ; shift ;; + "--dev") compil_mode="dev" ; shift ;; + "--debug") compil_mode="debug" ; shift ;; + "--arch") arch=$2 ; shift ; shift ;; + "--avail") ls arch/*.fcm | cut -d"-" -f2 | cut -d"." -f1 ; exit ;; + "--full") compil_full="true" ; shift ;; + "--use_oasis") use_oasis="true" oasis=$2 ; shift ; shift ;; + "--doc") doc="true" ; shift ;; + "--job") job=$2 ; shift ; shift ;; + "--netcdf_lib") netcdf_lib=$2 ; shift ; shift ;; + "--memtrack") use_memtrack="true" ; shift ;; + *) code="$1" ; shift ;; + esac + done + +# Installation des sources +nb_files_gz=`ls $install_dir/tools/archive | grep tar.gz | wc -l` +if [ ${nb_files_gz} -ne 0 ] +then + echo -e "- uncompress archives ..." + for tarname in `ls $install_dir/tools/archive/*.tar.gz` ; do + gunzip -f "$tarname" + tar -xf ${tarname%.gz} + done +fi + +# Vérification de la présence d'un identifiant d'architecture. + +############################################################### +# lecture des chemins propres a l'architecture de la machine # +# et configuration de l'environnement # +############################################################### + +rm -f .void_file +echo > .void_file +rm -rf .void_dir +mkdir .void_dir + +if [[ !(-z $arch) ]] + then + rm -f $install_dir/arch.path + rm -f $install_dir/arch.fcm + rm -f $install_dir/arch.env + ln -s $install_dir/arch/arch-${arch}.path $install_dir/arch.path + ln -s $install_dir/arch/arch-${arch}.fcm $install_dir/arch.fcm + + if test -f $install_dir/arch/arch-${arch}.env + then + ln -s $install_dir/arch/arch-${arch}.env arch.env + else + ln -s $install_dir/.void_file arch.env + fi + + source $install_dir/arch.env + source $install_dir/arch.path + else + echo "Please choose a target achitecture --> list all available architecture using make_xios --avail!" + exit 1 +fi + +# Vérification de la présence d'un mode de compilation. + +if [[ "$compil_mode" == "prod" ]] + then + COMPIL_CFLAGS="%PROD_CFLAGS" + COMPIL_FFLAGS="%PROD_FFLAGS" +elif [[ "$compil_mode" == "dev" ]] + then + COMPIL_CFLAGS="%DEV_CFLAGS" + COMPIL_FFLAGS="%DEV_FFLAGS" +elif [[ "$compil_mode" == "debug" ]] + then + COMPIL_CFLAGS="%DEBUG_CFLAGS" + COMPIL_FFLAGS="%DEBUG_FFLAGS" +fi + +rm -r $PWD/extern/netcdf4 + +if [[ "$netcdf_lib" == "netcdf4_par" ]] + then + ln -s $PWD/.void_dir $PWD/extern/netcdf4 + XMLIO_CPPKEY="$XMLIO_CPPKEY USING_NETCDF_PAR" +elif [[ "$netcdf_lib" == "netcdf4_seq" ]] + then + ln -s $PWD/.void_dir $PWD/extern/netcdf4 +elif [[ "$netcdf_lib" == "netcdf4_internal" ]] + then + ln -s $PWD/extern/src_netcdf4 $PWD/extern/netcdf4 + XMLIO_CPPKEY="$XMLIO_CPPKEY USING_NETCDF_PAR USING_NETCDF_INTERNAL" + export NETCDF_INCDIR="-I${PWD}/extern/netcdf4" + export NETCDF_LIBDIR="" + export NETCDF_LIB="" +else + echo "Bad choice for --netcdf_lib argument : choose between 'netcdf4_par','netcdf4_seq' or 'netcdf4_internal'" + exit +fi + +if [[ "$use_oasis" == "true" ]] + then + if [[ "$oasis" == "oasis3_mct" ]] + then + XMLIO_CPPKEY="$XMLIO_CPPKEY USE_OMCT" + elif [[ "$oasis" == "oasis3" ]] + then + XMLIO_CPPKEY="$XMLIO_CPPKEY USE_OASIS" + OASIS_INCDIR="-I$PWD/../../prism/X64/build/lib/psmile.MPI1" + OASIS_LIBDIR="-L$PWD/../../prism/X64/lib" + OASIS_LIB="-lpsmile.MPI1 -lmpp_io" + else + echo "Bad choice for --use_oasis argument : choose between 'oasis3','oasis3_mct'" + exit + fi + NETCDF_LIB="-lnetcdff -lnetcdf" + XMLIO_FINCDIR="$OASIS_INCDIR $XMLIO_FINCDIR" + XMLIO_LIB="$OASIS_LIBDIR $OASIS_LIB $XMLIO_LIB" +fi + +if [[ "$use_memtrack" == "true" ]] + then + XMLIO_LIB="$ADDR2LINE_LIBDIR $ADDR2LINE_LIB $XMLIO_LIB" + XMLIO_CPPKEY="$XMLIO_CPPKEY XIOS_MEMTRACK" +fi + +XMLIO_CINCDIR="$NETCDF_INCDIR $HDF5_INCDIR $MPI_INCDIR" +XMLIO_FINCDIR="$XMLIO_FINCDIR $MPI_INCDIR" + +XMLIO_LIB="$XMLIO_LIB $NETCDF_LIBDIR $HDF5_LIBDIR $MPI_LIBDIR $NETCDF_LIB $HDF5_LIB $MPI_LIB" + +rm -f config.fcm +echo "%COMPIL_CFLAGS $COMPIL_CFLAGS" >> config.fcm +echo "%COMPIL_FFLAGS $COMPIL_FFLAGS" >> config.fcm +echo "%CPP_KEY $XMLIO_CPPKEY" >> config.fcm + +echo "%CBASE_INC $XMLIO_CINCDIR" >> config.fcm +echo "%FBASE_INC $XMLIO_FINCDIR" >> config.fcm +echo "%ARCH_LD $XMLIO_LIB" >> config.fcm + +echo "=> Using "$compil_mode" mode for compiling under architecture \""$arch"\" !" + +# Création de la documentation doxygen. +if [[ !(-z $doc) ]] + then + echo -e "- Create Doxygen documentation (disabled)..." + #doxygen -s +fi + +make_dir=$PWD + +export PATH=$PWD/tools/FCM/bin:$PATH + +#$make_dir/tools/preprocess_cpp $make_dir/src/xmlio/iface/interface.cpp $make_dir/src/xmlio/iface/interface.cpp.in +#$make_dir/tools/preprocess_f03 $make_dir/src/xmlio/fortran/ixmlioserver.f90 $make_dir/src/xmlio/fortran/ixmlioserver.f03.in + +if [[ "$compil_full" == "true" ]] + then + fcm build --clean --ignore-lock + fcm build -f --ignore-lock -j $job +else + fcm build --ignore-lock -j $job +fi + + +if [[ $? == 0 ]] + then + set nothing +# cd $WORKDIR/XMLIO_NEMO_COUPLE/modeles/NEMO/WORK +# cd $WORKDIR/XMLIO_NEMO/modeles/NEMO/WORK +# make +fi diff --git a/src/array.hpp b/src/array.hpp new file mode 100644 index 0000000..03351d0 --- /dev/null +++ b/src/array.hpp @@ -0,0 +1,93 @@ +#ifndef __XMLIO_CArray__ +#define __XMLIO_CArray__ + +/// boost headers /// +#include +#include +#include + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" + + +namespace xios +{ + template + inline detail::multi_array::extent_gen getExtentNull(void) { return getExtentNull()[0];} + + template<> + inline detail::multi_array::extent_gen<1> getExtentNull<1>(void) { return extents[0]; } + + /// ////////////////////// Déclarations ////////////////////// /// + + template > + class CArray : public boost::multi_array + { + /// Définition de type /// + typedef boost::multi_array SuperClass; + + public: + + typedef ValueType ValType; + + /// Constructeurs /// +// template +// explicit CArray(const ExtentList & sizes); + template CArray(const ExtentList & sizes) + : boost::multi_array + (sizes, boost::fortran_storage_order()) + { /* Ne rien faire de plus */ } + + + explicit CArray(); + +// template +// CArray(const ExtentList & sizes, const boost::general_storage_order & store); + template CArray(const ExtentList & sizes, const boost::general_storage_order & store) + : boost::multi_array (sizes, store) + { /* Ne rien faire de plus */ } + + CArray(const CArray & array); // NEVER IMPLEMENTED. + CArray(const CArray * const array); // NEVER IMPLEMENTED. + + public: + + /// Flux /// + template + friend StdOStream & operator << + (StdOStream & os, const CArray & array); + + template + friend StdIStream & operator >> + (StdIStream & is, CArray & array); + + public: + + void toBinary (StdOStream & os) const; + void fromBinary(StdIStream & is); + + size_t getSize(void) const ; + bool toBuffer (CBufferOut& buffer) const; + bool fromBuffer(CBufferIn& buffer); + + + /// Destructeur /// + virtual ~CArray(void); + + }; // class CArray + + ///--------------------------------------------------------------- + +} // namespace xios + +//#include "array_impl.hpp" +#include "array_mac.hpp" +namespace xios +{ + template void FromBinary(StdIStream & is, ARRAY(ValueType, 1) & array) ; + template void FromBinary(StdIStream & is, ARRAY(ValueType, 2) & array) ; + template void FromBinary(StdIStream & is, ARRAY(ValueType, 3) & array) ; +} +#endif // __XMLIO_CArray__ diff --git a/src/array_mac.hpp b/src/array_mac.hpp new file mode 100644 index 0000000..9aff175 --- /dev/null +++ b/src/array_mac.hpp @@ -0,0 +1,26 @@ +#ifndef __XMLIO_CArray_mac__ +#define __XMLIO_CArray_mac__ + +/// ////////////////////// Macros ////////////////////// /// + +// Type Fortran +#define ARRAY(valuetype, numdims) boost::shared_ptr > + +#define ARRAY_ASSIGN(value, valuetype, numdims, extent)\ + value.reset(new CArray(boost::extents extent)) + +#define ARRAY_CREATE(value, valuetype, numdims, extent)\ + ARRAY(valuetype, numdims) value = \ + ARRAY(valuetype, numdims)(new CArray(boost::extents extent)) + +// Type C +#define ARRAY_C_ASSIGN(value, valuetype, numdims, extent)\ + value = ARRAY(valuetype, numdims) \ + (new CArray(boost::extents extent, c_storage_order())) + +#define ARRAY_C_CREATE(value, valuetype, numdims, extent)\ + ARRAY_C_ASSIGN(ARRAY(valuetype, numdims) value, valuetype, numdims, extent) + +///--------------------------------------------------------------- + +#endif // __XMLIO_CArray_mac__ diff --git a/src/array_new.hpp b/src/array_new.hpp new file mode 100644 index 0000000..2f45425 --- /dev/null +++ b/src/array_new.hpp @@ -0,0 +1,225 @@ +#ifndef __XIOS_ARRAY_HPP__ +#define __XIOS_ARRAY_HPP__ + +#define BZ_COLUMN_MAJOR_ARRAY +#include +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "message.hpp" +#include + +using namespace blitz ; +BZ_DECLARE_FUNCTION(round) +namespace xios +{ + +template +class CArray : public Array, public virtual CBaseType +{ + public : + using Array::operator = ; + typedef typename Array::T_default_storage T_default_storage; + + template explicit CArray(_bz_ArrayExpr expr) : Array(expr) {} + + CArray(GeneralArrayStorage storage=T_default_storage()) : Array(storage) {} + + explicit CArray(int length0,GeneralArrayStorage storage=T_default_storage() ) : Array(length0,storage ) {} + + CArray(int length0, int length1, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, storage ) {} + + CArray(int length0, int length1, int length2, GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, storage ) {} + + CArray(int length0, int length1, int length2, int length3, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0, length1, length2, length3, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0,length1, length2, length3, length4, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, int length5, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0, length1, length2, length3, length4, length5, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0, length1, length2, length3, length4, length5, length6, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7, + GeneralArrayStorage storage=T_default_storage() ) : Array(length0, length1, length2, length3, length4, length5, length6, length7, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, + int length7, int length8, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0, length1, length2, length3, length4, length5, length6, length7, length8, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, + int length5, int length6, int length7, int length8, int length9, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, storage ) {} + + CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, + int length7, int length8, int length9, int length10, GeneralArrayStorage storage=T_default_storage() ) + : Array(length0, length1, length2, length3, length4, length5, length6, length7, length8, + length9, length10, storage ) {} + + + CArray(T_numtype* restrict dataFirst, TinyVector shape, GeneralArrayStorage storage=T_default_storage() ) + : Array(dataFirst, shape, storage ) {} + + CArray(T_numtype* restrict dataFirst, TinyVector shape, TinyVector stride, + GeneralArrayStorage storage=T_default_storage()) : Array(dataFirst, shape, stride, storage ) {} + + CArray(T_numtype* restrict dataFirst, TinyVector shape, preexistingMemoryPolicy deletionPolicy, + GeneralArrayStorage storage=T_default_storage()) : Array(dataFirst, shape, deletionPolicy, storage) {} + + CArray(T_numtype* restrict dataFirst, TinyVector shape, TinyVector stride, + preexistingMemoryPolicy deletionPolicy, GeneralArrayStorage storage=T_default_storage()) + : Array(dataFirst, shape, stride, deletionPolicy, storage) {} + + CArray(const TinyVector& extent, GeneralArrayStorage storage=T_default_storage()) + : Array(extent, storage) {} + + CArray(const TinyVector& lbounds, const TinyVector& extent, + const GeneralArrayStorage& storage ) : Array(lbounds, extent, storage ) {} + + CArray(Range r0, GeneralArrayStorage storage=T_default_storage() ) : CArray(r0, storage ) {} + + CArray(Range r0, Range r1, GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, storage ) {} + + CArray(Range r0, Range r1, Range r2, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, r3, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, r3, r4, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, r3, r4, r5, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, + GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, + GeneralArrayStorage storage=T_default_storage() ) : Array(r0, r1, r2, r3, r4, r5, r6, r7, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, + Range r6, Range r7, Range r8, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, r3, r4, r5, r6, r7, r8, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, + Range r6, Range r7, Range r8, Range r9, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, storage ) {} + + CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7, + Range r8, Range r9, Range r10, GeneralArrayStorage storage=T_default_storage() ) + : Array(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, storage ) {} + + CArray(const Array& array) : Array(array) {} + + CArray(const TinyVector& shape, int lastExtent, const GeneralArrayStorage& storage) + : Array(shape, lastExtent, storage) {} + + CArray(Array& array, Range r0) : Array(array, r0) {} + + CArray(Array& array, Range r0, Range r1) : Array(array, r0, r1) {} + + CArray(Array& array, Range r0, Range r1, Range r2) : Array( array, r0, r1, r2) {} + + CArray(Array& array, Range r0, Range r1, Range r2, Range r3) : Array(array, r0, r1, r2, r3) {} + + CArray(Array& array, Range r0, Range r1, Range r2, + Range r3, Range r4) : Array(array, r0, r1, r2, r3, r4) {} + + CArray(Array& array, Range r0, Range r1, Range r2, + Range r3, Range r4, Range r5) : Array( array, r0, r1, r2, r3, r4, r5) {} + + CArray(Array& array, Range r0, Range r1, Range r2, Range r3, + Range r4, Range r5, Range r6) : Array( array, r0, r1, r2, r3, r4, r5, r6) {} + + CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, + Range r5, Range r6, Range r7) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7) {} + + CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, + Range r6, Range r7, Range r8) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7, r8) {} + + CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, + Range r6, Range r7, Range r8, Range r9) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) {} + + CArray(Array& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, + Range r7, Range r8, Range r9, Range r10) : Array(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {} + + CArray(Array& array, const RectDomain& subdomain) : Array(array, subdomain) {} + + CArray(Array& array, const StridedDomain& subdomain) : Array(array, subdomain) {} + + template + CArray(Array& array, R0 r0, R1 r1, R2 r2, R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10) + : Array(array, r0,r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {} + + virtual ~CArray() {} + virtual void fromString(const string& str) { istringstream iss(str) ; iss>>*this ; } + virtual string toString(void) const { ostringstream oss ; oss<<*this ; return oss.str() ; } + virtual void reset(void) { this->free(); } + virtual bool isEmpty(void) const { if (this->numElements()==0) return true; else return false; } + virtual size_t size(void) const { return (this->dimensions()+1)*sizeof(int)+sizeof(size_t) + this->numElements()*sizeof(T_numtype) ;} + + virtual CBaseType* clone(void) const { return new CArray(*this); } + + virtual bool toBuffer(CBufferOut& buffer) const + { + bool ret ; + ret=buffer.put(this->dimensions()) ; + ret&=buffer.put(this->shape().data(),this->dimensions()) ; + ret&=buffer.put(this->numElements()) ; + ret&=buffer.put(this->dataFirst(),this->numElements()) ; + return ret ; + } + + + virtual bool fromBuffer(CBufferIn& buffer) + { + + bool ret ; + int numDim ; + TinyVector vect; + size_t ne; + + ret=buffer.get(numDim) ; + ret&=buffer.get(vect.data(),N_rank) ; + this->resize(vect) ; + ret&=buffer.get(ne) ; + ret&=buffer.get(this->dataFirst(),ne) ; + return ret ; + } + +} ; + + template inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array) + { + if (!array.toBuffer(buffer)) ERROR(" template inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array)", + << "Buffer remain size is to low for size type") ; + return buffer ; + } + + template inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array) + { + if (!array.fromBuffer(buffer)) ERROR("template inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array)", + <<"Buffer remain size is to low for size type"); + return buffer ; + } + + template inline CMessage& operator<<(CMessage& msg, const CArray& array) + { + msg.push(array) ; + return msg ; + } + + template inline CMessage& operator<<(CMessage& msg, CArray& array) + { + msg.push(array) ; + return msg ; + } + + +} + +#endif diff --git a/src/attribute.cpp b/src/attribute.cpp new file mode 100644 index 0000000..f6e07c3 --- /dev/null +++ b/src/attribute.cpp @@ -0,0 +1,111 @@ +#include "attribute.hpp" +#include "base_type.hpp" +#include "generate_interface.hpp" + + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CAttribute::CAttribute(const StdString & id) + : CObject(id), CBaseType() +// , value() + { /* Ne rien faire de plus */ } +/* + CAttribute::CAttribute(const CAttribute & attribut) + : CObject(attribut.getId()),CBaseType() + { + // this->value = attribut.getAnyValue(); + } +*/ + CAttribute::~CAttribute(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- +/* + const boost::any & CAttribute::getAnyValue(void) const + { + return (this->value); + } + + + void CAttribute::setAnyValue(const boost::any & value) + { + this->value = value; + } + + void CAttribute::clear(void) + { + this->value = boost::any(); + } + + //--------------------------------------------------------------- + + bool CAttribute::isEmpty(void) const + { + return (this->value.empty()); + } +*/ + const StdString & CAttribute::getName(void) const + { + return (this->getId()); + } + + void CAttribute::generateCInterfaceIsDefined(ostream& oss, const string& className) + { + CInterface::AttributeIsDefinedCInterface(oss, className, this->getName()) ; + } + + void CAttribute::generateFortran2003InterfaceIsDefined(ostream& oss, const string& className) + { + CInterface::AttributeIsDefinedFortran2003Interface(oss, className, this->getName()) ; + } + + + void CAttribute::generateFortranInterfaceIsDefinedDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceIsDefinedDeclaration(oss, className, this->getName()+"_") ; + } + + void CAttribute::generateFortranInterfaceIsDefinedDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceIsDefinedDeclaration(oss, className, this->getName()) ; + } + + void CAttribute::generateFortranInterfaceIsDefinedBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceIsDefinedBody(oss, className, this->getName()) ; + } + + ///-------------------------------------------------------------- + + + CMessage& operator<<(CMessage& msg,CAttribute& type) + { + msg.push(type) ; + return msg ; + } + + CMessage& operator<<(CMessage& msg, const CAttribute& type) + { +// msg.push(*type.clone()) ; + return msg ; + } + + CBufferOut& operator<<(CBufferOut& buffer, CAttribute& type) + { + + if (!type.toBuffer(buffer)) ERROR("CBufferOut& operator<<(CBufferOut& buffer, CAttribute& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + CBufferIn& operator>>(CBufferIn& buffer, CAttribute& type) + { + + if (!type.fromBuffer(buffer)) ERROR("CBufferInt& operator>>(CBufferIn& buffer, CAttribute& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + +} // namespace xios diff --git a/src/attribute.hpp b/src/attribute.hpp new file mode 100644 index 0000000..ef7d92b --- /dev/null +++ b/src/attribute.hpp @@ -0,0 +1,118 @@ +#ifndef __XMLIO_CAttribute__ +#define __XMLIO_CAttribute__ + +/// boost headers /// +#include + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "object.hpp" +#include "base_type.hpp" +#include "message.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CAttribute : public CObject, public virtual CBaseType + { + typedef CObject SuperClass; + + public : + + /// Constructeurs /// + explicit CAttribute(const StdString & id); +// CAttribute(const CAttribute & attribut); +// CAttribute(const CAttribute * const attribut); // Not implemented. + + /// Accesseurs /// + const StdString & getName(void) const; +// const boost::any & getAnyValue(void) const; +// template inline T getValue(void) const; +// template inline T* getRef(void); + +// /// Mutateurs /// +// template inline void setValue(const T & value); +// void setAnyValue(const boost::any & value); +// void clear(void); + + /// Test /// +// bool isEmpty(void) const; +// template inline bool isType(void) const; + virtual void set(const CAttribute& ) =0 ; + virtual void reset(void ) =0 ; + /// Destructeur /// + virtual ~CAttribute(void); + + /// Autres /// + virtual StdString toString(void) const = 0; + virtual void fromString(const StdString & str) = 0; + +// virtual void toBinary (StdOStream & os) const = 0; +// virtual void fromBinary(StdIStream & is) = 0; + + virtual void generateCInterface(ostream& oss, const string& className) = 0 ; + virtual void generateCInterfaceIsDefined(ostream& oss, const string& className) ; + virtual void generateFortran2003Interface(ostream& oss, const string& className) = 0 ; + virtual void generateFortran2003InterfaceIsDefined(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceDeclaration_(ostream& oss,const string& className) = 0 ; + virtual void generateFortranInterfaceDeclaration(ostream& oss,const string& className) = 0 ; + virtual void generateFortranInterfaceBody_(ostream& oss,const string& className) = 0 ; + virtual void generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) = 0 ; + virtual void generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) = 0 ; + virtual void generateFortranInterfaceGetBody_(ostream& oss,const string& className) = 0 ; + virtual void generateFortranInterfaceIsDefinedDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceIsDefinedDeclaration(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceIsDefinedBody_(ostream& oss,const string& className) ; + + virtual void setInheritedValue(const CAttribute& ) = 0 ; + virtual bool hasInheritedValue(void) const = 0; + + protected : + + /// Constructeurs /// +// CAttribute(void); // Not implemented. + + /// Propriété /// +// boost::any value; + + }; // class CAttribute + + /// ////////////////////// Définitions ////////////////////// /// +/* + template + T CAttribute::getValue(void) const + { + return (boost::any_cast(this->value)); + } + + template + T* CAttribute::getRef(void) + { + return (boost::any_cast(&value)); + } + + template + void CAttribute::setValue(const T & value) + { + this->value = value; + } + + template + bool CAttribute::isType(void) const + { + return (this->value.type() == typeid(T)); + } +*/ + + CMessage& operator<<(CMessage& msg,CAttribute& type) ; + CMessage& operator<<(CMessage& msg, const CAttribute& type) ; + + CBufferOut& operator<<(CBufferOut& buffer,CAttribute& type) ; + CBufferIn& operator>>(CBufferIn& buffer, CAttribute& type) ; + +} + // namespace xios + +#endif // __XMLIO_CAttribute__ diff --git a/src/attribute_array.hpp b/src/attribute_array.hpp new file mode 100644 index 0000000..c91ccb2 --- /dev/null +++ b/src/attribute_array.hpp @@ -0,0 +1,77 @@ +#ifndef __XIOS_ATTRIBUTE_ARRAY__ +#define __XIOS_ATTRIBUTE_ARRAY__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "attribute.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "array_new.hpp" + + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + template + class CAttributeArray : public CAttribute, public CArray + { + public : + + using CArray::operator = ; +// using Array::operator = ; + + /// Constructeurs /// + explicit CAttributeArray(const StdString & id); + CAttributeArray(const StdString & id, xios_map & umap); + CAttributeArray(const StdString & id, const CArray& value); + CAttributeArray(const StdString & id, const CArray& value, + xios_map & umap); + + /// Accesseur /// + CArray getValue(void) const; + + /// Mutateurs /// + void setValue(const CArray& value); + void set(const CAttribute& attr) ; + void set(const CAttributeArray& attr) ; + void reset(void) ; + void setInheritedValue(const CAttributeArray& attr ); + void setInheritedValue(const CAttribute& attr ); + CArray getInheritedValue(void) const ; + bool hasInheritedValue(void) const; + + /// Destructeur /// + virtual ~CAttributeArray(void) { } + + + /// Autre /// + virtual string toString(void) const { return _toString();} + virtual void fromString(const StdString & str) { _fromString(str);} + virtual bool toBuffer (CBufferOut& buffer) const { return _toBuffer(buffer);} + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer); } + + virtual void generateCInterface(ostream& oss,const string& className) ; + virtual void generateFortran2003Interface(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceBody_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceDeclaration(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetBody_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) ; + + + protected : + + /// Constructeurs /// + + private : + CArray inheritedValue ; + StdString _toString(void) const; + void _fromString(const StdString & str); + bool _toBuffer (CBufferOut& buffer) const; + bool _fromBuffer(CBufferIn& buffer) ; + }; // class CAttributeEnum +} // namespace xios + +#endif // __XIOS_ATTRIBUTE_ARRAY__ diff --git a/src/attribute_array_decl.cpp b/src/attribute_array_decl.cpp new file mode 100644 index 0000000..d60663d --- /dev/null +++ b/src/attribute_array_decl.cpp @@ -0,0 +1,13 @@ +#include "attribute_array_impl.hpp" + + + +namespace xios +{ + template class CAttributeArray ; + template class CAttributeArray ; + template class CAttributeArray ; + template class CAttributeArray ; + template class CAttributeArray ; + template class CAttributeArray ; +} diff --git a/src/attribute_array_impl.hpp b/src/attribute_array_impl.hpp new file mode 100644 index 0000000..3950ab3 --- /dev/null +++ b/src/attribute_array_impl.hpp @@ -0,0 +1,181 @@ +#ifndef __XIOS_ATTRIBUTE_ARRAY_IMPL_HPP__ +#define __XIOS_ATTRIBUTE_ARRAY_IMPL_HPP__ + +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "generate_interface.hpp" +#include "attribute_array.hpp" + + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + template + CAttributeArray::CAttributeArray(const StdString & id) + : CAttribute(id) + { /* Ne rien faire de plus */ } + + template + CAttributeArray::CAttributeArray(const StdString & id, const CArray& value) + : CAttribute(id) + { + this->setValue(value); + } + + template + CAttributeArray::CAttributeArray(const StdString & id, xios_map & umap) + : CAttribute(id) + { + umap.insert(umap.end(), std::make_pair(id, this)); + } + + template + CAttributeArray::CAttributeArray (const StdString & id, const CArray& value, + xios_map & umap) + : CAttribute(id) + { + this->setValue(value); + umap.insert(umap.end(), std::make_pair(id, this)); + } + + ///-------------------------------------------------------------- + + template + void CAttributeArray::reset(void) + { + CArray::reset() ; + inheritedValue.reset() ; + } + + template + CArray CAttributeArray::getValue(void) const + { + return this->copy() ; + } + + template + void CAttributeArray::setValue(const CArray& value) + { + this->resize(value.shape()) ; + *this=value ; + } + + template + void CAttributeArray::set(const CAttribute& attr) + { + this->set(dynamic_cast& >(attr)) ; + } + + template + void CAttributeArray::set(const CAttributeArray& attr) + { + this->setValue(attr) ; + } + + + template + void CAttributeArray::setInheritedValue(const CAttribute& attr) + { + this->setInheritedValue(dynamic_cast& >(attr)) ; + } + + template + void CAttributeArray::setInheritedValue(const CAttributeArray& attr) + { + if (this->isEmpty() && attr.hasInheritedValue()) + { + inheritedValue.resize(attr.shape()) ; + inheritedValue=attr ; + } + } + + template + CArray CAttributeArray::getInheritedValue(void) const + { + if (this->isEmpty()) return inheritedValue.copy() ; + else return getValue() ; + } + + template + bool CAttributeArray::hasInheritedValue(void) const + { + return !this->isEmpty() || !inheritedValue.isEmpty() ; + } + + + template + StdString CAttributeArray::_toString(void) const + { + StdOStringStream oss; + if (! isEmpty() && this->hasId()) oss << this->getName() << "=\"" << CArray::toString() << "\""; + return (oss.str()); + } + + template + void CAttributeArray::_fromString(const StdString & str) + { + CArray::fromString(str) ; + } + + template + bool CAttributeArray::_toBuffer (CBufferOut& buffer) const + { + return CArray::toBuffer(buffer) ; + } + + template + bool CAttributeArray::_fromBuffer(CBufferIn& buffer) + { + return CArray::fromBuffer(buffer) ; + } + + template + void CAttributeArray::generateCInterface(ostream& oss,const string& className) + { + CInterface::AttributeCInterface >(oss, className, this->getName()) ; + } + + template + void CAttributeArray::generateFortran2003Interface(ostream& oss,const string& className) + { + CInterface::AttributeFortran2003Interface >(oss, className, this->getName()) ; + } + + template + void CAttributeArray::generateFortranInterfaceDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration >(oss, className, this->getName()+"_") ; + } + + template + void CAttributeArray::generateFortranInterfaceBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceBody >(oss, className, this->getName()) ; + } + + template + void CAttributeArray::generateFortranInterfaceDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration >(oss, className, this->getName()) ; + } + + template + void CAttributeArray::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration >(oss, className, this->getName()+"_") ; + } + + template + void CAttributeArray::generateFortranInterfaceGetBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetBody >(oss, className, this->getName()) ; + } + + template + void CAttributeArray::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration >(oss, className, this->getName()) ; + } +} // namespace xios + +#endif // __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__ diff --git a/src/attribute_enum.hpp b/src/attribute_enum.hpp new file mode 100644 index 0000000..1013ab4 --- /dev/null +++ b/src/attribute_enum.hpp @@ -0,0 +1,86 @@ +#ifndef __XIOS_ATTRIBUTE_ENUM__ +#define __XIOS_ATTRIBUTE_ENUM__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "attribute.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "type.hpp" +#include "enum.hpp" + + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + template + class CAttributeEnum : public CAttribute, public CEnum + { + typedef typename T::t_enum T_enum ; + public : + + /// Constructeurs /// + explicit CAttributeEnum(const StdString & id); + CAttributeEnum(const StdString & id, + xios_map & umap); + CAttributeEnum(const StdString & id, const T_enum & value); + CAttributeEnum(const StdString & id, const T_enum & value, + xios_map & umap); + + /// Accesseur /// + T_enum getValue(void) const; + string getStringValue(void) const; + + + /// Mutateurs /// + void setValue(const T_enum & value); + + void set(const CAttribute& attr) ; + void set(const CAttributeEnum& attr) ; + void reset(void); + + void setInheritedValue(const CAttributeEnum& attr ); + void setInheritedValue(const CAttribute& attr ); + T_enum getInheritedValue(void) const; + string getInheritedStringValue(void) const; + bool hasInheritedValue(void) const; + + /// Destructeur /// + virtual ~CAttributeEnum(void) { } + + /// Operateur /// + CAttributeEnum& operator=(const T_enum & value); + + /// Autre /// + virtual StdString toString(void) const { return _toString();} + virtual void fromString(const StdString & str) { _fromString(str);} + + virtual bool toBuffer (CBufferOut& buffer) const { return _toBuffer(buffer);} + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer); } + + virtual void generateCInterface(ostream& oss,const string& className) ; + virtual void generateFortran2003Interface(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceBody_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceDeclaration(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetBody_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) ; + + + protected : + + /// Constructeurs /// +// CAttributeTemplate(void); // Not implemented. + private : + StdString _toString(void) const; + void _fromString(const StdString & str); + bool _toBuffer (CBufferOut& buffer) const; + bool _fromBuffer(CBufferIn& buffer) ; + CEnum inheritedValue ; + }; // class CAttributeEnum + +} // namespace xios + +#endif // __XIOS_ATTRIBUTE_ENUM__ diff --git a/src/attribute_enum_impl.hpp b/src/attribute_enum_impl.hpp new file mode 100644 index 0000000..53933d1 --- /dev/null +++ b/src/attribute_enum_impl.hpp @@ -0,0 +1,205 @@ +#ifndef __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__ +#define __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__ + +#include "enum.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "generate_interface.hpp" +#include "attribute_enum.hpp" + + +namespace xios +{ + + /// ////////////////////// Définitions ////////////////////// /// + template + CAttributeEnum::CAttributeEnum(const StdString & id) + : CAttribute(id) + { /* Ne rien faire de plus */ } + + template + CAttributeEnum::CAttributeEnum(const StdString & id, const T_enum & value) + : CAttribute(id) + { + this->setValue(value); + } + + template + CAttributeEnum::CAttributeEnum(const StdString & id, + xios_map & umap) + : CAttribute(id) + { + umap.insert(umap.end(), std::make_pair(id, this)); + } + + template + CAttributeEnum::CAttributeEnum + (const StdString & id, const T_enum & value, + xios_map & umap) + : CAttribute(id) + { + this->setValue(value); + umap.insert(umap.end(), std::make_pair(id, this)); + } + + ///-------------------------------------------------------------- + template + void CAttributeEnum::reset(void) + { + CEnum::reset() ; + inheritedValue.reset() ; + } + + template + typename T::t_enum CAttributeEnum::getValue(void) const + { + return CEnum::get() ; + } + + template + string CAttributeEnum::getStringValue(void) const + { + return CEnum::toString() ; + } + + template + void CAttributeEnum::setValue(const typename T::t_enum & value) + { + CEnum::set(value) ; + } + + template + void CAttributeEnum::set(const CAttribute& attr) + { + this->set(dynamic_cast& >(attr)) ; + } + + template + void CAttributeEnum::set(const CAttributeEnum& attr) + { + CEnum::set(attr) ; + } + + + template + void CAttributeEnum::setInheritedValue(const CAttribute& attr) + { + this->setInheritedValue(dynamic_cast& >(attr)) ; + } + + template + void CAttributeEnum::setInheritedValue(const CAttributeEnum& attr) + { + if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ; + } + + template + typename T::t_enum CAttributeEnum::getInheritedValue(void) const + { + if (this->isEmpty()) return inheritedValue.get() ; + else return getValue() ; + } + + template + string CAttributeEnum::getInheritedStringValue(void) const + { + return CEnum::toString() ; + if (this->isEmpty()) return inheritedValue.toString() ; + else return CEnum::toString() ; ; + } + + template + bool CAttributeEnum::hasInheritedValue(void) const + { + return !this->isEmpty() || !inheritedValue.isEmpty() ; + } + + //--------------------------------------------------------------- + + template + CAttributeEnum& CAttributeEnum::operator=(const T_enum & value) + { + this->setValue(value); + return *this; + } + + //--------------------------------------------------------------- + + template + StdString CAttributeEnum::_toString(void) const + { + StdOStringStream oss; + if (!CEnum::isEmpty() && this->hasId()) + oss << this->getName() << "=\"" << CEnum::toString() << "\""; + return (oss.str()); + } + + template + void CAttributeEnum::_fromString(const StdString & str) + { + CEnum::fromString(str) ; + } + + template + bool CAttributeEnum::_toBuffer (CBufferOut& buffer) const + { + return CEnum::toBuffer(buffer) ; + } + + template + bool CAttributeEnum::_fromBuffer(CBufferIn& buffer) + { + return CEnum::fromBuffer(buffer) ; + } + + template + void CAttributeEnum::generateCInterface(ostream& oss,const string& className) + { + CInterface::AttributeCInterface(oss, className, this->getName()) ; + } + + template + void CAttributeEnum::generateFortran2003Interface(ostream& oss,const string& className) + { + CInterface::AttributeFortran2003Interface(oss, className, this->getName()) ; + } + + template + void CAttributeEnum::generateFortranInterfaceDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()+"_") ; + } + + template + void CAttributeEnum::generateFortranInterfaceBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceBody(oss, className, this->getName()) ; + } + + template + void CAttributeEnum::generateFortranInterfaceDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()) ; + } + + template + void CAttributeEnum::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()+"_") ; + } + + template + void CAttributeEnum::generateFortranInterfaceGetBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetBody(oss, className, this->getName()) ; + } + + template + void CAttributeEnum::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()) ; + } + +} // namespace xios + +#endif // __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__ diff --git a/src/attribute_map.cpp b/src/attribute_map.cpp new file mode 100644 index 0000000..6ea5dd7 --- /dev/null +++ b/src/attribute_map.cpp @@ -0,0 +1,707 @@ +#include "attribute_map.hpp" +#include "indent.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CAttributeMap * CAttributeMap::Current = NULL; + + CAttributeMap::CAttributeMap(void) + : xios_map() + { CAttributeMap::Current = this; } + + CAttributeMap::~CAttributeMap(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + void CAttributeMap::clearAllAttributes(void) + { + typedef std::pair StdStrAttPair; + SuperClassMap::const_iterator it = SuperClassMap::begin(), end = SuperClassMap::end(); + for (; it != end; it++) + { + const StdStrAttPair & att = *it; + att.second->reset(); + } + } + + //--------------------------------------------------------------- + + bool CAttributeMap::hasAttribute(const StdString & key) const + { + return (this->find(key) != this->end()); + } + + //--------------------------------------------------------------- + + void CAttributeMap::setAttribute(const StdString & key, CAttribute * const attr) + { + if (!this->hasAttribute(key)) + ERROR("CAttributeMap::setAttribute(key, attr)", + << "[ key = " << key << "] key not found !"); + if (attr == NULL) + ERROR("CAttributeMap::setAttribute(key, attr)", + << "[ key = " << key << "] attr is null !"); + this->find(key)->second->set(*attr) ; +// this->find(key)->second->setAnyValue(attr->getAnyValue()); + } + + //--------------------------------------------------------------- + + CAttribute * CAttributeMap::operator[](const StdString & key) + { + if (!this->hasAttribute(key)) + ERROR("CAttributeMap::operator[](const StdString & key)", + << "[ key = " << key << "] key not found !"); + return (SuperClassMap::operator[](key)); + } + + //--------------------------------------------------------------- + + StdString CAttributeMap::toString(void) const + { + typedef std::pair StdStrAttPair; + StdOStringStream oss; + + SuperClassMap::const_iterator it = SuperClassMap::begin(), end = SuperClassMap::end(); + for (; it != end; it++) + { + const StdStrAttPair & att = *it; + if (!att.second->isEmpty()) + oss << *att.second << " "; + } + return (oss.str()); + } + + //--------------------------------------------------------------- + + void CAttributeMap::fromString(const StdString & str) + { + ERROR("CAttributeMap::fromString(const StdString & str)", + << "[ str = " << str << "] Not implemented yet !"); + } + + //--------------------------------------------------------------- + + //StdOStream & operator << (StdOStream & os, const CAttributeMap & attributmap) + //{ os << attributmap.toString(); return (os); } + + //--------------------------------------------------------------- + + void CAttributeMap::setAttributes(const xml::THashAttributes & attributes) + { + for (xml::THashAttributes::const_iterator it = attributes.begin(); + it != attributes.end(); + it ++) + { + if ((*it).first.compare(StdString("id")) != 0 && + (*it).first.compare(StdString("src"))!= 0) + { + //if (CAttributeMap::operator[]((*it).first)->isEmpty()) + CAttributeMap::operator[]((*it).first)->fromString((*it).second); + } + } + } + + //--------------------------------------------------------------- + + void CAttributeMap::setAttributes(const CAttributeMap * const _parent, bool apply) + { + typedef std::pair StdStrAttPair; + + SuperClassMap::const_iterator it = _parent->begin(), end = _parent->end(); + for (; it != end; it++) + { + const StdStrAttPair & el = *it; + if (this->hasAttribute(el.first)) + { + CAttribute * currentAtt = CAttributeMap::operator[](el.first); + CAttribute * parentAtt = el.second ; + if (apply) + { + if (currentAtt->isEmpty() && !el.second->isEmpty()) + { + this->setAttribute(el.first, el.second); + } + } + else currentAtt->setInheritedValue(*parentAtt) ; + } + } + } + + //--------------------------------------------------------------- +/* + void CAttributeMap::toBinary(StdOStream & os) const + { + typedef std::pair StdStrAttPair; + SuperClassMap::const_iterator it = this->begin(), end = this->end(); + + const StdSize nbatt = SuperClassMap::size(); + os.write (reinterpret_cast(&nbatt) , sizeof(StdSize)); + + for (; it != end; it++) + { + const StdString & key = it->first; + const CAttribute* value = it->second; + const StdSize size = key.size(); + + os.write (reinterpret_cast(&size) , sizeof(StdSize)); + os.write (key.data(), size * sizeof(char)); + + if (!value->isEmpty()) + { + bool b = true; + os.write (reinterpret_cast(&b) , sizeof(bool)); + value->toBinary(os); + } + else + { + bool b = false; + os.write (reinterpret_cast(&b) , sizeof(bool)); + } + } + } + + //--------------------------------------------------------------- + + void CAttributeMap::fromBinary(StdIStream & is) + { + StdSize nbatt = 0; + is.read (reinterpret_cast(&nbatt), sizeof(StdSize)); + + for (StdSize i = 0; i < nbatt; i++) + { + bool hasValue = false; + StdSize size = 0; + is.read (reinterpret_cast(&size), sizeof(StdSize)); + StdString key(size, ' '); + is.read (const_cast(key.data()), size * sizeof(char)); + + if (!this->hasAttribute(key)) + ERROR("CAttributeMap::fromBinary(StdIStream & is)", + << "[ key = " << key << "] key not found !"); + + is.read (reinterpret_cast(&hasValue), sizeof(bool)); + + if (hasValue) + this->operator[](key)->fromBinary(is); + } + } + */ + void CAttributeMap::generateCInterface(ostream& oss, const string& className) + { + SuperClassMap::const_iterator it = SuperClassMap::begin(), end = SuperClassMap::end(); + for (; it != end; it++) + { + it->second->generateCInterface(oss,className) ; + it->second->generateCInterfaceIsDefined(oss,className) ; + oss<second->generateFortran2003Interface(oss,className) ; + it->second->generateFortran2003InterfaceIsDefined(oss,className) ; + + oss<second->getName()<<"_" ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceDeclaration_(oss,className) ; + } + + oss<second->generateFortranInterfaceBody_(oss,className) ; + oss<second->getName()<<"_" ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceGetDeclaration_(oss,className) ; + } + + oss<second->generateFortranInterfaceGetBody_(oss,className) ; + oss<second->getName()<<"_" ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceIsDefinedDeclaration_(oss,className) ; + } + + oss<second->generateFortranInterfaceIsDefinedBody_(oss,className) ; + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceDeclaration(oss,className) ; + } + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str() ; + delete oss2 ; + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceGetDeclaration(oss,className) ; + } + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str() ; + delete oss2 ; + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceIsDefinedDeclaration(oss,className) ; + } + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str() ; + delete oss2 ; + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceDeclaration(oss,className) ; + } + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str() ; + delete oss2 ; + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceGetDeclaration(oss,className) ; + } + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str() ; + delete oss2 ; + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str()<second->generateFortranInterfaceIsDefinedDeclaration(oss,className) ; + } + + oss<second->getName() ; + if (oss2->str().size()>90) + { + oss<str()<<" &"<str() ; + delete oss2 ; + + oss< + { + typedef xios_map SuperClassMap; + + public : + + /// Tests /// + inline bool hasAttribute(const StdString & key) const; + + /// Accesseurs /// + CAttribute * operator[](const StdString & key); + + /// Mutateurs /// + void setAttribute(const StdString & key, CAttribute * const attr); + + void setAttributes(const xml::THashAttributes & attributes); + void setAttributes(const CAttributeMap * const _parent, bool apply=true); + + void clearAllAttributes(void); + + /// Destructeur /// + virtual ~CAttributeMap(void); + + /// Flux /// + // Debug only // + // friend StdOStream & operator << (StdOStream & os, const CAttributeMap & attributmap); + + /// Autre /// + virtual StdString toString(void) const; + virtual void fromString(const StdString & str); + +// virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + virtual void generateCInterface(ostream& oss, const string& className) ; + virtual void generateFortran2003Interface(ostream& oss, const string& className) ; + virtual void generateFortranInterface_hdl_(ostream& oss, const string& className) ; + virtual void generateFortranInterface_hdl(ostream& oss, const string& className) ; + virtual void generateFortranInterface_id(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceGet_hdl_(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceGet_hdl(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceGet_id(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceIsDefined_hdl_(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceIsDefined_hdl(ostream& oss, const string& className) ; + virtual void generateFortranInterfaceIsDefined_id(ostream& oss, const string& className) ; + + protected : + + /// Constructeurs /// + CAttributeMap(void); + CAttributeMap(const xios_map & umap); // Never implemented. + CAttributeMap(const xios_map * const umap); // Not implemented. + + /// Propriété statique /// + static CAttributeMap * Current; + + }; // class CAttributeMap + +} // namespace xios + +#endif // __XMLIO_CAttributeMap__ diff --git a/src/attribute_template.hpp b/src/attribute_template.hpp new file mode 100644 index 0000000..5c7bc97 --- /dev/null +++ b/src/attribute_template.hpp @@ -0,0 +1,104 @@ +#ifndef __XMLIO_CAttributeTemplate__ +#define __XMLIO_CAttributeTemplate__ + +/// boost headers /// +#include + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "attribute.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "type.hpp" + + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + template + class CAttributeTemplate : public CAttribute, public CType + { + typedef CAttribute SuperClass; + + public : + + /// Typedef /// + typedef T ValueType; + + /// Constructeurs /// + explicit CAttributeTemplate(const StdString & id); + CAttributeTemplate(const StdString & id, + xios_map & umap); + CAttributeTemplate(const StdString & id, const ValueType & value); + CAttributeTemplate(const StdString & id, const ValueType & value, + xios_map & umap); +// CAttributeTemplate(const CAttribute & attribut) throw (CException); +// CAttributeTemplate(const CAttribute * const attribut); // Not implemented. + + public : + + /// Accesseur /// + ValueType getValue(void) const; +// ValueType* getRef(void) ; + + /// Mutateurs /// + void setValue(const ValueType & value); + + void set(const CAttribute& attr) ; + void set(const CAttributeTemplate& attr) ; + void reset(void) ; + + void setInheritedValue(const CAttributeTemplate& attr ); + void setInheritedValue(const CAttribute& attr ); + T getInheritedValue(void) const ; + bool hasInheritedValue(void) const; + + /// Destructeur /// + virtual ~CAttributeTemplate(void) { } + + /// Operateur /// + CAttributeTemplate& operator=(const ValueType & value); + + /// Autre /// + virtual StdString toString(void) const { return _toString();} + virtual void fromString(const StdString & str) { _fromString(str);} +// virtual CAttributeTemplate* clone() const {} +// virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + + virtual bool toBuffer (CBufferOut& buffer) const { return _toBuffer(buffer);} + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer); } +// virtual size_t size(void) const; + virtual void generateCInterface(ostream& oss,const string& className) ; + virtual void generateFortran2003Interface(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceBody_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceDeclaration(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetBody_(ostream& oss,const string& className) ; + virtual void generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) ; +// virtual void generateFortranInterfaceIsDefinedDeclaration_(ostream& oss,const string& className) ; +// virtual void generateFortranInterfaceIsDefinedBody_(ostream& oss,const string& className) ; +// virtual void generateFortranInterfaceIsDefinedDeclaration(ostream& oss,const string& className) ; + + + protected : + + /// Constructeurs /// +// CAttributeTemplate(void); // Not implemented. + private : + StdString _toString(void) const; + void _fromString(const StdString & str); + bool _toBuffer (CBufferOut& buffer) const; + bool _fromBuffer(CBufferIn& buffer) ; + + CType inheritedValue ; + }; // class CAttribute + + + template void FromBinary(StdIStream & is, T & obj); + +} // namespace xios + +#endif // __XMLIO_CAttributeTemplate__ diff --git a/src/attribute_template_decl.cpp b/src/attribute_template_decl.cpp new file mode 100644 index 0000000..e903518 --- /dev/null +++ b/src/attribute_template_decl.cpp @@ -0,0 +1,11 @@ +#include "attribute_template_impl.hpp" +#include "attribute_template_specialisation.hpp" +#include + +namespace xios +{ + template class CAttributeTemplate ; + template class CAttributeTemplate ; + template class CAttributeTemplate ; + template class CAttributeTemplate ; +} diff --git a/src/attribute_template_impl.hpp b/src/attribute_template_impl.hpp new file mode 100644 index 0000000..68b4dec --- /dev/null +++ b/src/attribute_template_impl.hpp @@ -0,0 +1,359 @@ +#ifndef __XMLIO_CAttributeTemplate_impl__ +#define __XMLIO_CAttributeTemplate_impl__ + +#include "type.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "generate_interface.hpp" +#include "attribute_template.hpp" + + +namespace xios +{ + + /// ////////////////////// Définitions ////////////////////// /// + template + CAttributeTemplate::CAttributeTemplate(const StdString & id) + : CAttribute(id) + { /* Ne rien faire de plus */ } + + template + CAttributeTemplate::CAttributeTemplate(const StdString & id, const T & value) + : CAttribute(id) + { + this->setValue(value); + } +/* + template + CAttributeTemplate::CAttributeTemplate(const CAttribute & attribut) + throw (CException) + : CAttribute(attribut) + { + if (!attribut.isEmpty() && !attribut.isType()) + ERROR("CAttributeTemplate", << "Invalid instantiation !"); + } +*/ + template + CAttributeTemplate::CAttributeTemplate(const StdString & id, + xios_map & umap) + : CAttribute(id) + { + umap.insert(umap.end(), std::make_pair(id, this)); + } + + template + CAttributeTemplate::CAttributeTemplate + (const StdString & id, const T & value, + xios_map & umap) + : CAttribute(id) + { + this->setValue(value); + umap.insert(umap.end(), std::make_pair(id, this)); + } +/* + template + CAttributeTemplate::~CAttributeTemplate(void) + { +// this->CType::reset() ; +// this->clear(); + } +*/ + ///-------------------------------------------------------------- + template + void CAttributeTemplate::reset(void) + { + CType::reset() ; + inheritedValue.reset() ; + } + + + template + T CAttributeTemplate::getValue(void) const + { + return CType::get() ; +/* + if (SuperClass::isEmpty()) + { + ERROR("T CAttributeTemplate::getValue(void) const", + << "[ id = " << this->getId() << "]" + << " L'attribut est requis mais n'est pas défini !"); + } + return (SuperClass::getValue()); +*/ + } + +/* + template + T* CAttributeTemplate::getRef(void) + { + if (SuperClass::isEmpty()) + { + ERROR("T CAttributeTemplate::getValue(void) const", + << "[ id = " << this->getId() << "]" + << " L'attribut est requis mais n'est pas défini !"); + } + return (SuperClass::getRef()); + } +*/ + + template + void CAttributeTemplate::setValue(const T & value) + { + CType::set(value) ; +// SuperClass::setValue(value); + } + + template + void CAttributeTemplate::set(const CAttribute& attr) + { + this->set(dynamic_cast& >(attr)) ; + } + + template + void CAttributeTemplate::set(const CAttributeTemplate& attr) + { + CType::set(attr) ; + } + + template + void CAttributeTemplate::setInheritedValue(const CAttribute& attr) + { + this->setInheritedValue(dynamic_cast& >(attr)) ; + } + + template + void CAttributeTemplate::setInheritedValue(const CAttributeTemplate& attr) + { + if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ; + } + + template + T CAttributeTemplate::getInheritedValue(void) const + { + if (this->isEmpty()) return inheritedValue.get() ; + else return getValue() ; + } + + template + bool CAttributeTemplate::hasInheritedValue(void) const + { + return !this->isEmpty() || !inheritedValue.isEmpty() ; + } + + //--------------------------------------------------------------- + + template + CAttributeTemplate& CAttributeTemplate::operator=(const T & value) + { + this->setValue(value); +// return (this->getValue()); + return *this; + } + + //--------------------------------------------------------------- + + template + StdString CAttributeTemplate::_toString(void) const + { + StdOStringStream oss; + if (!CType::isEmpty() && this->hasId()) + oss << this->getName() << "=\"" << CType::toString() << "\""; + return (oss.str()); + } + + template + void CAttributeTemplate::_fromString(const StdString & str) + { + CType::fromString(str) ; + } + + //--------------------------------------------------------------- +/* + template + void CAttributeTemplate::toBinary (StdOStream & os) const + { + this->getValue()->toBinary(os); + } + + template + void CAttributeTemplate::fromBinary(StdIStream & is) + { + T value; + FromBinary(is, value); + this->setValue(value); + } +*/ + template + bool CAttributeTemplate::_toBuffer (CBufferOut& buffer) const + { + return CType::toBuffer(buffer) ; +/* + if (isEmpty()) return buffer.put(true) ; + else + { + bool ret=true ; + CType val(*boost::any_cast(&value)) ; + ret&=buffer.put(false) ; + ret&=val.toBuffer(buffer) ; + return ret ; + } +*/ + } + + template + bool CAttributeTemplate::_fromBuffer(CBufferIn& buffer) + { + return CType::fromBuffer(buffer) ; +/* + bool empty ; + bool ret=true ; + ret&=buffer.get(empty) ; + if (empty) + { + clear() ; + return ret ; + } + else + { + if (isEmpty()) + { + T val ; + setValue(val) ; + } + T* V=const_cast(boost::any_cast(&value)) ; + CType val(*V) ; + return val.fromBuffer(buffer) ; + } +*/ + } +/* + template + size_t CAttributeTemplate::size(void) const + { + return CType::size() ;*/ +/* + if (isEmpty()) return sizeof(bool) ; + else + { + CType val(*const_cast(boost::any_cast(&value))) ; + return val.size()+sizeof(bool) ; + } +*/ + /* }*/ + + template + void CAttributeTemplate::generateCInterface(ostream& oss,const string& className) + { + CInterface::AttributeCInterface(oss, className, this->getName()) ; +// CInterface::AttributeIsDefinedCInterface(oss, className, this->getName()) ; + } + + template + void CAttributeTemplate::generateFortran2003Interface(ostream& oss,const string& className) + { + CInterface::AttributeFortran2003Interface(oss, className, this->getName()) ; +// CInterface::AttributeIsDefinedFortran2003Interface(oss, className, this->getName()) ; + } + + template + void CAttributeTemplate::generateFortranInterfaceDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()+"_") ; + } + + template + void CAttributeTemplate::generateFortranInterfaceBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceBody(oss, className, this->getName()) ; + } + + template + void CAttributeTemplate::generateFortranInterfaceDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()) ; + } + + template + void CAttributeTemplate::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()+"_") ; + } + + + template + void CAttributeTemplate::generateFortranInterfaceGetBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetBody(oss, className, this->getName()) ; + } + + template + void CAttributeTemplate::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()) ; + } + + +/* + //--------------------------------------------------------------- + + // Spécialisations des templates pour la fonction [toString] + + template <> + StdString CAttributeTemplate::toString(void) const; + + //--------------------------------------------------------------- + + // Spécialisations des templates pour la fonction [fromString] + + template <> // Chaîne de caractères. + void CAttributeTemplate::fromString(const StdString & str); + + template <> // Entier + void CAttributeTemplate::fromString(const StdString & str); + + template <> // Booléen + void CAttributeTemplate::fromString(const StdString & str); + + template <> // Double + void CAttributeTemplate::fromString(const StdString & str); + + template<> // Tableau + void CAttributeTemplate::fromString(const StdString & str); + + //--------------------------------------------------------------- + + // Spécialisations des templates pour la fonction [toBinary] // + + template <> // Chaîne de caractères. + void CAttributeTemplate::toBinary (StdOStream & os) const; + + template <> // Entier + void CAttributeTemplate::toBinary(StdOStream & os) const; + + template <> // Booléen + void CAttributeTemplate::toBinary(StdOStream & os) const; + + template <> // Double + void CAttributeTemplate::toBinary(StdOStream & os) const; + + //--------------------------------------------------------------- + + // Spécialisations des templates pour la fonction [fromBinary] // + + template <> // Chaîne de caractères. + void CAttributeTemplate::fromBinary(StdIStream & is); + + template <> // Entier + void CAttributeTemplate::fromBinary(StdIStream & is); + + template <> // Booléen + void CAttributeTemplate::fromBinary(StdIStream & is); + + template <> // Double + void CAttributeTemplate::fromBinary(StdIStream & is); + + ///-------------------------------------------------------------- +*/ +} // namespace xios + +#endif // __XMLIO_CAttributeTemplate_impl__ diff --git a/src/attribute_template_specialisation.hpp b/src/attribute_template_specialisation.hpp new file mode 100644 index 0000000..9d564e3 --- /dev/null +++ b/src/attribute_template_specialisation.hpp @@ -0,0 +1,217 @@ +#include "attribute_template.hpp" +#include "attribute_template_impl.hpp" + +#include + +namespace xios +{ +/* + /// ////////////////////// Définitions ////////////////////// /// + + /// Spécialisations des templates pour la fonction [toString] /// + + template <> + StdString CAttributeTemplate::toString(void) const + { + StdOStringStream oss; + if (!this->isEmpty() && this->hasId()) + { + if (this->getValue()) + oss << this->getName() << "=\".TRUE.\""; + else + oss << this->getName() << "=\".FALSE.\""; + } + return (oss.str()); + } + + //--------------------------------------------------------------- + + /// Spécialisations des templates pour la fonction [fromString] /// + + template <> // Chaîne de caractères. + void CAttributeTemplate::fromString(const StdString & str) + { + this->setValue(str); + } + + template <> // Entier + void CAttributeTemplate::fromString(const StdString & str) + { + try + { + this->setValue(boost::lexical_cast(str)); + } + catch(boost::bad_lexical_cast &) + { + ERROR("void CAttributeTemplate::fromString(const StdString & str)", + << "[ str = " << str << " ] Bad cast !"); + } + } + + template <> // Double + void CAttributeTemplate::fromString(const StdString & str) + { + if (str.find("max") != StdString::npos) + { + this->setValue(DBL_MAX); + return; + } + if (str.find("min") != StdString::npos) + { + this->setValue(DBL_MIN); + return; + } + + try + { + this->setValue(boost::lexical_cast(str)); + } + catch(boost::bad_lexical_cast &) + { + ERROR("void CAttributeTemplate::fromString(const StdString & str)", + << "[ str = " << str << " ] Bad cast !"); + } + } + + template <> // Booléen + void CAttributeTemplate::fromString(const StdString & str) + { + if (str.find(".TRUE.") != StdString::npos) + this->setValue(true); + else + this->setValue(false); + } + + //--------------------------------------------------------------- + + template<> // Tableau + void CAttributeTemplate::fromString(const StdString & str) + { + ARRAY_CREATE(array_sptr, double, 1, [1]); + CArray & array = *array_sptr; + this->setValue(array_sptr); + + StdIStringStream iss(str) ; + char c = '\0'; int size = 0; + double d = 0.,valsup = 0., valinf = 0.; + std::vector vect; + + iss >> d; vect.push_back(d); + size = vect.size(); + if (!iss.eof ()) + { + iss >> c; + switch (c) + { + case ',' : // Le tableau est généré valeur par valeur. + iss.unget(); + while(!iss.eof ()) + { // On récupère chacune des valeurs une par une jusqu'à ce que le buffer soit vide. + iss >> c >> d; + if (c != ',') + ERROR("CAttributeTemplate::fromString(const StdString & str)", + << "[ str = " << str << " ] bad definition of array !"); + vect.push_back(d); + } + size = vect.size(); + break; + case '(' : // Le tableau est généré automatiquement. + if (!iss.eof ()) + { // on récupère la borne supérieure + valinf = d; + iss >> size >> c >> d; + if ((c != ')') || (size <= 0)) + ERROR("CAttributeTemplate::fromString(const StdString & str)", + << "[ str = " << str << " ] bad definition of array !"); + valsup = d; + } + d = (valsup - valinf) / (double)(size - 1); + for (int j = 1; j <= size; j++) + vect.push_back(valinf + j * d); + break; + default : + ERROR("CAttributeTemplate::fromString(const StdString & str)", + << "[ str = " << str << " ] bad definition of array !"); + } + } + + array.resize(boost::extents[size]); + for (int i = 0; i < size; i++) + array[i] = vect[i]; + + } + + //--------------------------------------------------------------- + + /// Spécialisations des templates pour la fonction [toBinary] /// + + template <> // Chaîne de caractères. + void CAttributeTemplate::toBinary (StdOStream & os) const + { + StdString str = this->getValue(); + StdSize size = str.size(); + os.write (reinterpret_cast(&size) , sizeof(StdSize)); + os.write (str.data(), size * sizeof(char)); + } + + template <> // Entier + void CAttributeTemplate::toBinary(StdOStream & os) const + { + int value = this->getValue(); + os.write (reinterpret_cast(&value) , sizeof(int)); + } + + template <> // Booléen + void CAttributeTemplate::toBinary(StdOStream & os) const + { + bool value = this->getValue(); + os.write (reinterpret_cast(&value) , sizeof(bool)); + } + + template <> // Double + void CAttributeTemplate::toBinary(StdOStream & os) const + { + double value = this->getValue(); + os.write (reinterpret_cast(&value) , sizeof(double)); + } + + //--------------------------------------------------------------- + + /// Spécialisations des templates pour la fonction [fromBinary] /// + + template <> // Chaîne de caractères. + void CAttributeTemplate::fromBinary(StdIStream & is) + { + StdSize size = 0; + is.read (reinterpret_cast(&size), sizeof(StdSize)); + StdString value(size, ' '); + is.read (const_cast(value.data()), size * sizeof(char)); + this->setValue(value); + } + + template <> // Entier + void CAttributeTemplate::fromBinary(StdIStream & is) + { + int value = 0; + is.read (reinterpret_cast(&value), sizeof(int)); + this->setValue(value); + } + + template <> // Booléen + void CAttributeTemplate::fromBinary(StdIStream & is) + { + bool value = false; + is.read (reinterpret_cast(&value), sizeof(bool)); + this->setValue(value); + } + + template <> // Double + void CAttributeTemplate::fromBinary(StdIStream & is) + { + double value = 0.; + is.read (reinterpret_cast(&value), sizeof(double)); + this->setValue(value); + } + ///-------------------------------------------------------------- +*/ +} // namespace xios diff --git a/src/buffer.cpp b/src/buffer.cpp new file mode 100644 index 0000000..9515b8e --- /dev/null +++ b/src/buffer.cpp @@ -0,0 +1,49 @@ +#include "xmlioserver_spl.hpp" +#include "buffer.hpp" + + +namespace xios +{ + CBuffer::CBuffer(void* buffer_,size_t size_) + { + own=false ; + realloc(buffer_,size_) ; + } + + CBuffer::CBuffer(size_t size_) + { + own=false ; + realloc(size_) ; + } + + void CBuffer::realloc(size_t size_) + { + realloc(new char[size_],size_) ; + own=true ; + } + + void CBuffer::realloc(void* buffer_,size_t size_) + { + if (own) delete [] buffer ; + buffer=(char*)buffer_ ; + size=size_ ; + count=0 ; + read=buffer ; + write=buffer ; + own=false ; + } + + size_t CBuffer::remain(void) + { + return size-count ; + } + + CBuffer::~CBuffer() + { + if (own) delete [] buffer ; + } + +} + + + diff --git a/src/buffer.hpp b/src/buffer.hpp new file mode 100644 index 0000000..7236995 --- /dev/null +++ b/src/buffer.hpp @@ -0,0 +1,78 @@ +#ifndef __BUFFER_HPP__ +#define __BUFFER_HPP__ + + +#include "xmlioserver_spl.hpp" + +namespace xios +{ + + class CBuffer + { + + public: + + CBuffer(size_t size) ; + CBuffer(void* buffer,size_t size) ; + + void realloc(size_t size) ; + void realloc(void* buffer,size_t size) ; + + template + bool put(const T& data) ; + + template + bool put(const T* data, size_t n) ; + + template + bool put_ptr(const T*& data_ptr, size_t n) ; + + template + bool get(T& data) ; + + template + bool get(T* data, size_t n) ; + + template + bool get_ptr(T*& data, size_t n) ; + + + + template + bool put_template(const T& data) ; + + template + bool put_template(const T* data, size_t n) ; + + template + bool put_ptr_template(const T*& data, size_t n) ; + + template + bool get_template(T& data) ; + + template + bool get_template(T* data, size_t n) ; + + template + bool get_ptr_template(T*& data, size_t n) ; + + size_t remain(void) ; + + ~CBuffer() ; + char* buffer ; + char* read ; + char* write ; + size_t count ; + bool own ; + size_t size ; + } ; + + + + +} + +//#include "buffer_impl.hpp" + + +#endif diff --git a/src/buffer_client.cpp b/src/buffer_client.cpp new file mode 100644 index 0000000..d67a57b --- /dev/null +++ b/src/buffer_client.cpp @@ -0,0 +1,110 @@ +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "log.hpp" +#include "buffer_out.hpp" +#include "buffer_client.hpp" +#include "cxios.hpp" +#include "mpi.hpp" +#include "tracer.hpp" + +namespace xios +{ + + size_t maxRequestSize=0 ; + + CClientBuffer::CClientBuffer(MPI_Comm interComm_,int serverRank_) + { + bufferSizeByServer=CXios::bufferSize ; + info(10)<<"bufferSizeByServer "<maxRequestSize) maxRequestSize=size ; + + if (size>bufferSize) ERROR("CClientBuffer::hasSpace(int size)", + <<"request size is too big for buffer, increase buffer client size"< "<realloc(buffer[current]+count,size) ; + count+=size ; + return retBuffer ; + } + else + { + ERROR("CBufferOut* CClientBuffer::getSpace(int size) ;", + <<"No ennough space in buffer, that may not happen..."); + return NULL ; + } + + } + + bool CClientBuffer::checkBuffer(void) + { + MPI_Status status ; + int flag ; + + if (pending) + { + traceOff() ; + MPI_Test(&request,&flag,&status) ; + traceOn() ; + if (flag==true) pending=false ; + } + + if (!pending) + { + if (count>0) + { + MPI_Issend(buffer[current],count,MPI_CHAR,serverRank,20,interComm,&request) ; + pending=true ; + if (current==1) current=0 ; + else current=1 ; + count=0 ; + } + } + return pending ; + } + + bool CClientBuffer::hasPendingRequest(void) + { + if (pending) return true ; + else if (count>0) return true ; + else return false ; + } + + + +} + diff --git a/src/buffer_client.hpp b/src/buffer_client.hpp new file mode 100644 index 0000000..332e190 --- /dev/null +++ b/src/buffer_client.hpp @@ -0,0 +1,44 @@ +#ifndef __BUFFER_CLIENT_HPP__ +#define __BUFFER_CLIENT_HPP__ + +#include "xmlioserver_spl.hpp" +#include "buffer_out.hpp" +#include "mpi.hpp" + +namespace xios +{ + extern size_t maxRequestSize ; + + class CClientBuffer + { + + public: + + CClientBuffer(MPI_Comm intercomm,int serverRank) ; + ~CClientBuffer() ; + bool isBufferFree(int size) ; + CBufferOut* getBuffer(int size) ; + bool checkBuffer(void) ; + bool hasPendingRequest(void) ; + + char* buffer[2] ; + int remain(void) ; + + int current ; + int count ; + int bufferSize ; + int serverRank ; + bool pending ; + + size_t bufferSizeByServer ; + + MPI_Request request ; + + CBufferOut* retBuffer; + MPI_Comm interComm ; + } ; + +} + +#endif + diff --git a/src/buffer_decl.cpp b/src/buffer_decl.cpp new file mode 100644 index 0000000..bf811b2 --- /dev/null +++ b/src/buffer_decl.cpp @@ -0,0 +1,25 @@ +#include "buffer.hpp" +#include "buffer_impl.hpp" + +namespace xios +{ +# define macro(T) \ + template bool CBuffer::put_template(const T& data) ; \ + template bool CBuffer::put_template(const T* data, size_t n) ; \ + template bool CBuffer::put_ptr_template(const T*& data, size_t n) ; \ + template bool CBuffer::get_template(T& data) ; \ + template bool CBuffer::get_template(T* data, size_t n) ; \ + template bool CBuffer::get_ptr_template(T*& data, size_t n) ; + + + macro(char) + macro(int) + macro(short) + macro(long) + macro(uint) + macro(ushort) + macro(ulong) + macro(float) + macro(double) + macro(long double) +} diff --git a/src/buffer_impl.hpp b/src/buffer_impl.hpp new file mode 100644 index 0000000..bcaa03c --- /dev/null +++ b/src/buffer_impl.hpp @@ -0,0 +1,175 @@ +#ifndef __BUFFER_IMPL_HPP__ +#define __BUFFER_IMPL_HPP__ + +namespace xios +{ + +// template spectialisation : CBuffer::put + template <> bool CBuffer::put(const char& data) { return put_template(data) ; } + template <> bool CBuffer::put(const int& data) { return put_template(data) ; } + template <> bool CBuffer::put(const short& data) { return put_template(data) ; } + template <> bool CBuffer::put(const long& data) { return put_template(data) ; } + template <> bool CBuffer::put(const uint& data) { return put_template(data) ; } + template <> bool CBuffer::put(const ushort& data) { return put_template(data) ; } + template <> bool CBuffer::put(const ulong& data) { return put_template(data) ; } + template <> bool CBuffer::put(const float& data) { return put_template(data) ; } + template <> bool CBuffer::put(const double& data) { return put_template(data) ; } + template <> bool CBuffer::put(const long double& data) { return put_template(data) ;} + + template <> bool CBuffer::put(const char* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const int* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const short* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const long* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const uint* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const ushort* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const ulong* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const float* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const double* data, size_t n) { return put_template(data,n) ; } + template <> bool CBuffer::put(const long double* data, size_t n) { return put_template(data,n) ;} + + + template <> bool CBuffer::put_ptr(const char*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const int*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const short*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const long*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const uint*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const ushort*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const ulong*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const float*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const double*& data, size_t n) { return put_ptr_template(data,n) ; } + template <> bool CBuffer::put_ptr(const long double*& data, size_t n) { return put_ptr_template(data,n) ;} + + +// template spectialisation : CBuffer::get + template <> bool CBuffer::get(char& data) { return get_template(data) ; } + template <> bool CBuffer::get(int& data) { return get_template(data) ; } + template <> bool CBuffer::get(short& data) { return get_template(data) ; } + template <> bool CBuffer::get(long& data) { return get_template(data) ; } + template <> bool CBuffer::get(uint& data) { return get_template(data) ; } + template <> bool CBuffer::get(ushort& data) { return get_template(data) ; } + template <> bool CBuffer::get(ulong& data) { return get_template(data) ; } + template <> bool CBuffer::get(float& data) { return get_template(data) ; } + template <> bool CBuffer::get(double& data) { return get_template(data) ; } + template <> bool CBuffer::get(long double& data) { return get_template(data) ;} + + template <> bool CBuffer::get(char* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(int* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(short* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(long* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(uint* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(ushort* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(ulong* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(float* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(double* data, size_t n) { return get_template(data,n) ; } + template <> bool CBuffer::get(long double* data, size_t n) { return get_template(data,n) ;} + + template <> bool CBuffer::get_ptr(char*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(int*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(short*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(long*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(uint*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(ushort*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(ulong*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(float*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(double*& data, size_t n) { return get_ptr_template(data,n) ; } + template <> bool CBuffer::get_ptr(long double*& data, size_t n) { return get_ptr_template(data,n) ;} + + + template + bool CBuffer::put_template(const T& data) + { + return put_template(&data,1); + } + + template + bool CBuffer::put_template(const T* data, size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (count+dataSize<=size) + { + dataBuff=(char*) data ; + for(size_t i=0;i + bool CBuffer::put_ptr_template(const T*& data, size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (count+dataSize<=size) + { + data=(T*) write ; + write+=dataSize ; + count+=dataSize; + ret=true ; + } + else ret=false ; + + return ret ; + } + + + template + bool CBuffer::get_template(T& data) + { + return get_template(&data,1) ; + + } + + template + bool CBuffer::get_template(T* data, size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (read+dataSize<=buffer+size) + { + dataBuff=(char*) data ; + for(size_t i=0;i + bool CBuffer::get_ptr_template(T*& data, size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (read+dataSize<=buffer+size) + { + data=(T*) read ; + read+=dataSize ; + ret=true ; + } + else ret=false ; + + return ret ; + } + +} + + +#endif diff --git a/src/buffer_in.cpp b/src/buffer_in.cpp new file mode 100644 index 0000000..4da5ae9 --- /dev/null +++ b/src/buffer_in.cpp @@ -0,0 +1,69 @@ +#include "xmlioserver_spl.hpp" +#include "buffer_in.hpp" + + +namespace xios +{ + CBufferIn::CBufferIn(void* buffer,size_t size) + { + own=false ; + realloc(buffer,size) ; + } + + CBufferIn::CBufferIn(size_t size) + { + own=false ; + realloc(size) ; + } + + CBufferIn::CBufferIn(void) + { + own=false ; + realloc(0,0) ; + } + + void CBufferIn::realloc(size_t size) + { + realloc(new char[size_],size) ; + own=true ; + } + + void CBufferIn::realloc(void* buffer,size_t size) + { + if (own) delete [] begin ; + begin=(char*)buffer ; + size_=size ; + current=begin ; + end=begin+size_ ; + count_=0 ; + own=false ; + } + + bool CBufferIn::advance(size_t n) { return advance(n); } + + size_t CBufferIn::remain(void) + { + return size_-count_ ; + } + + size_t CBufferIn::count(void) + { + return count_ ; + } + + size_t CBufferIn::size(void) + { + return size_ ; + } + + CBufferIn::~CBufferIn() + { + if (own) delete [] begin ; + } + + void* CBufferIn::ptr(void) { return current; } + +} + + + diff --git a/src/buffer_in.hpp b/src/buffer_in.hpp new file mode 100644 index 0000000..64b5bbd --- /dev/null +++ b/src/buffer_in.hpp @@ -0,0 +1,64 @@ +#ifndef __BUFFER_IN_HPP__ +#define __BUFFER_IN_HPP__ + + +#include "xmlioserver_spl.hpp" + +namespace xios +{ + + class CBufferIn + { + + public: + + CBufferIn(size_t size) ; + CBufferIn(void) ; + CBufferIn(void* buffer,size_t size) ; + + void realloc(size_t size) ; + void realloc(void* buffer,size_t size) ; + + + template + bool advance(size_t n) ; + + bool advance(size_t n) ; + + template + bool get(T& data) ; + + template + bool get(T* data, size_t n) ; + + template + bool advance_template(size_t n) ; + + template + bool get_template(T& data) ; + + template + bool get_template(T* data, size_t n) ; + + void* ptr(void) ; + + + size_t remain(void) ; + size_t count(void) ; + size_t size(void) ; + ~CBufferIn() ; + + char* begin ; + char* end ; + char* current ; + size_t count_ ; + size_t size_ ; + bool own ; + } ; + +} + +//#include "buffer_in_impl.hpp" + + +#endif diff --git a/src/buffer_in_decl.cpp b/src/buffer_in_decl.cpp new file mode 100644 index 0000000..d237488 --- /dev/null +++ b/src/buffer_in_decl.cpp @@ -0,0 +1,23 @@ +#include "buffer_in.hpp" +#include "buffer_in_impl.hpp" + +namespace xios +{ +# define macro(T) \ + template bool CBufferIn::get_template(T& data); \ + template bool CBufferIn::get_template(T* data, size_t n); \ + template bool CBufferIn::advance_template(size_t n); + + + macro(char) + macro(int) + macro(short) + macro(long) + macro(uint) + macro(ushort) + macro(ulong) + macro(float) + macro(double) + macro(long double) +} + diff --git a/src/buffer_in_impl.hpp b/src/buffer_in_impl.hpp new file mode 100644 index 0000000..ff8ec8c --- /dev/null +++ b/src/buffer_in_impl.hpp @@ -0,0 +1,94 @@ +#ifndef __BUFFER_IN_IMPL_HPP__ +#define __BUFFER_IN_IMPL_HPP__ + +namespace xios +{ + +// template spectialisation : CBufferIn::get + + template <> bool CBufferIn::get(char& data) { return get_template(data) ; } + template <> bool CBufferIn::get(bool& data) { return get_template(data) ; } + template <> bool CBufferIn::get(int& data) { return get_template(data) ; } + template <> bool CBufferIn::get(short& data) { return get_template(data) ; } + template <> bool CBufferIn::get(long& data) { return get_template(data) ; } + template <> bool CBufferIn::get(uint& data) { return get_template(data) ; } + template <> bool CBufferIn::get(ushort& data) { return get_template(data) ; } + template <> bool CBufferIn::get(ulong& data) { return get_template(data) ; } + template <> bool CBufferIn::get(float& data) { return get_template(data) ; } + template <> bool CBufferIn::get(double& data) { return get_template(data) ; } + template <> bool CBufferIn::get(long double& data) { return get_template(data) ;} + + template <> bool CBufferIn::get(char* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(bool* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(int* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(short* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(long* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(uint* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(ushort* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(ulong* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(float* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(double* data, size_t n) { return get_template(data,n) ; } + template <> bool CBufferIn::get(long double* data, size_t n) { return get_template(data,n) ;} + + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferIn::advance(size_t n) { return advance_template(n) ;} + + template + bool CBufferIn::get_template(T& data) + { + return get_template(&data,1) ; + } + + template + bool CBufferIn::get_template(T* data, size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (count_+dataSize<=size_) + { + dataBuff=(char*) data ; + for(size_t i=0;i + bool CBufferIn::advance_template(size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (count_+dataSize<=size_) + { + current+=dataSize ; + count_+=dataSize ; + ret=true ; + } + else ret=false ; + + return ret ; + } + +} + + +#endif diff --git a/src/buffer_out.cpp b/src/buffer_out.cpp new file mode 100644 index 0000000..66471ea --- /dev/null +++ b/src/buffer_out.cpp @@ -0,0 +1,72 @@ +#include "xmlioserver_spl.hpp" +#include "buffer_out.hpp" + + +namespace xios +{ + CBufferOut::CBufferOut(void* buffer,size_t size) + { + own=false ; + realloc(buffer,size) ; + } + + CBufferOut::CBufferOut(void) + { + own=false ; + realloc(0,0) ; + } + + CBufferOut::CBufferOut(size_t size) + { + own=false ; + realloc(size) ; + } + + void CBufferOut::realloc(size_t size) + { + realloc(new char[size],size) ; + own=true ; + } + + void CBufferOut::realloc(void* buffer,size_t size) + { + if (own) delete [] begin ; + begin=(char*)buffer ; + size_=size ; + end=begin+size_ ; + count_=0 ; + current=begin ; + own=false ; + } + + bool CBufferOut::advance(size_t n) { return advance(n); } + + void* CBufferOut::ptr(void) + { + return current ; + } + + size_t CBufferOut::remain(void) + { + return size_-count_ ; + } + + size_t CBufferOut::count(void) + { + return count_ ; + } + + size_t CBufferOut::size(void) + { + return size_ ; + } + + CBufferOut::~CBufferOut() + { + if (own) delete [] begin ; + } + +} + + + diff --git a/src/buffer_out.hpp b/src/buffer_out.hpp new file mode 100644 index 0000000..ebdd3bc --- /dev/null +++ b/src/buffer_out.hpp @@ -0,0 +1,66 @@ +#ifndef __BUFFER_OUT_HPP__ +#define __BUFFER_OUT_HPP__ + + +#include "xmlioserver_spl.hpp" + +namespace xios +{ + + class CBufferOut + { + + public: + + CBufferOut(size_t size) ; + CBufferOut(void) ; + CBufferOut(void* buffer,size_t size) ; + + void realloc(size_t size) ; + void realloc(void* buffer,size_t size) ; + + template + bool put(const T& data) ; + + template + bool put(const T* data, size_t n) ; + + + template + bool advance(size_t n) ; + + bool advance(size_t n) ; + + + + template + bool put_template(const T& data) ; + + template + bool put_template(const T* data, size_t n) ; + + template + bool advance_template(size_t n) ; + + void* ptr(void) ; + + size_t remain(void) ; + size_t count(void) ; + size_t size(void) ; + + ~CBufferOut() ; + char* begin ; + char* current ; + char* end; + size_t count_ ; + size_t size_ ; + bool own ; + } ; + + +} + +//#include "buffer_out_impl.hpp" + + +#endif diff --git a/src/buffer_out_decl.cpp b/src/buffer_out_decl.cpp new file mode 100644 index 0000000..6621dd4 --- /dev/null +++ b/src/buffer_out_decl.cpp @@ -0,0 +1,23 @@ +#include "buffer_out.hpp" +#include "buffer_out_impl.hpp" + + +namespace xios +{ +# define macro(T) \ + template bool CBufferOut::put_template(const T& data) ; \ + template bool CBufferOut::put_template(const T* data, size_t n) ; \ + template bool CBufferOut::advance_template(size_t n) ; \ + + + macro(char) + macro(int) + macro(short) + macro(long) + macro(uint) + macro(ushort) + macro(ulong) + macro(float) + macro(double) + macro(long double) +} diff --git a/src/buffer_out_impl.hpp b/src/buffer_out_impl.hpp new file mode 100644 index 0000000..a1d3a65 --- /dev/null +++ b/src/buffer_out_impl.hpp @@ -0,0 +1,94 @@ +#ifndef __BUFFER_OUT_IMPL_HPP__ +#define __BUFFER_OUT_IMPL_HPP__ + +namespace xios +{ + +// template spectialisation : CBufferIn::put + template <> bool CBufferOut::put(const char& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const bool& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const int& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const short& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const long& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const uint& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const ushort& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const ulong& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const float& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const double& data) { return put_template(data) ; } + template <> bool CBufferOut::put(const long double& data) { return put_template(data) ;} + + template <> bool CBufferOut::put(const char* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const bool* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const int* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const short* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const long* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const uint* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const ushort* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const ulong* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const float* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const double* data, size_t n) { return put_template(data,n) ; } + template <> bool CBufferOut::put(const long double* data, size_t n) { return put_template(data,n) ;} + + + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ; } + template <> bool CBufferOut::advance(size_t n) { return advance_template(n) ;} + + template + bool CBufferOut::put_template(const T& data) + { + return put_template(&data,1); + } + + template + bool CBufferOut::put_template(const T* data, size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (count_+dataSize<=size_) + { + dataBuff=(char*) data ; + for(size_t i=0;i + bool CBufferOut::advance_template(size_t n) + { + bool ret; + char* dataBuff ; + + size_t dataSize=sizeof(T)*n ; + + if (count_+dataSize<=size_) + { + current+=dataSize ; + count_+=dataSize; + ret=true ; + } + else ret=false ; + + return ret ; + } + +} + + +#endif diff --git a/src/buffer_server.cpp b/src/buffer_server.cpp new file mode 100644 index 0000000..e3e908b --- /dev/null +++ b/src/buffer_server.cpp @@ -0,0 +1,172 @@ +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_server.hpp" +#include "cxios.hpp" + +namespace xios +{ + + CServerBuffer::CServerBuffer(void) + { + bufferSizeByClient=CXios::bufferSize*CXios::bufferServerFactorSize ; + size=bufferSizeByClient ; + first=0 ; + current=1 ; + end=size ; + buffer=new char[size] ; // change later for MPI_ALLOC_MEM later + } + + CServerBuffer::~CServerBuffer() + { + delete [] buffer ; + } + + + bool CServerBuffer::isBufferFree(size_t count) + { + bool ret ; + + if (count==0) return true ; + + if (current>first) + { + if (current+count0) + { + ret=true ; + } + else + { + ret=false ; + } + } + else + { + if (countfirst) + { + if (current+count0) + { + ret=buffer+current ; + current=0 ; + } + else + { + ERROR("void* CServerBuffer::getBuffer(size_t count)", + <<"cannot allocate required size in buffer") ; + } + } + else + { + end=current ; + if (countgetId() + << ", start: " << this->initDate + << ", current: " << this->currentDate << "]"; + return (oss.str()); + } + + void CCalendar::fromString(const StdString & str) + { ERROR("CCalendar::fromString(str)", + << "[ str = " << str << "] Not implemented yet !"); } + + //----------------------------------------------------------------- + + void CCalendar::setTimeStep(const CDuration & duration) + { this->timestep = duration; } + + CDate & CCalendar::update(int step) + { + info(20) << "update step : " << step <<" timestep "<timestep << std::endl; + return (this->getCurrentDate() = this->getInitDate() + step * this->timestep); + } + + //----------------------------------------------------------------- + + const CDuration & CCalendar::getTimeStep(void) const { return (this->timestep); } + const CDate & CCalendar::getInitDate(void) const { return (this->initDate); } + const CDate & CCalendar::getTimeOrigin(void) const { return (this->timeOrigin); } + CDate & CCalendar::getCurrentDate(void) { return (this->currentDate); } + + //----------------------------------------------------------------- + + int CCalendar::getMonthLength(const CDate & date) const + { // Retourne la durée du mois en jour. + static const int NoLeapMonthLength[] = + {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + return (NoLeapMonthLength[date.getMonth()-1]); + } + + StdString CCalendar::getType(void) const { return (StdString(this->getId())); } + + int CCalendar::getYearTotalLength(const CDate & date) const { return (365 * 86400); } + + int CCalendar::getYearLength (void) const { return (12); } + int CCalendar::getDayLength (void) const { return (24); } + int CCalendar::getHourLength (void) const { return (60); } + int CCalendar::getMinuteLength(void) const { return (60); } + + int CCalendar::getNbSecond(const CDate & date) const + { // Retourne le nombre de secondes écoulées depuis le début de l'année. + CDate _d0(date); int nbday = 0; + + for(_d0.setMonth(1); _d0.getMonth() < date.getMonth(); _d0.setMonth(_d0.getMonth()+1)) + nbday += getMonthLength(_d0); + return ((((nbday + date.getDay()) * getDayLength() + date.getHour()) * getHourLength() + + date.getMinute()) * getMinuteLength() + date.getSecond()); + } + + StdString CCalendar::getMonthName(int month_id) const + { + static const StdString Monthname_str[] = + { "january", "february", "march" , "april" , "may" , "june" , + "july" , "august" , "september", "october", "november", "december" }; + return(Monthname_str[month_id-1]); + } + + const StdString CCalendar::getMonthShortName(int month_id) const + { StdString value = this->getMonthName(month_id); value.resize(3); return (value); } + + ///---------------------------------------------------------------- + +} // namespace xios diff --git a/src/calendar.hpp b/src/calendar.hpp new file mode 100644 index 0000000..157eed6 --- /dev/null +++ b/src/calendar.hpp @@ -0,0 +1,101 @@ +#ifndef __XMLIO_CCalendar__ +#define __XMLIO_CCalendar__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "date.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + typedef enum _monthEnum + { JAN = 1, FEB = 2, MAR = 3, APR = 4 , MAY = 5 , JUN = 6 , + JUL = 7, AUG = 8, SEP = 9, OCT = 10, NOV = 11, DEC = 12 } MonthEnum; + + ///--------------------------------------------------------------- + + class CDate; + + class CCalendar : public CObject + { + /// Typedef /// + typedef CObject SuperClass; + + public : + + /// Destructeur /// + virtual ~CCalendar(void); + + protected : + + /// Constructeurs /// + CCalendar(void); + CCalendar(const StdString & id) ; + CCalendar(const StdString & id, + int yr, int mth, int d, + int hr = 0, int min = 0, int sec = 0); + CCalendar(const StdString & id, const StdString & dateStr); + CCalendar(const StdString & id, const StdString & dateStr, const StdString & timeOrigin); + + CCalendar(const CCalendar & calendar); // Not implemented yet. + CCalendar(const CCalendar * const calendar); // Not implemented yet. + + public : + + //------------------------------------------------------------ + + /// Autres /// + virtual StdString toString(void) const; + virtual void fromString(const StdString & str); + + /// Mutateur /// + void setTimeStep(const CDuration & duration); + + /// Traitemants /// + CDate & update(int step); + + /// Accesseurs /// + const CDuration & getTimeStep(void) const; + const CDate & getInitDate(void) const; + const CDate & getTimeOrigin(void) const; + CDate & getCurrentDate(void); + + public : + + //------------------------------------------------------------ + virtual int getMonthLength(const CDate & date) const ; + + virtual StdString getType(void) const; + + virtual int getYearTotalLength(const CDate & date) const ; // Retourne la durée d'une année en seconde. + + virtual int getYearLength (void) const; // Retourne la durée d'une année en mois. + virtual int getDayLength (void) const; // Retourne la durée d'un jour en heures. + virtual int getHourLength (void) const; // Retourne la durée d'une heure en minute. + virtual int getMinuteLength(void) const; // Retourne la durée d'une minute en secondes. + + virtual int getNbSecond(const CDate & date) const; + virtual StdString getMonthName(int month_id) const; + + virtual const StdString getMonthShortName(int month_id) const; + void initializeDate(int yr, int mth, int d, int hr = 0, int min = 0, int sec = 0) ; + void initializeDate(const StdString & dateStr); + void initializeDate(const StdString & dateStr, const StdString & timeOrigin); + + //------------------------------------------------------------ + + private : + + /// Propriétés privées /// + CDate initDate; + CDate timeOrigin; + CDate currentDate; + CDuration timestep; + + }; // class CCalendar + +} // namespace xios + +#endif // __XMLIO_CCalendar__ diff --git a/src/calendar_util.cpp b/src/calendar_util.cpp new file mode 100644 index 0000000..b86a696 --- /dev/null +++ b/src/calendar_util.cpp @@ -0,0 +1,195 @@ +#include "calendar_util.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CDuration operator*(const double & scal, const CDuration & ddr) + { return (ddr * scal); } + + CDuration operator-(const CDuration & ddr , const CDuration & dr) + { + CDuration dur(ddr); + dur.year -= dr.year; dur.month -= dr.month ; dur.day -= dr.day; + dur.hour -= dr.hour; dur.minute -= dr.minute; dur.second -= dr.second; dur.timestep -= dr.timestep; + return (dur); + } + + CDuration operator+(const CDuration & ddr , const CDuration & dr) + { + CDuration dur(ddr); + dur.year += dr.year; dur.month += dr.month ; dur.day += dr.day; + dur.hour += dr.hour; dur.minute += dr.minute; dur.second += dr.second; dur.timestep += dr.timestep; + return (dur); + } + + CDuration operator*(const CDuration & ddr , const double & scal) + { + CDuration dur(ddr); + dur.year *= scal; dur.month *= scal; dur.day *= scal; + dur.hour *= scal; dur.minute *= scal; dur.second *= scal; dur.timestep *= scal; + return (dur); + } + + CDuration operator-(const CDuration & ddr) + { + CDuration dur(ddr); + dur.year = -dur.year; + dur.month = -dur.month; + dur.day = -dur.day; + dur.hour = -dur.hour; + dur.minute = -dur.minute; + dur.second = -dur.second; + dur.timestep = -dur.timestep; + return (dur); + } + + //----------------------------------------------------------------- + + CDate operator+(const CDate & dt, const CDuration & dr) + { + CDuration drr (dr); + int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0; + const CCalendar & c = dt.getRelCalendar(); + + drr.timestep=0 ; + drr=drr+dr.timestep*dt.getRelCalendar().getTimeStep() ; + + drr.resolve(dt.getRelCalendar()); + + // Ajustement des minutes par rapport aux secondes. + second += dt.getSecond() + drr.second; + if (second < 0) { minute --; second += c.getMinuteLength(); } + if (second >= c.getMinuteLength()) { minute ++; second -= c.getMinuteLength(); } + + // Ajustement des heures en fonction des minutes. + minute += dt.getMinute() + drr.minute; + if (minute < 0) { hour --; minute += c.getHourLength(); } + if (minute >= c.getHourLength()) { hour ++; minute -= c.getHourLength(); } + + // Ajustement des jours en fonction des heures. + hour += dt.getHour() + drr.hour; + if (hour < 0) { drr.day --; hour += c.getDayLength(); } + if (hour >= c.getDayLength()) { drr.day ++; hour -= c.getDayLength(); } + + // Ajustement des mois en fonction des jours. + CDate dtt(dt); + drr.day+=dtt.getDay()-1 ; + dtt.setDay(1) ; + + if ( drr.day >= 0 ) + { + for(; c.getMonthLength(dtt) <= drr.day; dtt.addMonth (1)) + { drr.day -= c.getMonthLength(dtt); drr.month += 1 ; } + + day = drr.day+1 ; + } + else + { + dtt.addMonth(-1) ; + drr.month-=1 ; + for(; c.getMonthLength(dtt) < -drr.day; dtt.addMonth (-1)) + { drr.day+=c.getMonthLength(dtt) ; drr.month-=1 ; } + day=c.getMonthLength(dtt)+drr.day+1 ; + } + +/* + if (day < 0) { drr.month --; day += c.getMonthLength(dtt); } + if (day > c.getMonthLength(dtt)) { drr.month ++; day -= c.getMonthLength(dtt); } // << Problème ici + if (day == 0){ day = c.getMonthLength(dtt); drr.month --; } +*/ + drr.resolve(dt.getRelCalendar()); + + // Ajustement des années en fonction des mois. + month += dt.getMonth() + drr.month; + if (month < 0) { drr.year --; month += c.getYearLength(); } + if (month > c.getYearLength()) { drr.year ++; month -= c.getYearLength(); } + if (month == 0){ month = c.getYearLength(); drr.year--; } + + year += dt.getYear() + drr.year; + + return (CDate(dt.getRelCalendar(), year, month, day, hour, minute, second)); + } + + CDate operator-(const CDate & dt, const CDuration & dr) { return (dt + (-dr)); } + + //----------------------------------------------------------------- + + CDuration operator-(const CDate & dt0, const CDate & dt1) + { + // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier. + CDuration dur = + { dt0.getYear() - dt1.getYear(), dt0.getMonth() - dt1.getMonth() , dt0.getDay() - dt1.getDay(), + dt0.getHour() - dt1.getHour(), dt0.getMinute() - dt1.getMinute(), dt0.getSecond() - dt1.getSecond() }; + return (dur.resolve(dt0.getRelCalendar())); + } + + //----------------------------------------------------------------- + + /// Les opérateurs de comparaison. (Non testés pour le moment) + bool operator==(const CDate& dt0, const CDate& dt1) + { + // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier. + return ((dt0.getYear() == dt1.getYear()) && (dt0.getMonth() == dt1.getMonth()) && (dt1.getDay() == dt0.getDay()) && + (dt0.getHour() == dt1.getHour()) && (dt0.getMinute() == dt1.getMinute()) && (dt1.getSecond() == dt0.getSecond())); + } + + bool operator< (const CDate& dt0, const CDate& dt1) + { + // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier. + if (dt0.getYear() < dt1.getYear()) + { + return true; + } + else if (dt0.getYear() == dt1.getYear()) + { + if (dt0.getMonth() < dt1.getMonth()) + { + return true; + } + else if (dt0.getMonth() == dt1.getMonth()) + { + if (dt0.getDay() < dt1.getDay()) + { + return true; + } + else if (dt0.getDay() == dt1.getDay()) + { + if (dt0.getHour() < dt1.getHour()) + { + return true; + } + else if (dt0.getHour() == dt1.getHour()) + { + if (dt0.getMinute() < dt1.getMinute()) + { + return true; + } + else if (dt0.getMinute() == dt1.getMinute()) + { + if (dt0.getSecond() < dt1.getSecond()) + return true; + } + } + } + } + } + return false; + } + + //----------------------------------------------------------------- + + bool operator!=(const CDate & dt0, const CDate & dt1){ return !(dt1 == dt0); } + bool operator> (const CDate & dt0, const CDate & dt1){ return (dt1 < dt0); } + bool operator>=(const CDate & dt0, const CDate & dt1){ return ((dt0 > dt1) || (dt1 == dt0)); } + bool operator<=(const CDate & dt0, const CDate & dt1){ return ((dt0 < dt1) || (dt1 == dt0)); } + + ///---------------------------------------------------------------- + +} // namespace xios + + + + + + diff --git a/src/calendar_util.hpp b/src/calendar_util.hpp new file mode 100644 index 0000000..476ad56 --- /dev/null +++ b/src/calendar_util.hpp @@ -0,0 +1,37 @@ +#ifndef __XMLIO_CCalendar_util__ +#define __XMLIO_CCalendar_util__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + CDuration operator*(const double & scal, const CDuration & ddr); + CDuration operator-(const CDuration & ddr , const CDuration & dr); + CDuration operator+(const CDuration & ddr , const CDuration & dr); + CDuration operator*(const CDuration & ddr , const double & scal); + CDuration operator-(const CDuration & ddr); + + CDate operator+(const CDate & dt, const CDuration & dr); // Non testée. + CDate operator-(const CDate & dt, const CDuration & dr); + + CDuration operator-(const CDate & dt0, const CDate & dt1); + + /// Les opérateurs de comparaison. (Non testés pour le moment) + bool operator==(const CDate& dt0, const CDate& dt1); + bool operator< (const CDate& dt0, const CDate& dt1); + + bool operator!=(const CDate & dt0, const CDate & dt1); + bool operator> (const CDate & dt0, const CDate & dt1); + bool operator>=(const CDate & dt0, const CDate & dt1); + bool operator<=(const CDate & dt0, const CDate & dt1); + + ///--------------------------------------------------------------- + +} // namespace xios + +#endif //__XMLIO_CCalendar_util__ diff --git a/src/client.cpp b/src/client.cpp new file mode 100644 index 0000000..fb0d0e9 --- /dev/null +++ b/src/client.cpp @@ -0,0 +1,284 @@ +#include "globalScopeData.hpp" +#include "xmlioserver_spl.hpp" +#include "cxios.hpp" +#include "client.hpp" +#include +#include "type.hpp" +#include "context.hpp" +#include "context_client.hpp" +#include "oasis_cinterface.hpp" +#include "mpi.hpp" +#include "timer.hpp" +#include "buffer_client.hpp" + +namespace xios +{ + + MPI_Comm CClient::intraComm ; + MPI_Comm CClient::interComm ; + int CClient::serverLeader ; + bool CClient::is_MPI_Initialized ; + int CClient::rank = INVALID_RANK; + StdOFStream CClient::m_infoStream; + + void CClient::initialize(const string& codeId,MPI_Comm& localComm,MPI_Comm& returnComm) + { + int initialized ; + MPI_Initialized(&initialized) ; + if (initialized) is_MPI_Initialized=true ; + else is_MPI_Initialized=false ; + +// don't use OASIS + if (!CXios::usingOasis) + { +// localComm doesn't given + if (localComm == MPI_COMM_NULL) + { + if (!is_MPI_Initialized) + { + int argc=0; + char** argv=NULL; + MPI_Init(&argc,&argv) ; + } + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS init").resume() ; + boost::hash hashString ; + + unsigned long hashClient=hashString(codeId) ; + unsigned long hashServer=hashString(CXios::xiosCodeId) ; + unsigned long* hashAll ; + int size ; + int myColor ; + int i,c ; + MPI_Comm newComm ; + + MPI_Comm_size(CXios::globalComm,&size) ; + MPI_Comm_rank(CXios::globalComm,&rank); + + hashAll=new unsigned long[size] ; + + MPI_Allgather(&hashClient,1,MPI_LONG,hashAll,1,MPI_LONG,CXios::globalComm) ; + + map colors ; + map leaders ; + + for(i=0,c=0;iinitClient(contextComm,contextInterComm) ; + } + else + { + MPI_Comm contextInterComm ; + MPI_Comm_dup(contextComm,&contextInterComm) ; + context->initClient(contextComm,contextInterComm) ; + context->initServer(contextComm,contextInterComm) ; + } + } + + void CClient::finalize(void) + { + int rank ; + int msg=0 ; + if (!CXios::isServer) + { + MPI_Comm_rank(intraComm,&rank) ; + if (rank==0) + { + MPI_Send(&msg,1,MPI_INT,0,0,interComm) ; + } + } + + CTimer::get("XIOS finalize").suspend() ; + CTimer::get("XIOS").suspend() ; + + if (!is_MPI_Initialized) + { + if (CXios::usingOasis) oasis_finalize(); + else MPI_Finalize() ; + } + info(20) << "Client side context is finalized"<open(fileNameClient.str().c_str(), std::ios::out); + if (!fb->is_open()) + ERROR("void CClient::openInfoStream(const StdString& fileName)", + < file to write" ); + + info.write2File(fb); + report.write2File(fb); + } + + //! Write out to standard output + void CClient::openInfoStream() + { + info.write2StdOut(); + report.write2StdOut(); + } + + //! Close file if it opens + void CClient::closeInfoStream() + { + if (m_infoStream.is_open()) m_infoStream.close(); + } + + +} diff --git a/src/client.hpp b/src/client.hpp new file mode 100644 index 0000000..ef29ad3 --- /dev/null +++ b/src/client.hpp @@ -0,0 +1,39 @@ +#ifndef __CLIENT_HPP__ +#define __CLIENT_HPP__ + +#include "xmlioserver_spl.hpp" +#include "mpi.hpp" + +namespace xios +{ + class CClient + { + public: + + static void initialize(const string& codeId,MPI_Comm& localComm,MPI_Comm& returnComm) ; + static void finalize(void) ; + static void registerContext(const string& id,MPI_Comm contextComm) ; + + static MPI_Comm intraComm ; + static MPI_Comm interComm ; + static int serverLeader; + static bool is_MPI_Initialized ; + + public: + static int getRank(); + + static void openInfoStream(const StdString& fileName); + + static void openInfoStream(); + + static void closeInfoStream(); + + protected: + static int rank; + static StdOFStream m_infoStream; + + + } ; +} + +#endif diff --git a/src/config/axis_attribute.conf b/src/config/axis_attribute.conf new file mode 100644 index 0000000..84f76e5 --- /dev/null +++ b/src/config/axis_attribute.conf @@ -0,0 +1,14 @@ +DECLARE_ATTRIBUTE(StdString, name) +DECLARE_ATTRIBUTE(StdString, standard_name) +DECLARE_ATTRIBUTE(StdString, long_name) + +DECLARE_ATTRIBUTE(StdString, unit) + +DECLARE_ATTRIBUTE(int, size) +DECLARE_ATTRIBUTE(int, zoom_begin) +DECLARE_ATTRIBUTE(int, zoom_end) +DECLARE_ATTRIBUTE(int, zoom_size) +DECLARE_ENUM2(positive, up, down) +DECLARE_ARRAY(double, 1, value) + + diff --git a/src/config/calendar_type.conf b/src/config/calendar_type.conf new file mode 100644 index 0000000..67f8ab4 --- /dev/null +++ b/src/config/calendar_type.conf @@ -0,0 +1,21 @@ +#ifdef __XMLIO_CAllLeapCalendar__ + DECLARE_CALENDAR(AllLeap , AllLeap) +#endif //__XMLIO_CAllLeapCalendar__ + +#ifdef __XMLIO_CD360Calendar__ + DECLARE_CALENDAR(D360 , D360) +#endif //__XMLIO_CD360Calendar__ + +#ifdef __XMLIO_CGregorianCalendar__ + DECLARE_CALENDAR(Gregorian , Gregorian) +#endif //__XMLIO_CGregorianCalendar__ + +#ifdef __XMLIO_CJulianCalendar__ + DECLARE_CALENDAR(Julian , Julian) +#endif //__XMLIO_CJulianCalendar__ + +#ifdef __XMLIO_CNoLeapCalendar__ + DECLARE_CALENDAR(NoLeap , NoLeap) +#endif //__XMLIO_CNoLeapCalendar__ + +#undef DECLARE_CALENDAR diff --git a/src/config/context_attribute.conf b/src/config/context_attribute.conf new file mode 100644 index 0000000..49345c5 --- /dev/null +++ b/src/config/context_attribute.conf @@ -0,0 +1,6 @@ +DECLARE_ATTRIBUTE(StdString, calendar_type) +DECLARE_ATTRIBUTE(StdString, start_date) +DECLARE_ATTRIBUTE(StdString, time_origin) +DECLARE_ATTRIBUTE(StdString, timestep) +DECLARE_ATTRIBUTE(StdString, output_dir) + diff --git a/src/config/domain_attribute.conf b/src/config/domain_attribute.conf new file mode 100644 index 0000000..c3087a0 --- /dev/null +++ b/src/config/domain_attribute.conf @@ -0,0 +1,64 @@ +/* GLOBAL */ +DECLARE_ATTRIBUTE(StdString , name) +DECLARE_ATTRIBUTE(StdString , standard_name) +DECLARE_ATTRIBUTE(StdString , long_name) + +/* Spécifique */ +DECLARE_ATTRIBUTE(StdString , domain_group_ref) + +/* GLOBAL */ +DECLARE_ATTRIBUTE(int , ni_glo) +DECLARE_ATTRIBUTE(int , nj_glo) + +/* LOCAL */ +DECLARE_ATTRIBUTE(int , ibegin) +DECLARE_ATTRIBUTE(int , iend) +DECLARE_ATTRIBUTE(int , ni) + +/* LOCAL */ +DECLARE_ATTRIBUTE(int , jbegin) +DECLARE_ATTRIBUTE(int , jend) +DECLARE_ATTRIBUTE(int , nj) + + +DECLARE_ARRAY(int,2 , i_index) +DECLARE_ARRAY(int,2 , j_index) + +/* LOCAL */ +DECLARE_ARRAY(bool, 2 , mask) + +/* GLOBAL */ +DECLARE_ATTRIBUTE(int , data_dim) + +/* LOCAL */ +DECLARE_ATTRIBUTE(int , data_ni) +DECLARE_ATTRIBUTE(int , data_nj) +DECLARE_ATTRIBUTE(int , data_ibegin) +DECLARE_ATTRIBUTE(int , data_jbegin) + +/* GLOBAL */ +DECLARE_ATTRIBUTE(int , zoom_ni) +DECLARE_ATTRIBUTE(int , zoom_nj) +DECLARE_ATTRIBUTE(int , zoom_ibegin) +DECLARE_ATTRIBUTE(int , zoom_jbegin) + +/* LOCAL */ +DECLARE_ATTRIBUTE(int , zoom_ni_loc) +DECLARE_ATTRIBUTE(int , zoom_nj_loc) +DECLARE_ATTRIBUTE(int , zoom_ibegin_loc) +DECLARE_ATTRIBUTE(int , zoom_jbegin_loc) + +/* LOCAL */ +DECLARE_ATTRIBUTE(int , data_n_index) +DECLARE_ARRAY(int, 1 , data_i_index) +DECLARE_ARRAY(int, 1, data_j_index) + +/* LOCAL */ +DECLARE_ARRAY(double, 1, lonvalue) +DECLARE_ARRAY(double, 1, latvalue) +DECLARE_ATTRIBUTE(int, nvertex) +DECLARE_ARRAY(double, 2, bounds_lon) +DECLARE_ARRAY(double, 2, bounds_lat) + +DECLARE_ENUM3(type,regular,curvilinear,unstructured) + diff --git a/src/config/field_attribute.conf b/src/config/field_attribute.conf new file mode 100644 index 0000000..fcc133a --- /dev/null +++ b/src/config/field_attribute.conf @@ -0,0 +1,25 @@ +DECLARE_ATTRIBUTE(StdString, name) +DECLARE_ATTRIBUTE(StdString, standard_name) +DECLARE_ATTRIBUTE(StdString, long_name) + +DECLARE_ATTRIBUTE(StdString, unit) +DECLARE_ATTRIBUTE(StdString, operation) +DECLARE_ATTRIBUTE(bool, detect_missing_value) + +DECLARE_ATTRIBUTE(StdString, freq_op) +DECLARE_ATTRIBUTE(StdString, freq_offset) +DECLARE_ATTRIBUTE(int, level) +DECLARE_ATTRIBUTE(int, prec) + +DECLARE_ATTRIBUTE(bool, enabled) + +DECLARE_ATTRIBUTE(StdString, domain_ref) +DECLARE_ATTRIBUTE(StdString, axis_ref) +DECLARE_ATTRIBUTE(StdString, grid_ref) +DECLARE_ATTRIBUTE(StdString, field_ref) + +DECLARE_ATTRIBUTE(double, default_value) +DECLARE_ATTRIBUTE(double, valid_min) +DECLARE_ATTRIBUTE(double, valid_max) +DECLARE_ATTRIBUTE(double, add_offset) +DECLARE_ATTRIBUTE(double, scale_factor) diff --git a/src/config/file_attribute.conf b/src/config/file_attribute.conf new file mode 100644 index 0000000..4afe761 --- /dev/null +++ b/src/config/file_attribute.conf @@ -0,0 +1,16 @@ +DECLARE_ATTRIBUTE(StdString, name) +DECLARE_ATTRIBUTE(StdString, description) + +DECLARE_ATTRIBUTE(StdString, name_suffix) +DECLARE_ATTRIBUTE(int, min_digits ) + +DECLARE_ATTRIBUTE(StdString, output_freq) +DECLARE_ATTRIBUTE(int, output_level) +DECLARE_ATTRIBUTE(StdString, sync_freq) +DECLARE_ATTRIBUTE(StdString, split_freq) +DECLARE_ATTRIBUTE(StdString, split_freq_format) +DECLARE_ATTRIBUTE(bool, enabled) +DECLARE_ENUM2(type,one_file,multiple_file) +DECLARE_ATTRIBUTE(StdString, par_access) + +// DECLARE_ATTRIBUTE_DEF(bool, enabled, true) diff --git a/src/config/functor_type.conf b/src/config/functor_type.conf new file mode 100644 index 0000000..2bb2e24 --- /dev/null +++ b/src/config/functor_type.conf @@ -0,0 +1,26 @@ +#ifdef __XMLIO_CAverage__ + DECLARE_FUNCTOR(Average , average) +#endif //__XMLIO_CAverage__ + +#ifdef __XMLIO_CAccumulate__ + DECLARE_FUNCTOR(Accumulate , accumulate) +#endif //__XMLIO_CAccumulate__ + +#ifdef __XMLIO_CInstant__ + DECLARE_FUNCTOR(Instant, instant) +#endif //__XMLIO_CInstant__ + +#ifdef __XMLIO_COnce__ + DECLARE_FUNCTOR(Once, once) +#endif //__XMLIO_COnce__ + +#ifdef __XMLIO_CMaximum__ + DECLARE_FUNCTOR(Maximum , maximum) +#endif //__XMLIO_CMaximum__ + +#ifdef __XMLIO_CMinimum__ + DECLARE_FUNCTOR(Minimum , minimum) +#endif //__XMLIO_CMinimum__ + + +#undef DECLARE_FUNCTOR diff --git a/src/config/grid_attribute.conf b/src/config/grid_attribute.conf new file mode 100644 index 0000000..db48d2c --- /dev/null +++ b/src/config/grid_attribute.conf @@ -0,0 +1,5 @@ +DECLARE_ATTRIBUTE(StdString, name) +DECLARE_ATTRIBUTE(StdString, description) +DECLARE_ATTRIBUTE(StdString, domain_ref) +DECLARE_ATTRIBUTE(StdString, axis_ref) +DECLARE_ARRAY(bool, 3 , mask) diff --git a/src/config/node_type.conf b/src/config/node_type.conf new file mode 100644 index 0000000..0c0c669 --- /dev/null +++ b/src/config/node_type.conf @@ -0,0 +1,34 @@ +#ifdef __XMLIO_CAxis__ + DECLARE_NODE(Axis , axis ) +#endif //__XMLIO_CAxis__ + +#ifdef __XMLIO_CDomain__ + DECLARE_NODE(Domain, domain) +#endif //__XMLIO_CDomain__ + +#ifdef __XMLIO_CField__ + DECLARE_NODE(Field , field ) +#endif //__XMLIO_CField__ + +#ifdef __XMLIO_CFile__ + DECLARE_NODE(File , file ) +#endif //__XMLIO_CFile__ + +#ifdef __XMLIO_CGrid__ + DECLARE_NODE(Grid , grid ) +#endif //__XMLIO_CGrid__ + +//#ifdef __XMLIO_CMethod__ +// DECLARE_NODE(Method, method) +//#endif //__XMLIO_CMethod__ + +#ifdef __XMLIO_CVariable__ + DECLARE_NODE(Variable, variable) +#endif //__XMLIO_CVariable__ + +#ifdef __XMLIO_CContext__ + DECLARE_NODE_PAR(Context, context) +#endif //__XMLIO_CContext__ + +#undef DECLARE_NODE +#undef DECLARE_NODE_PAR diff --git a/src/config/properties.conf b/src/config/properties.conf new file mode 100644 index 0000000..19c0247 --- /dev/null +++ b/src/config/properties.conf @@ -0,0 +1,24 @@ +/// Author /// +DECLARE_PROPERTY (StdString, AUTHOR, "OZDOBA Herve, MEURDESOIF Yann") + +/// Version number /// +DECLARE_PROPERTY (StdString, VERSION, "0.1") + +/// Time name /// +DECLARE_PROPERTY (StdString, TIME_NAME, "time") + +/// Output config /// +//DECLARE_PROPERTY (StdString, NETCDF_OUTPUT, "MULTI_FILE") // (ONE_FILE, TWO_FILE, MULTI_FILE) +DECLARE_PROPERTY (StdString, NETCDF_OUTPUT, "ONE_FILE") // (ONE_FILE, TWO_FILE, MULTI_FILE) +DECLARE_PROPERTY (StdString, FILE_SUFFIX, "_node" ) +DECLARE_PROPERTY (StdString, FILE_EXTENSION, ".nc" ) +DECLARE_PROPERTY (StdString, OUTPUT_PATH, "./data/" ) + +/// Default Value /// +DECLARE_PROPERTY (double, FIELD_DEFAULT_VALUE, 1E-10) + +/// Buffer Size /// +DECLARE_PROPERTY (StdSize, BUFFER_CLIENT_SIZE, 100E6) // 100 Mo +DECLARE_PROPERTY (StdSize, BUFFER_SERVER_SIZE, 1000E6) // 1000 Mo + + diff --git a/src/config/var_attribute.conf b/src/config/var_attribute.conf new file mode 100644 index 0000000..f1f081b --- /dev/null +++ b/src/config/var_attribute.conf @@ -0,0 +1,2 @@ +DECLARE_ATTRIBUTE(StdString, type) +DECLARE_ATTRIBUTE(StdString, name) diff --git a/src/configure.cpp b/src/configure.cpp new file mode 100644 index 0000000..3ef2c61 --- /dev/null +++ b/src/configure.cpp @@ -0,0 +1,14 @@ +#define __XMLIO_Configure__ // < Ne pas supprimer + +/// xios headers /// +#include "xmlioserver_spl.hpp" + +/// /////////// Macros /////////// /// +#undef DECLARE_PROPERTY +#define DECLARE_PROPERTY(type, name, value) \ + type name = value; + +namespace xios +{ +#include "properties.conf" +} // namespace xios diff --git a/src/configure.hpp b/src/configure.hpp new file mode 100644 index 0000000..358b1d7 --- /dev/null +++ b/src/configure.hpp @@ -0,0 +1,14 @@ +#ifndef __XMLIO_Configure__ +#define __XMLIO_Configure__ + + +/// /////////// Macros /////////// /// +#define DECLARE_PROPERTY(type, name, value) \ + extern type name; // = value + +namespace xios +{ +#include "properties.conf" +} // namespace xios + +#endif // __XMLIO_Configure__ diff --git a/src/context_client.cpp b/src/context_client.cpp new file mode 100644 index 0000000..cfff715 --- /dev/null +++ b/src/context_client.cpp @@ -0,0 +1,214 @@ +#include "xmlioserver_spl.hpp" +#include "context_client.hpp" +#include "context_server.hpp" +#include "event_client.hpp" +#include "buffer_out.hpp" +#include "buffer_client.hpp" +#include "type.hpp" +#include "message.hpp" +#include "event_client.hpp" +#include "context.hpp" +#include "mpi.hpp" +#include "timer.hpp" +#include "cxios.hpp" + +namespace xios +{ + + + CContextClient::CContextClient(CContext* parent,MPI_Comm intraComm_, MPI_Comm interComm_) + { + context=parent ; + intraComm=intraComm_ ; + interComm=interComm_ ; + MPI_Comm_rank(intraComm,&clientRank) ; + MPI_Comm_size(intraComm,&clientSize) ; + + int flag ; + MPI_Comm_test_inter(interComm,&flag) ; + if (flag) MPI_Comm_remote_size(interComm,&serverSize); + else MPI_Comm_size(interComm,&serverSize) ; + + timeLine=0 ; + + } + + + void CContextClient::sendEvent(CEventClient& event) + { + list::iterator itServer ; + list ranks ; + list sizes ; + list::iterator itSize ; + + ranks=event.getRanks() ; + if (! event.isEmpty()) + { + sizes=event.getSizes() ; + CMessage msg ; + + msg<<*(sizes.begin())<::iterator it=sizes.begin();it!=sizes.end();it++) *it+=msg.size() ; + list buffList=getBuffers(ranks,sizes) ; + + list::iterator it ; + for(it=buffList.begin(),itSize=sizes.begin();it!=buffList.end();++it,++itSize) + { + **it<<*itSize<hasServer) waitEvent(ranks) ; + timeLine++ ; + } + + void CContextClient::waitEvent(list& ranks) + { + context->server->setPendingEvent() ; + while(checkBuffers(ranks)) + { + context->server->listen() ; + context->server->checkPendingRequest() ; + } + + while(context->server->hasPendingEvent()) + { + context->server->eventLoop() ; + } + + } + + list CContextClient::getBuffers(list& serverList, list& sizeList) + { + list::iterator itServer,itSize ; + list bufferList ; + map::iterator it ; + list::iterator itBuffer ; + list retBuffer ; + bool free ; + + for(itServer=serverList.begin();itServer!=serverList.end();itServer++) + { + it=buffers.find(*itServer) ; + if (it==buffers.end()) + { + newBuffer(*itServer) ; + it=buffers.find(*itServer) ; + } + bufferList.push_back(it->second) ; + } + free=false ; + + CTimer::get("Blocking time").resume(); + while(!free) + { + free=true ; + for(itBuffer=bufferList.begin(),itSize=sizeList.begin(); itBuffer!=bufferList.end();itBuffer++,itSize++) + { + (*itBuffer)->checkBuffer() ; + free&=(*itBuffer)->isBufferFree(*itSize) ; + } + } + CTimer::get("Blocking time").suspend(); + + for(itBuffer=bufferList.begin(),itSize=sizeList.begin(); itBuffer!=bufferList.end();itBuffer++,itSize++) + { + retBuffer.push_back((*itBuffer)->getBuffer(*itSize)) ; + } + return retBuffer ; + + } + + void CContextClient::newBuffer(int rank) + { + buffers[rank]=new CClientBuffer(interComm,rank) ; + } + + bool CContextClient::checkBuffers(void) + { + map::iterator itBuff ; + bool pending=false ; + for(itBuff=buffers.begin();itBuff!=buffers.end();itBuff++) pending|=itBuff->second->checkBuffer() ; + return pending ; + } + + void CContextClient::releaseBuffers(void) + { + map::iterator itBuff ; + for(itBuff=buffers.begin();itBuff!=buffers.end();itBuff++) delete itBuff->second ; + } + + bool CContextClient::checkBuffers(list& ranks) + { + list::iterator it ; + bool pending=false ; + for(it=ranks.begin();it!=ranks.end();it++) pending|=buffers[*it]->checkBuffer() ; + return pending ; + } + + int CContextClient::getServerLeader(void) + { + int clientByServer=clientSize/serverSize ; + int remain=clientSize%serverSize ; + + if (clientRank<(clientByServer+1)*remain) + { + return clientRank/(clientByServer+1) ; + } + else + { + int rank=clientRank-(clientByServer+1)*remain ; + int nbServer=serverSize-remain ; + return remain+rank/clientByServer ; + } + } + + bool CContextClient::isServerLeader(void) + { + int clientByServer=clientSize/serverSize ; + int remain=clientSize%serverSize ; + + if (clientRank<(clientByServer+1)*remain) + { + if (clientRank%(clientByServer+1)==0) return true ; + else return false ; + } + else + { + int rank=clientRank-(clientByServer+1)*remain ; + int nbServer=serverSize-remain ; + if (rank%clientByServer==0) return true ; + else return false ; + } + } + + void CContextClient::finalize(void) + { + + map::iterator itBuff ; + bool stop=true ; + + CEventClient event(CContext::GetType(),CContext::EVENT_ID_CONTEXT_FINALIZE) ; + if (isServerLeader()) + { + CMessage msg ; + event.push(getServerLeader(),1,msg) ; + sendEvent(event) ; + } + else sendEvent(event) ; + + CTimer::get("Blocking time").resume(); + while(stop) + { + checkBuffers() ; + stop=false ; + for(itBuff=buffers.begin();itBuff!=buffers.end();itBuff++) stop|=itBuff->second->hasPendingRequest() ; + } + CTimer::get("Blocking time").suspend(); + report(0)<< " Memory report : Context <"<getId()<<"> : client side : total memory used for buffer "< newEvent(CEventClient& event,list& sizes) ; + void sendEvent(CEventClient& event) ; + + list getBuffers(list& serverlist, list& sizeList) ; + void newBuffer(int rank) ; + size_t timeLine ; + int clientRank ; + int clientSize ; + int serverSize ; +// set connectedServer ; + MPI_Comm interComm ; + MPI_Comm intraComm ; + map buffers ; + bool checkBuffers(list& ranks) ; + bool checkBuffers(void); + void releaseBuffers(void); + void closeContext(void) ; + bool isServerLeader(void) ; + int getServerLeader(void) ; + void finalize(void) ; + void waitEvent(list& ranks) ; + + CContext* context ; +// bool locked ; + + } ; + + + + +} + + + +#endif diff --git a/src/context_server.cpp b/src/context_server.cpp new file mode 100644 index 0000000..abb7484 --- /dev/null +++ b/src/context_server.cpp @@ -0,0 +1,224 @@ +#include "context_server.hpp" +#include "buffer_in.hpp" +#include "type.hpp" +#include "context.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "attribute_template.hpp" +#include "domain.hpp" +#include "field.hpp" +#include "file.hpp" +#include "grid.hpp" +#include "mpi.hpp" +#include "tracer.hpp" +#include "timer.hpp" +#include "cxios.hpp" +#include "event_scheduler.hpp" +#include "server.hpp" +#include + + + +namespace xios +{ + + CContextServer::CContextServer(CContext* parent,MPI_Comm intraComm_,MPI_Comm interComm_) + { + context=parent ; + intraComm=intraComm_ ; + MPI_Comm_size(intraComm,&intraCommSize) ; + MPI_Comm_rank(intraComm,&intraCommRank) ; + interComm=interComm_ ; + int flag ; + MPI_Comm_test_inter(interComm,&flag) ; + if (flag) MPI_Comm_remote_size(interComm,&commSize); + else MPI_Comm_size(interComm,&commSize) ; + currentTimeLine=0 ; + scheduled=false ; + finished=false ; + + boost::hash hashString ; + hashId=hashString(context->getId()) ; + + } + void CContextServer::setPendingEvent(void) + { + pendingEvent=true ; + } + + bool CContextServer::hasPendingEvent(void) + { + return pendingEvent ; + } + + bool CContextServer::eventLoop(void) + { + listen() ; + checkPendingRequest() ; + processEvents() ; + return finished ; + } + + void CContextServer::listen(void) + { + int rank; + int flag ; + int count ; + char * addr ; + MPI_Status status; + map::iterator it; + + for(rank=0;rank(rank,new CServerBuffer))).first ; + MPI_Get_count(&status,MPI_CHAR,&count) ; + if (it->second->isBufferFree(count)) + { + addr=(char*)it->second->getBuffer(count) ; + MPI_Irecv(addr,count,MPI_CHAR,rank,20,interComm,&pendingRequest[rank]) ; + bufferRequest[rank]=addr ; + } + } + } + } + } + + void CContextServer::checkPendingRequest(void) + { + map::iterator it; + list recvRequest ; + list::iterator itRecv; + int rank ; + int flag ; + int count ; + MPI_Status status ; + + for(it=pendingRequest.begin();it!=pendingRequest.end();it++) + { + rank=it->first ; + traceOff() ; + MPI_Test(& it->second, &flag, &status) ; + traceOn() ; + if (flag==true) + { + recvRequest.push_back(rank) ; + MPI_Get_count(&status,MPI_CHAR,&count) ; + processRequest(rank,bufferRequest[rank],count) ; + } + } + + for(itRecv=recvRequest.begin();itRecv!=recvRequest.end();itRecv++) + { + pendingRequest.erase(*itRecv) ; + bufferRequest.erase(*itRecv) ; + } + } + + void CContextServer::processRequest(int rank, char* buff,int count) + { + + CBufferIn buffer(buff,count) ; + char* startBuffer,endBuffer ; + int size, offset ; + size_t timeLine ; + map::iterator it ; + + while(count>0) + { + char* startBuffer=(char*)buffer.ptr() ; + CBufferIn newBuffer(startBuffer,buffer.remain()) ; + newBuffer>>size>>timeLine ; + + it=events.find(timeLine) ; + if (it==events.end()) it=events.insert(pair(timeLine,new CEventServer)).first ; + it->second->push(rank,buffers[rank],startBuffer,size) ; + + buffer.advance(size) ; + count=buffer.remain() ; + } + + } + + void CContextServer::processEvents(void) + { + map::iterator it ; + CEventServer* event ; + + it=events.find(currentTimeLine) ; + if (it!=events.end()) + { + event=it->second ; + + if (event->isFull()) + { + if (!scheduled && !CXios::isServer) + { + CServer::eventScheduler->registerEvent(currentTimeLine,hashId) ; + scheduled=true ; + } + else if (CXios::isServer || CServer::eventScheduler->queryEvent(currentTimeLine,hashId) ) + { + CTimer::get("Process events").resume() ; + dispatchEvent(*event) ; + CTimer::get("Process events").suspend() ; + pendingEvent=false ; + delete event ; + events.erase(it) ; + currentTimeLine++ ; + scheduled = false ; + } + } + } + } + + CContextServer::~CContextServer() + { + map::iterator it ; + for(it=buffers.begin();it!=buffers.end();++it) delete it->second ; + } + + + void CContextServer::dispatchEvent(CEventServer& event) + { + string contextName ; + string buff ; + int MsgSize ; + int rank ; + list::iterator it ; + CContext::setCurrent(context->getId()) ; + + if (event.classId==CContext::GetType() && event.type==CContext::EVENT_ID_CONTEXT_FINALIZE) + { + info(20)<<"Server Side context <"<getId()<<"> finalized"<finalize() ; + finished=true ; + report(0)<< " Memory report : Context <"<getId()<<"> : server side : total memory used for buffer "< buffers ; + map pendingRequest ; + map bufferRequest ; + + map events ; + size_t currentTimeLine ; + CContext* context ; + + bool finished ; + bool pendingEvent ; + bool scheduled ; /*!< event of current timeline is alreading scheduled ? */ + size_t hashId ; + ~CContextServer() ; + } ; + +} + +#endif diff --git a/src/cxios.cpp b/src/cxios.cpp new file mode 100644 index 0000000..c4368ae --- /dev/null +++ b/src/cxios.cpp @@ -0,0 +1,115 @@ + +#include "xmlioserver_spl.hpp" +#include "cxios.hpp" +#include "client.hpp" +#include "server.hpp" +#include "xml_parser.hpp" +#include +#include "mpi.hpp" +#include "memory.hpp" +#include +#include "memtrack.hpp" + +namespace xios +{ + string CXios::rootFile="./iodef.xml" ; + string CXios::xiosCodeId="xios.x" ; + string CXios::clientFile="./xios_client"; + string CXios::serverFile="./xios_server"; + + bool CXios::isClient ; + bool CXios::isServer ; + MPI_Comm CXios::globalComm ; + bool CXios::usingOasis ; + bool CXios::usingServer = false; + size_t CXios::bufferSize ; + double CXios::bufferServerFactorSize=2 ; + size_t CXios::defaultBufferSize=1024*1024*100 ; // 100Mo + double CXios::defaultBufferServerFactorSize=2 ; + bool CXios::printInfo2File; + bool CXios::isServerSide; + + + void CXios::initialize() + { + set_new_handler(noMemory); + parseFile(rootFile); + usingOasis=getin("using_oasis",false) ; + info.setLevel(getin("info_level",0)) ; + printInfo2File=getin("print_file",false); + bufferSize=getin("buffer_size",defaultBufferSize) ; + bufferServerFactorSize=getin("buffer_server_factor_size",defaultBufferServerFactorSize) ; + globalComm=MPI_COMM_WORLD ; + } + + + void CXios::initClientSide(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm) + { + + initialize() ; + + isClient=true; + + CClient::initialize(codeId,localComm,returnComm) ; + + if (usingServer) isServerSide = isServer=false; + else isServerSide = isServer=true; + + if (printInfo2File) + CClient::openInfoStream(clientFile); + else + CClient::openInfoStream(); + } + + void CXios::clientFinalize(void) + { + CClient::finalize() ; + CClient::closeInfoStream(); + +#ifdef XIOS_MEMTRACK + MemTrack::TrackListMemoryUsage() ; + MemTrack::TrackDumpBlocks(); +#endif + } + + + void CXios::initServerSide(void) + { + initialize(); + + isClient=true; + isServer=false ; + + isServerSide = true; + + // Initialize all aspects MPI + CServer::initialize(); + + if (printInfo2File) + CServer::openInfoStream(serverFile); + else + CServer::openInfoStream(); + + // Enter the loop to listen message from Client + CServer::eventLoop(); + + // Finalize + CServer::finalize(); + CServer::closeInfoStream(); + } + + void CXios::parseFile(const string& filename) + { + xml::CXMLParser::ParseFile(filename); + } + + void CXios::setUsingServer() + { + usingServer = true; + } + + void CXios::setNotUsingServer() + { + usingServer = false; + } +} diff --git a/src/cxios.hpp b/src/cxios.hpp new file mode 100644 index 0000000..55e25f1 --- /dev/null +++ b/src/cxios.hpp @@ -0,0 +1,69 @@ +#ifndef __XIOS_HPP__ +#define __XIOS_HPP__ + +#include "xmlioserver_spl.hpp" +#include "mpi.hpp" + +namespace xios +{ + class CXios + { + public: + + static string rootFile ; + static string xiosCodeId ; + static string clientFile; + static string serverFile; + + static void initialize(void) ; + + + static void initClientSide(const string & codeId, MPI_Comm& localComm, MPI_Comm& returnComm) ; + static void initServerSide(void) ; + static void clientFinalize(void) ; + static void parseFile(const string& filename) ; + + template + static T getin(const string& id,const T& defaultValue) ; + + template + static T getin(const string& id) ; + + static bool isClient ; + static bool isServer ; + + static MPI_Comm globalComm ; + + static bool printInfo2File; + static bool usingOasis ; + static bool usingServer ; + static size_t bufferSize ; + static size_t defaultBufferSize ; + static double bufferServerFactorSize ; + static double defaultBufferServerFactorSize ; + + public: + //! Setting xios to use server mode + static void setUsingServer(); + + //! Setting xios NOT to use server mode + static void setNotUsingServer(); + + //! A silly variable to detect whether one process is in client or server side. Should be removed on refactoring code + static bool isServerSide; + + } ; + +} + +//#include "cxios_impl.hpp" + + + + + + + + + +#endif diff --git a/src/cxios_decl.cpp b/src/cxios_decl.cpp new file mode 100644 index 0000000..4b9c53a --- /dev/null +++ b/src/cxios_decl.cpp @@ -0,0 +1,16 @@ +#include "cxios_impl.hpp" +#include "xmlioserver_spl.hpp" +#include + +namespace xios +{ +# define macro(T) \ + template T CXios::getin(const string& id) ; \ + template T CXios::getin(const string& id, const T& defaultValue) ; + + macro(int) + macro(double) + macro(bool) + macro(StdSize) + macro(string) +} diff --git a/src/cxios_impl.hpp b/src/cxios_impl.hpp new file mode 100644 index 0000000..ab98145 --- /dev/null +++ b/src/cxios_impl.hpp @@ -0,0 +1,26 @@ +#ifndef __XIOS_IMPL_HPP__ +#define __XIOS_IMPL_HPP__ + +#include "xmlioserver_spl.hpp" +#include "variable.hpp" +#include "object_template.hpp" +#include "cxios.hpp" + +namespace xios +{ + template + T CXios::getin(const string& id) + { + return CVariable::get("xios",id)->getData() ; + } + + template + T CXios::getin(const string& id, const T& defaultValue) + { + if (CVariable::has("xios",id)) return CVariable::get("xios",id)->getData() ; + else return defaultValue ; + } + + +} +#endif diff --git a/src/data_output.cpp b/src/data_output.cpp new file mode 100644 index 0000000..db5e52c --- /dev/null +++ b/src/data_output.cpp @@ -0,0 +1,104 @@ +#include "data_output.hpp" + +#include "attribute_template.hpp" +#include "group_template.hpp" +#include "context.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CDataOutput::~CDataOutput(void) + { /* Ne rien faire de plus */ } + + //---------------------------------------------------------------- + + void CDataOutput::writeGrid(CGrid* grid) + { + if (grid->domain_ref.isEmpty()) + ERROR("CDataOutput::writeGrid(grid)", + << " domain is not defined !"); + + if (grid->axis_ref.isEmpty()) + { + this->writeGrid(CDomain::get(grid->domain_ref.getValue())); + } + else + { + this->writeGrid(CDomain::get(grid->domain_ref.getValue()), + CAxis::get(grid->axis_ref.getValue())); + } + } + + //---------------------------------------------------------------- + + void CDataOutput::writeFile(CFile* file) + { + this->writeFile_(file); + } + + void CDataOutput::writeAttribute(CVariable* var) + { + this->writeAttribute_(var) ; + } + + void CDataOutput::syncFile(void) + { + this->syncFile_(); + } + + void CDataOutput::closeFile(void) + { + this->closeFile_(); + } + + //---------------------------------------------------------------- + + void CDataOutput::writeGrid(CDomain* domain,CAxis* axis) + { + this->writeDomain_(domain); + this->writeAxis_(axis); + } + + //---------------------------------------------------------------- + + void CDataOutput::writeGrid(CDomain* domain) + { + this->writeDomain_(domain); + } + + void CDataOutput::writeTimeDimension(void) + { + this->writeTimeDimension_(); + } + + //---------------------------------------------------------------- + + void CDataOutput::writeField(CField* field) + { + CContext* context = CContext::getCurrent() ; + boost::shared_ptr calendar = context->getCalendar(); + + this->writeField_(field); + this->writeTimeAxis_(field, calendar); + } + + //---------------------------------------------------------------- + + void CDataOutput::writeFieldGrid(CField* field) + { + this->writeGrid(field->getRelGrid()); + } + + //---------------------------------------------------------------- + + void CDataOutput::writeFieldData(CField* field) + { + CGrid* grid = CGrid::get(field->grid_ref.getValue()); + CDomain* domain = CDomain::get(grid->domain_ref.getValue()); + this->writeFieldData_(field); + } + + ///---------------------------------------------------------------- + +} // namespace xios diff --git a/src/data_output.hpp b/src/data_output.hpp new file mode 100644 index 0000000..4f21dd6 --- /dev/null +++ b/src/data_output.hpp @@ -0,0 +1,63 @@ +#ifndef __XMLIO_DATA_OUTPUT__ +#define __XMLIO_DATA_OUTPUT__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "grid.hpp" +#include "field.hpp" + + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CDataOutput + { + public : + + /// Définition de type /// + typedef enum { ONE_FILE = 0, MULTI_GROUP, MULTI_FILE } EDataOutputType; + + /// Ecriture /// + void writeFile (CFile* file); + void writeAttribute(CVariable* var); + void syncFile (void); + void closeFile (void); + void writeField (CField* field); + void writeFieldGrid(CField* field); + void writeTimeDimension(void); + void writeFieldData(CField* field); + + virtual void definition_start(void) = 0; + virtual void definition_end(void) = 0; + + virtual ~CDataOutput(void); + + protected: + + /// Ecriture /// + void writeGrid(CGrid* grid); + void writeGrid(CDomain* domain, + CAxis* axis); + void writeGrid(CDomain* domain); + + virtual void writeFile_ (CFile* file) = 0; + virtual void writeAttribute_(CVariable* var) = 0 ; + virtual void closeFile_ (void) = 0; + virtual void syncFile_ (void) = 0; + virtual void writeField_ (CField* field) = 0; + virtual void writeFieldData_ (CField* field) = 0; + virtual void writeDomain_ (CDomain* domain) = 0; + virtual void writeTimeDimension_ (void) = 0; + virtual void writeAxis_ (CAxis* axis) = 0; + virtual void writeTimeAxis_ (CField* field, + const shared_ptr cal) = 0; + + /// Propriétés protégées /// + EDataOutputType type; + + }; // class CDataOutput + +} // namespace xios + +#endif //__XMLIO_DATA_OUTPUT__ diff --git a/src/date.cpp b/src/date.cpp new file mode 100644 index 0000000..bd636f1 --- /dev/null +++ b/src/date.cpp @@ -0,0 +1,297 @@ +#include "date.hpp" +#include "calendar.hpp" +#include "calendar_type.hpp" +#include +#include + +using namespace boost::posix_time ; +using namespace boost::gregorian ; + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CDate::CDate(const CCalendar& calendar) + : relCalendar(calendar) + , year(0), month(1) , day(1) + , hour(0), minute(0), second(0) + { } + + CDate::CDate(const CCalendar& calendar, + int yr, int mth, int d, + int hr, int min, int sec) + : relCalendar(calendar) + , year(yr), month(mth) , day(d) + , hour(hr), minute(min), second(sec) + { + if(!this->checkDate()) + { + DEBUG(<< "La date initialisée a été modifiée " + << "car elle était incorrecte par rapport au calendrier souhaité."); + } + } + + CDate::CDate(const CDate & date) + : relCalendar(date.getRelCalendar()), + year(date.year), month(date.month) , day(date.day), + hour(date.hour), minute(date.minute), second(date.second) + { + if(!this->checkDate()) + { + DEBUG(<< "La date initialisée a été modifiée " + << "car elle était incorrecte par rapport au calendrier souhaité."); + } + } + + CDate::~CDate(void) + { /* Ne rien faire de plus */ } + + ///--------------------------------------------------------------- + + CDate & CDate::operator=(const CDate & date) + { + // relCalendar = d.getRelCalendar(); << inutile si fonction bien utilisée + year = date.year; month = date.month ; day = date.day; + hour = date.hour; minute = date.minute; second = date.second; + return (*this); + } + + StdOStream & operator<<(StdOStream & out, const CDate & date) + { + std::streamsize s ; + char c ; + + + int width=4 ; + double maxSize=10000 ; + while(date.year>=maxSize) + { + maxSize*=10 ; + width++ ; + } + s = out.width (width); c = out.fill ('0') ; out << date.year << '-'; + + s = out.width (2); c = out.fill ('0') ; out << date.month << '-'; + s = out.width (2); c = out.fill ('0') ; out << date.day << ' '; + s = out.width (2); c = out.fill ('0') ; out << date.hour << ':'; + s = out.width (2); c = out.fill ('0') ; out << date.minute << ':'; + s = out.width (2); c = out.fill ('0') ; out << date.second ; + + return (out); + } + + StdIStream & operator>>(StdIStream & in, CDate & date) // Non testée. + { + char sep = '-'; // Le caractère c est utilisé pour "recueillir" les séparateurs "/" et ":". + char c ; + + in >> date.year >> c ; + if (c==sep) + { + in >> date.month >> c ; + if (c==sep) + { + in >> date.day ; + c=in.get(); + sep=' ' ; + if (c==sep) + { + in >> date.hour >> c ; + sep=':' ; + if (c==sep) + { + in>>date.minute >> c; + if (c==sep) + { + in>>date.second ; + if(!date.checkDate()) + ERROR("StdIStream & operator >> (StdIStream & in, CDate & date)",<<"Bad date format or not conform to calendar" ); + return (in); + } + } + } + } + } + ERROR("StdIStream & operator >> (StdIStream & in, CDate & date)",<<"Bad date format or not conform to calendar" ); + return (in); + } + + CDate::operator Time(void) const // Non vérifiée, pas optimisée ... + { + // Todo : Tester si la date courante est supérieure à la date initiale. + Time retvalue = - relCalendar.getNbSecond(relCalendar.getInitDate()) + + relCalendar.getNbSecond(*this); + + if ((relCalendar.getId().compare("D360") == 0) || + (relCalendar.getId().compare("AllLeap") == 0) || + (relCalendar.getId().compare("NoLeap") == 0)) + return (retvalue + (getYear() - relCalendar.getTimeOrigin().getYear()) + * relCalendar.getYearTotalLength(*this)); + + for(CDate _d(relCalendar.getTimeOrigin()); + _d.getYear() < getYear(); _d.setYear(_d.getYear()+1)) + retvalue += relCalendar.getYearTotalLength(_d); + return (retvalue); + } + + //---------------------------------------------------------------- + + bool CDate::checkDate(void) + { + bool retValue = true; + + // Vérificatio de la valeur du mois. + if (month < 1) { retValue = false; month = 1; } + if (month > relCalendar.getYearLength()) + { retValue = false; month = relCalendar.getYearLength(); } + + // Vérification de la valeur du jour. + if (day < 1) { retValue = false; month = 1; } + if (day > (&relCalendar)->getMonthLength(*this)) + { retValue = false; day = (&relCalendar)->getMonthLength(*this); } + + // Vérification de la valeur de l'heure. + if (hour < 0) { retValue = false; hour = 0; } + if (hour >= relCalendar.getDayLength()) + { retValue = false; hour = relCalendar.getDayLength()-1; } + + // Vérification de la valeur des minutes. + if (minute < 0) { retValue = false; minute = 0; } + if (minute >= relCalendar.getHourLength()) + { retValue = false; minute = relCalendar.getHourLength()-1; } + + // Vérification de la valeur des secondes. + if (second < 0) { retValue = false; month = 0; } + if (second >= relCalendar.getMinuteLength()) + { retValue = false; second = relCalendar.getMinuteLength()-1; } + + return retValue; + } + + //---------------------------------------------------------------- + + int CDate::getYear (void) const { return (this->year ); } + int CDate::getMonth (void) const { return (this->month ); } + int CDate::getDay (void) const { return (this->day ); } + int CDate::getHour (void) const { return (this->hour ); } + int CDate::getMinute(void) const { return (this->minute); } + int CDate::getSecond(void) const { return (this->second); } + + //---------------------------------------------------------------- + + const CCalendar & CDate::getRelCalendar(void) const + { return (this->relCalendar); } + + //---------------------------------------------------------------- + + void CDate::setYear (int newyear) { this->year = newyear; } + void CDate::setMonth (int newmonth) { this->month = newmonth; } + void CDate::setDay (int newday) { this->day = newday; } + + //---------------------------------------------------------------- + + void CDate::addMonth (int value) + {// Value doit être égale à 1 ou -1. + this->month += value; + if (this->month == 13) { year++; this->month = 1 ; } + if (this->month == 0 ) { year--; this->month = 12; } + } + + //---------------------------------------------------------------- + + CDate CDate::FromString(const StdString & str, const CCalendar & calendar) + { + CDate dt(calendar); + StdIStringStream iss(str); + iss >> dt; + return dt; + } + + //---------------------------------------------------------------- + + StdString CDate::getStryyyymmdd(void) const + { + std::streamsize s ; + char c ; + + ostringstream oss ; + + s = oss.width (4); c = oss.fill ('0') ; oss << year ; + s = oss.width (2); c = oss.fill ('0') ; oss << month; + s = oss.width (2); c = oss.fill ('0') ; oss << day ; + + return oss.str(); + } + + + string CDate::getStr(const string& str) const + { + ostringstream oss ; + int level; + + level=0 ; + for(string::const_iterator it=str.begin();it!=str.end();++it) + { + if (level==0) + { + if (*it=='%') level++ ; + else oss<<*it ; + } + else if (level==1) + { + switch (*it) + { + case 'y' : + oss.width (4); oss.fill ('0') ; oss << year ; + level=0 ; + break ; + case 'm' : // month or minute + level++ ; + break ; + case 'd' : + oss.width (2); oss.fill ('0') ; oss << day ; + level=0; + break ; + case 'h' : + oss.width (2); oss.fill ('0') ; oss << hour ; + level=0; + break ; + case 's' : + oss.width (2); oss.fill ('0') ; oss << second ; + level=0 ; + break; + default : + oss<<'%'<<*it ; + level=0 ; + } + } + else if (level==2) + { + switch (*it) + { + case 'o' : // month + oss.width (2); oss.fill ('0') ; oss << month ; + level=0 ; + break ; + case 'i' : //minute + oss.width (2); oss.fill ('0') ; oss << minute ; + level=0 ; + break ; + default : + oss<<"%m"<<*it ; + level=0 ; + } + } + } + return oss.str(); + } + + StdString CDate::toString(void) const + { + StdOStringStream oss; + oss << (*this); + return (oss.str()); + } + + ///--------------------------------------------------------------- + +} // namespace xios diff --git a/src/date.hpp b/src/date.hpp new file mode 100644 index 0000000..b0d11b1 --- /dev/null +++ b/src/date.hpp @@ -0,0 +1,77 @@ +#ifndef __XMLIO_CDate__ +#define __XMLIO_CDate__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "duration.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CCalendar; + + class CDate + { + public : + + /// Constructeurs /// + CDate(void); // Not implemented yet + CDate(const CCalendar & cal); + CDate(const CCalendar & cal,int yr, int mth, int d, + int hr = 0, int min = 0, int sec = 0); + CDate(const CDate & odate); + CDate(const CDate * const odate); // Not implemented yet + + /// Destructeur /// + ~CDate(void); + + /// Opérateurs /// + CDate & operator=(const CDate & date); + friend StdOStream & operator<<(StdOStream & out, const CDate & date); + friend StdIStream & operator>>(StdIStream & in, CDate & date); // Non testée. + + operator Time(void) const; // Retourne le nombre de secondes écoulées depuis la date d'origine définie dans le calendrier. + + /// Traitements /// + bool checkDate(void); // Vérifie la validité de la date. + + /// Divers accesseurs /// + int getYear (void) const; + int getMonth (void) const; + int getDay (void) const; + int getHour (void) const; + int getMinute(void) const; + int getSecond(void) const; + + const CCalendar & getRelCalendar(void) const; + + /// Mutateurs /// + void setYear (int newyear); + void setMonth (int newmonth); + void setDay (int newday); + + void addMonth (int value); + + /// Autres /// + StdString toString(void) const; + StdString getStryyyymmdd(void) const; + string getStr(const string& str) const; + + + public : /* static */ + + static CDate FromString(const StdString & str, const CCalendar & calendar); + + private : + + /// Propriétés privées /// + const CCalendar & relCalendar; // Calendrier lié à la Date. + int year, month, day, hour, minute, second; // Année, mois, ... + + + }; // class CDate; + +} // namespace xios + +#endif // __XMLIO_CDate__ diff --git a/src/date/allleap.cpp b/src/date/allleap.cpp new file mode 100644 index 0000000..5919ef1 --- /dev/null +++ b/src/date/allleap.cpp @@ -0,0 +1,39 @@ +#include "allleap.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CAllLeapCalendar::CAllLeapCalendar(const StdString & dateStr) + : CCalendar("AllLeap") + { initializeDate(dateStr); } + + CAllLeapCalendar::CAllLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr) + : CCalendar("AllLeap") + { initializeDate(dateStr, timeOriginStr); } + + CAllLeapCalendar::CAllLeapCalendar(int yr, int mth, int d, + int hr, int min, int sec) + : CCalendar("AllLeap") + { initializeDate(yr, mth, d, hr, min, sec) ; } + + CAllLeapCalendar::~CAllLeapCalendar(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + int CAllLeapCalendar::getYearTotalLength(const CDate & date) const + { return (366 * 86400); } + + int CAllLeapCalendar::getMonthLength(const CDate & date) const + { + if (date.getMonth() == 2) return (29); + return (CCalendar::getMonthLength(date)); + } + + StdString CAllLeapCalendar::getType(void) const + { return (StdString("all_leap")); } + + ///-------------------------------------------------------------- +} // namespace xmlioserver + diff --git a/src/date/allleap.hpp b/src/date/allleap.hpp new file mode 100644 index 0000000..5493e15 --- /dev/null +++ b/src/date/allleap.hpp @@ -0,0 +1,39 @@ +#ifndef __XMLIO_CAllLeapCalendar__ +#define __XMLIO_CAllLeapCalendar__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CAllLeapCalendar : public CCalendar + { + /// Typedef /// + typedef CCalendar SuperClass; + + public : + + /// Constructeur /// +// CAllLeapCalendar(void); // Not implemented yet. + CAllLeapCalendar(const StdString & dateStr); + CAllLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr); + CAllLeapCalendar(int yr = 0, int mth = 1, int d = 1, + int hr = 0, int min = 0, int sec = 0); + CAllLeapCalendar(const CAllLeapCalendar & calendar); // Not implemented yet. + CAllLeapCalendar(const CAllLeapCalendar * calendar); // Not implemented yet. + + /// Accesseurs /// + virtual int getYearTotalLength(const CDate & date) const; + virtual int getMonthLength(const CDate & date) const; + virtual StdString getType(void) const; + + /// Destructeur /// + virtual ~CAllLeapCalendar(void); + + }; // class CAllLeapCalendar + +} // namespace xmlioserver + +#endif // __XMLIO_CAllLeapCalendar__ diff --git a/src/date/calendar_type.hpp b/src/date/calendar_type.hpp new file mode 100644 index 0000000..34d8ad8 --- /dev/null +++ b/src/date/calendar_type.hpp @@ -0,0 +1,10 @@ +#ifndef __XMLIO_calendar_type__ +#define __XMLIO_calendar_type__ + +#include "allleap.hpp" +#include "d360.hpp" +#include "gregorian.hpp" +#include "julian.hpp" +#include "noleap.hpp" + +#endif //__XMLIO_calendar_type__ diff --git a/src/date/d360.cpp b/src/date/d360.cpp new file mode 100644 index 0000000..5536635 --- /dev/null +++ b/src/date/d360.cpp @@ -0,0 +1,36 @@ +#include "d360.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CD360Calendar::CD360Calendar(const StdString & dateStr) + : CCalendar("D360") + { initializeDate(dateStr); } + + CD360Calendar::CD360Calendar(const StdString & dateStr,const StdString & timeOriginStr) + : CCalendar("D360", dateStr) + { initializeDate(dateStr, timeOriginStr); } + + CD360Calendar::CD360Calendar(int yr, int mth, int d, + int hr, int min, int sec) + : CCalendar("D360") + { initializeDate(yr, mth, d, hr, min, sec) ; } + + CD360Calendar::~CD360Calendar(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + int CD360Calendar::getYearTotalLength(const CDate & date) const + { return (360 * 86400); } + + int CD360Calendar::getMonthLength(const CDate & date) const + { return (30); } + + StdString CD360Calendar::getType(void) const + { return (StdString("360_day")); } + + ///-------------------------------------------------------------- +} // namespace xmlioserver + diff --git a/src/date/d360.hpp b/src/date/d360.hpp new file mode 100644 index 0000000..982b068 --- /dev/null +++ b/src/date/d360.hpp @@ -0,0 +1,40 @@ +#ifndef __XMLIO_CD360Calendar__ +#define __XMLIO_CD360Calendar__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CD360Calendar : public CCalendar + { + /// Typedef /// + typedef CCalendar SuperClass; + + public : + + /// Constructeur /// + CD360Calendar(void); // Not implemented yet. + CD360Calendar(const StdString & dateStr); + CD360Calendar(const StdString & dateStr,const StdString & timeOriginStr); + CD360Calendar(int yr = 0, int mth = 1, int d = 1, + int hr = 0, int min = 0, int sec = 0); + CD360Calendar(const CD360Calendar & calendar); // Not implemented yet. + CD360Calendar(const CD360Calendar * calendar); // Not implemented yet. + + /// Accesseurs /// + virtual int getYearTotalLength(const CDate & date) const; + virtual int getMonthLength(const CDate & date) const; + virtual StdString getType(void) const; + + /// Destructeur /// + virtual ~CD360Calendar(void); + + }; // class CD360Calendar + +} // namespace xmlioserver + +#endif // __XMLIO_CD360Calendar__ + diff --git a/src/date/gregorian.cpp b/src/date/gregorian.cpp new file mode 100644 index 0000000..f522499 --- /dev/null +++ b/src/date/gregorian.cpp @@ -0,0 +1,52 @@ +#include "gregorian.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CGregorianCalendar::CGregorianCalendar(const StdString & dateStr) + : CCalendar("Gregorian") + { initializeDate(dateStr); } + + CGregorianCalendar::CGregorianCalendar(const StdString & dateStr,const StdString & timeOriginStr) + : CCalendar("Gregorian") + { initializeDate(dateStr, timeOriginStr); } + + CGregorianCalendar::CGregorianCalendar(int yr, int mth, int d, + int hr, int min, int sec) + : CCalendar("Gregorian") + { initializeDate(yr, mth, d, hr, min, sec) ; } + + CGregorianCalendar::~CGregorianCalendar(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + int CGregorianCalendar::getYearTotalLength(const CDate & date) const + { // Retourne la durée d'une année en seconde. + if ((date.getYear() % 4 == 0) && + ((date.getYear() % 100 != 0) || + (date.getYear() % 400 == 0) )) + return (366 * 86400); + return (365 * 86400); + } + + int CGregorianCalendar::getMonthLength(const CDate & date) const + { // Retourne la durée du mois en jour. + if (date.getMonth() == 2) + { // Traitement du cas particulier en Février. + if ((date.getYear() % 4 == 0) && + ((date.getYear() % 100 != 0) || + (date.getYear() % 400 == 0) )) + return (29); + return (28); + } + return (CCalendar::getMonthLength(date)); + } + + StdString CGregorianCalendar::getType(void) const + { return (StdString("gregorian")); } + + ///-------------------------------------------------------------- +} // namespace xmlioserver + diff --git a/src/date/gregorian.hpp b/src/date/gregorian.hpp new file mode 100644 index 0000000..b6a9ff4 --- /dev/null +++ b/src/date/gregorian.hpp @@ -0,0 +1,39 @@ +#ifndef __XMLIO_CGregorianCalendar__ +#define __XMLIO_CGregorianCalendar__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CGregorianCalendar : public CCalendar + { + /// Typedef /// + typedef CCalendar SuperClass; + + public : + + /// Constructeur /// +// CGregorianCalendar(void); // Not implemented yet. + CGregorianCalendar(const StdString & dateStr); + CGregorianCalendar(const StdString & dateStr,const StdString & timeOriginStr); + CGregorianCalendar(int yr = 0, int mth = 1, int d = 1, + int hr = 0, int min = 0, int sec = 0); + CGregorianCalendar(const CGregorianCalendar & calendar); // Not implemented yet. + CGregorianCalendar(const CGregorianCalendar * calendar); // Not implemented yet. + + /// Accesseurs /// + virtual int getYearTotalLength(const CDate & date) const; + virtual int getMonthLength(const CDate & date) const; + virtual StdString getType(void) const; + + /// Destructeur /// + virtual ~CGregorianCalendar(void); + + }; // class CGregorianCalendar + +} // namespace xmlioserver + +#endif // __XMLIO_CGregorianCalendar__ diff --git a/src/date/julian.cpp b/src/date/julian.cpp new file mode 100644 index 0000000..0d5bb6f --- /dev/null +++ b/src/date/julian.cpp @@ -0,0 +1,45 @@ +#include "julian.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CJulianCalendar::CJulianCalendar(const StdString & dateStr) + : CCalendar("Julian") + { initializeDate(dateStr); } + + CJulianCalendar::CJulianCalendar(const StdString & dateStr,const StdString & timeOriginStr) + : CCalendar("Julian") + { initializeDate(dateStr, timeOriginStr); } + + CJulianCalendar::CJulianCalendar(int yr, int mth, int d, + int hr, int min, int sec) + : CCalendar("Julian") + { initializeDate(yr, mth, d, hr, min, sec) ; } + + CJulianCalendar::~CJulianCalendar(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + int CJulianCalendar::getYearTotalLength(const CDate & date) const + { // Retourne la durée d'une année en seconde. + if (date.getYear() % 4 == 0) return (366 * 86400); + return (365 * 86400); + } + + int CJulianCalendar::getMonthLength(const CDate & date) const + { // Retourne la durée du mois en jour. + if (date.getMonth() == 2) + { + if (date.getYear()%4 == 0) return 29; + return 28; + } + return (CCalendar::getMonthLength(date)); + } + + StdString CJulianCalendar::getType(void) const + { return (StdString("julian")); } + + ///-------------------------------------------------------------- +} // namespace xmlioserver diff --git a/src/date/julian.hpp b/src/date/julian.hpp new file mode 100644 index 0000000..ee03904 --- /dev/null +++ b/src/date/julian.hpp @@ -0,0 +1,39 @@ +#ifndef __XMLIO_CJulianCalendar__ +#define __XMLIO_CJulianCalendar__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CJulianCalendar : public CCalendar + { + /// Typedef /// + typedef CCalendar SuperClass; + + public : + + /// Constructeur /// +// CJulianCalendar(void); // Not implemented yet. + CJulianCalendar(const StdString & dateStr); + CJulianCalendar(const StdString & dateStr,const StdString & timeOriginStr); + CJulianCalendar(int yr = 0, int mth = 1, int d = 1, + int hr = 0, int min = 0, int sec = 0); + CJulianCalendar(const CJulianCalendar & calendar); // Not implemented yet. + CJulianCalendar(const CJulianCalendar * calendar); // Not implemented yet. + + /// Accesseurs /// + virtual int getYearTotalLength(const CDate & date) const; + virtual int getMonthLength(const CDate & date) const; + virtual StdString getType(void) const; + + /// Destructeur /// + virtual ~CJulianCalendar(void); + + }; // class CJulianCalendar + +} // namespace xmlioserver + +#endif // __XMLIO_CJulianCalendar__ diff --git a/src/date/noleap.cpp b/src/date/noleap.cpp new file mode 100644 index 0000000..f8cf5f4 --- /dev/null +++ b/src/date/noleap.cpp @@ -0,0 +1,32 @@ +#include "noleap.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CNoLeapCalendar::CNoLeapCalendar(const StdString & dateStr) + : CCalendar("NoLeap", dateStr) + { initializeDate(dateStr); } + + CNoLeapCalendar::CNoLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr) + : CCalendar("NoLeap", dateStr, timeOriginStr) + { initializeDate(dateStr, timeOriginStr); } + + CNoLeapCalendar::CNoLeapCalendar(int yr, int mth, int d, + int hr, int min, int sec) + : CCalendar("NoLeap") + { initializeDate(yr, mth, d, hr, min, sec) ; } + + + CNoLeapCalendar::~CNoLeapCalendar(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + StdString CNoLeapCalendar::getType(void) const + { return (StdString("noleap")); } + + ///-------------------------------------------------------------- +} // namespace xmlioserver + diff --git a/src/date/noleap.hpp b/src/date/noleap.hpp new file mode 100644 index 0000000..9c2144e --- /dev/null +++ b/src/date/noleap.hpp @@ -0,0 +1,38 @@ +#ifndef __XMLIO_CNoLeapCalendar__ +#define __XMLIO_CNoLeapCalendar__ + +/// xmlioserver headers /// +#include "xmlioserver_spl.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CNoLeapCalendar : public CCalendar + { + /// Typedef /// + typedef CCalendar SuperClass; + + public : + + /// Constructeur /// +// CNoLeapCalendar(void); // Not implemented yet. + CNoLeapCalendar(const StdString & dateStr); + CNoLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr); + CNoLeapCalendar(int yr = 0, int mth = 1, int d = 1, + int hr = 0, int min = 0, int sec = 0); + CNoLeapCalendar(const CNoLeapCalendar & calendar); // Not implemented yet. + CNoLeapCalendar(const CNoLeapCalendar * calendar); // Not implemented yet. + + /// Accesseurs /// + virtual StdString getType(void) const; + + /// Destructeur /// + virtual ~CNoLeapCalendar(void); + + }; // class CNoLeapCalendar + +} // namespace xmlioserver + +#endif // __XMLIO_CNoLeapCalendar__ + diff --git a/src/declare_attribute.hpp b/src/declare_attribute.hpp new file mode 100644 index 0000000..45c9e74 --- /dev/null +++ b/src/declare_attribute.hpp @@ -0,0 +1,130 @@ +#ifndef __XMLIO_DECLARE_ATTRIBUTE__ +#define __XMLIO_DECLARE_ATTRIBUTE__ + +/// ///////////////////////////// Macros ///////////////////////////// /// + +#define DECLARE_ATTRIBUTE(type, name) \ + class name##_attr : public CAttributeTemplate \ + { \ + public : \ + name##_attr(void) \ + : CAttributeTemplate \ + (#name, *CAttributeMap::Current) \ + { /* Ne rien faire de plus */ } \ + type operator=(const type & value) \ + { return (CAttributeTemplate::operator=(value)); } \ + virtual ~name##_attr(void) \ + { /* Ne rien faire de plus */ } \ + } name; + +#define DECLARE_ARRAY(T_num, T_rank, name) \ + class name##_attr : public CAttributeArray \ + { \ + public : \ + using CAttributeArray::operator = ; \ + name##_attr(void) : CAttributeArray (#name, *CAttributeMap::Current) {} \ + virtual ~name##_attr(void) {} \ + } name; + +#define DECLARE_CLASS_ENUM(name) \ + class name##_attr : public CAttributeEnum \ + { \ + public : \ + name##_attr(void) : CAttributeEnum(#name, *CAttributeMap::Current) { } \ + virtual ~name##_attr(void) {} \ + } name; + +#define DECLARE_ENUM2(name,arg1,arg2) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2 } ; return enumStr ; } \ + int getSize(void) const { return 2 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + +#define DECLARE_ENUM3(name,arg1,arg2,arg3) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3 } ; return enumStr ; } \ + int getSize(void) const { return 3 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + +#define DECLARE_ENUM4(name,arg1,arg2,arg3,arg4) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3,arg4} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4 } ; return enumStr ; } \ + int getSize(void) const { return 4 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + +#define DECLARE_ENUM5(name,arg1,arg2,arg3,arg4,arg5) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3,arg4,arg5} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4,#arg5 } ; return enumStr ; } \ + int getSize(void) const { return 5 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + +#define DECLARE_ENUM6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3,arg4,arg5,arg6} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4,#arg5,#arg6 } ; return enumStr ; } \ + int getSize(void) const { return 6 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + +#define DECLARE_ENUM7(name,arg1,arg2,arg3,arg4,arg5,arg6,arg7) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3,arg4,arg5,arg6,arg7} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4,#arg5,#arg6,#arg7 } ; return enumStr ; } \ + int getSize(void) const { return 7 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + +#define DECLARE_ENUM8(name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3,arg4,arg5,arg6,arg7,arg8} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4,#arg5,#arg6,#arg7,#arg8 } ; return enumStr ; } \ + int getSize(void) const { return 8 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + + #define DECLARE_ENUM9(name,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9) \ + class Enum_##name \ + { \ + public: \ + enum t_enum { arg1=0, arg2, arg3,arg4,arg5,arg6,arg7,arg8,arg9} ; \ + const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4,#arg5,#arg6,#arg7,#arg8,#arg9 } ; return enumStr ; } \ + int getSize(void) const { return 8 ; } \ + } ; \ + DECLARE_CLASS_ENUM(name) + + +#define BEGIN_DECLARE_ATTRIBUTE_MAP(type) \ + class type##Attributes : public virtual CAttributeMap \ + { \ + public : + +#define END_DECLARE_ATTRIBUTE_MAP(type) \ + type##Attributes (void) : CAttributeMap() \ + { /* Ne rien faire de plus */ } \ + virtual ~type##Attributes (void) \ + { /* Ne rien faire de plus */ } \ + }; + +#endif // __XMLIO_DECLARE_ATTRIBUTE__ diff --git a/src/declare_group.hpp b/src/declare_group.hpp new file mode 100644 index 0000000..b164ea2 --- /dev/null +++ b/src/declare_group.hpp @@ -0,0 +1,58 @@ +#ifndef __XMLIO_DECLARE_GROUP__ +#define __XMLIO_DECLARE_GROUP__ + +/// ///////////////////////////// Macros ///////////////////////////// /// + +#define DECLARE_GROUP(type) \ + class type##Group \ + : public CGroupTemplate \ + { \ + public: \ + typedef type RelChild; \ + typedef type##Group RelGroup; \ + typedef type##Attributes RelAttributes; \ + \ + type##Group(void) \ + : CGroupTemplate () \ + { /* Ne rien faire de plus */ } \ + type##Group(const StdString& _id) \ + : CGroupTemplate (_id) \ + { /* Ne rien faire de plus */ } \ + \ + static ENodeType GetType(void) \ + { return static_cast(RelChild::GetType()+1); } \ + \ + virtual ~type##Group(void) \ + { /* Ne rien faire de plus */ } \ + }; \ + typedef type##Group type##Definition + +#define DECLARE_GROUP_PARSE_REDEF(type) \ + class type##Group \ + : public CGroupTemplate \ + { \ + public: \ + typedef type RelChild; \ + typedef type##Group RelGroup; \ + typedef type##Attributes RelAttributes; \ + typedef CGroupTemplate \ + SuperClass; \ + \ + type##Group(void) \ + : CGroupTemplate () \ + { /* Ne rien faire de plus */ } \ + type##Group(const StdString& _id) \ + : CGroupTemplate (_id) \ + { /* Ne rien faire de plus */ } \ + \ + static ENodeType GetType(void) \ + { return static_cast(RelChild::GetType()+1); } \ + \ + virtual void parse(xml::CXMLNode & node, bool withAttr = true); \ + \ + virtual ~type##Group(void) \ + { /* Ne rien faire de plus */ } \ + }; \ + typedef type##Group type##Definition + +#endif // __XMLIO_DECLARE_GROUP__ diff --git a/src/duration.cpp b/src/duration.cpp new file mode 100644 index 0000000..2d8b27e --- /dev/null +++ b/src/duration.cpp @@ -0,0 +1,164 @@ +#include "duration.hpp" +#include "date.hpp" +#include "calendar.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + const CDuration Year = {1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + Month = {0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + Week = {0.0, 0.0, 7.0, 0.0, 0.0, 0.0, 0.0}, + Day = {0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0}, + Hour = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0}, + Minute = {0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0}, + Second = {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0}, + NoneDu = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + TimeStep = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; + + ///--------------------------------------------------------------- + + CDuration & CDuration::operator=(const CDuration & duration) + { + year = duration.year; month = duration.month ; day = duration.day; + hour = duration.hour; minute = duration.minute; second = duration.second; timestep=duration.timestep ; + return (*this); + } + + StdOStream & operator<<(StdOStream & out, const CDuration & duration) + { + StdOStringStream sout; + bool testValue = true; + if(duration.year != 0.0) { testValue = false; sout << duration.year << "y " ; } + if(duration.month != 0.0) { testValue = false; sout << duration.month << "mo "; } + if(duration.day != 0.0) { testValue = false; sout << duration.day << "d " ; } + if(duration.hour != 0.0) { testValue = false; sout << duration.hour << "h " ; } + if(duration.minute != 0.0) { testValue = false; sout << duration.minute << "mi "; } + if(duration.second != 0.0) { testValue = false; sout << duration.second << "s " ; } + if(duration.timestep != 0.0 || testValue) { sout << duration.timestep << "ts " ; } + + // << suppression de l'espace en fin de chaîne. + out << (sout.str().substr(0, sout.str().size()-1)); + return (out); + } + + StdIStream & operator>>(StdIStream & in , CDuration & duration) + { + duration.year = duration.month = duration.day = + duration.hour = duration.minute = duration.second = duration.timestep=0.0; + double v = 1.0; + char c = '/'; + while (!in.eof()) + { + if (!(in >> v >> c)) + { + //DEBUG("----> Pb StdIStream & operator>>(StdIStream & in , CDuration & duration)") ; + //if (in.eof()) DEBUG("----> Fin de fichier StdIStream & operator>>(StdIStream & in , CDuration & duration)") ; + } + if (in.eof()) + { + //DEBUG("----> Fin de fichier StdIStream & operator>>(StdIStream & in , CDuration & duration)") ; + break ; + } + switch (c) + { + case 'y': duration.year = v; break; + case 'd': duration.day = v; break; + case 'h': duration.hour = v; break; + case 's': duration.second = v; break; + case 'm': + { + in >> c; + if (c == 'i') duration.minute = v; + else if(c == 'o') duration.month = v; + else + { + StdString valc("m"); valc.append(1, c); + //DEBUG("La chaine \"" << valc << "\" ne permet pas de définir une unité de durée."); + break; + } + break; + } + case 't' : + { + in >> c; + if (c=='s') duration.timestep = v; + break; + } + + default: + StdString valc; valc.append(1, c); + //DEBUG("La chaine \"" << valc << "\" ne permet pas de définir une unité de durée."); + break; + } + } + return (in); + } + + //----------------------------------------------------------------- + + bool CDuration::isNone(void) const + { + if ((year == 0) && (month == 0) && (day == 0) && + (hour == 0) && (minute == 0) && (second == 0) && (timestep == 0)) + return (true); + return (false); + } + + //----------------------------------------------------------------- + CDuration & CDuration::solveTimeStep(const CCalendar & c) + { + CDuration timeStep=c.getTimeStep() ; + second +=timestep*timeStep.second ; + minute +=timestep*timeStep.minute ; + hour +=timestep*timeStep.hour ; + day +=timestep*timeStep.day ; + month +=timestep*timeStep.month ; + year +=timestep*timeStep.year ; + timestep = 0 ; + + } + + + CDuration & CDuration::resolve(const CCalendar & c) + { + // Simplification de l'écriture des minutes. + second += modf(minute, &minute) * (float)c.getMinuteLength(); + minute += int(second)/c.getMinuteLength(); second = int(second)%c.getMinuteLength(); + + // Simplification de l'écriture des heures. + minute += modf(hour , &hour) * (float)c.getHourLength(); + hour += int(minute)/c.getHourLength(); minute = int(minute)%c.getHourLength(); + + // Simplification de l'écriture des jours. + hour += modf(day, &day) * (float)c.getDayLength(); + day += int(hour) /c.getDayLength(); hour = int(hour)%c.getDayLength(); + + // > Aucune équivalence jour - mois fixée par avance. // + + // Simplification de l'écriture des années. + month += modf(year, &year) * (float)c.getYearLength(); + year += int(month) /c.getYearLength(); month = int(month)%c.getYearLength(); + return (*this); + } + + //----------------------------------------------------------------- + + StdString CDuration::toString(void) const + { + const CDuration & own = *this; + StdOStringStream oss; oss << own; + return (oss.str()); + } + + CDuration CDuration::FromString(const StdString & str) + { + CDuration dr = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + StdIStringStream iss(str); iss >> dr; + return (dr); + } + + ///--------------------------------------------------------------- + + +} // namespace xios + diff --git a/src/duration.hpp b/src/duration.hpp new file mode 100644 index 0000000..4612bb9 --- /dev/null +++ b/src/duration.hpp @@ -0,0 +1,51 @@ +#ifndef __XMLIO_CDuration__ +#define __XMLIO_CDuration__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + typedef long long int Time; + class CCalendar; + + ///--------------------------------------------------------------- + typedef struct _duration + { + public : + + /// Opérateurs /// + struct _duration & operator=(const struct _duration& duration); + + friend StdOStream & operator<<(StdOStream & out, const struct _duration& duration); + friend StdIStream & operator>>(StdIStream & in , struct _duration& duration); + + /// Test /// + bool isNone(void) const; + + /// Traitement /// + struct _duration & resolve(const CCalendar & calendar); + struct _duration & solveTimeStep(const CCalendar & c) ; + /// Autres /// + StdString toString(void) const; + + public: /* static */ + + static struct _duration FromString(const StdString & str); + + /// Propriétés publiques /// + double year, month, day, hour, minute, second, timestep; + + } CDuration; + + ///--------------------------------------------------------------- + + const extern CDuration Year, Month , Week , Day , + Hour, Minute, Second, NoneDu, TimeStep ; + ///--------------------------------------------------------------- + +} // namespace xios + +#endif // __XMLIO_CDuration__ diff --git a/src/event_client.cpp b/src/event_client.cpp new file mode 100644 index 0000000..9bb77b5 --- /dev/null +++ b/src/event_client.cpp @@ -0,0 +1,90 @@ +#include "xmlioserver_spl.hpp" +#include "event_client.hpp" +#include "buffer_out.hpp" +#include "message.hpp" +#include "type.hpp" +#include "mpi.hpp" + +namespace xios +{ + CEventClient::CEventClient(int classId_,int typeId_) + { + classId=classId_ ; + typeId=typeId_ ; + } + + void CEventClient::push(int rank,int nbSender,CMessage & msg) + { + nbSenders.push_back(nbSender) ; + ranks.push_back(rank) ; + messages.push_back(&msg) ; + } + + bool CEventClient::isEmpty(void) + { + return ranks.empty() ; + } + + list CEventClient::getRanks(void) + { + return ranks ; + } + + list CEventClient::getSizes(void) + { + list::iterator it ; + list sizes ; + size_t headerSize=sizeof(int)+sizeof(classId)+sizeof(typeId) ; + + for(it=messages.begin();it!=messages.end();++it) sizes.push_back((*it)->size()+headerSize) ; + return sizes ; + } + + void CEventClient::send(list& buffers) + { + list::iterator itBuff ; + list::iterator itMsg ; + list::iterator itSenders ; + + for(itBuff=buffers.begin(),itMsg=messages.begin(),itSenders=nbSenders.begin();itBuff!=buffers.end();++itBuff,++itMsg,++itSenders) + { + **itBuff<<*itSenders<& serverList_) + { + client=&client_ ; + nbSender=nbSender_ ; + serverList=serverList_ ; + + client->registerEvent(*this) ; + } + + list CEventClient::newEvent(int classId, int type, list sizes) + { + list::iterator it ; + list::iterator itBuff; + + + CMessage msg; + + msg< buffers=client->newEvent(*this,sizes) ; + + for(itBuff=buffers.begin();itBuff!=buffers.end();itBuff++) *(*itBuff)<sendEvent(*this) ; + } + +*/ + +} diff --git a/src/event_client.hpp b/src/event_client.hpp new file mode 100644 index 0000000..1953440 --- /dev/null +++ b/src/event_client.hpp @@ -0,0 +1,34 @@ +#ifndef __EVENT_CLIENT_HPP__ +#define __EVENT_CLIENT_HPP__ + +#include "xmlioserver_spl.hpp" +#include "buffer_out.hpp" +#include "message.hpp" + +namespace xios +{ + + class CEventClient + { + public: + +// CEventClient(CContextClient& client,int nbSender,list& serverList); + CEventClient(int classId, int typeId); + void push(int rank,int nbSender, CMessage& msg) ; + +// list newEvent(int classId, int type, list sizes) ; + list getRanks(void) ; + list getSizes(void) ; + void send(list&) ; + bool isEmpty(void) ; + list ranks ; + list nbSenders ; + list messages ; +// CContextClient* client ; + int classId ; + int typeId ; + } ; + +} + +#endif diff --git a/src/event_scheduler.cpp b/src/event_scheduler.cpp new file mode 100644 index 0000000..05fc52e --- /dev/null +++ b/src/event_scheduler.cpp @@ -0,0 +1,256 @@ +#include "event_scheduler.hpp" +#include "xmlioserver_spl.hpp" +#include "mpi.hpp" + +namespace xios +{ + + + CEventScheduler::CEventScheduler(const MPI_Comm& comm) + { + MPI_Comm_dup(comm, &communicator) ; + MPI_Comm_size(communicator,&mpiSize) ; + MPI_Comm_rank(communicator,&mpiRank); + + + int maxChild=1 ; + + int m ; + do + { + m=1 ; + maxChild=maxChild+1 ; + for(int i=0;i(maxLevel+1) ; + child=vector >(maxLevel+1,vector(maxChild)) ; + nbChild=vector (maxLevel+1) ; + + level=0 ; + begin=0 ; + end=mpiSize-1 ; + nb=end-begin+1 ; + + do + { + n=0 ; + pos=begin ; + nbChild[level]=0 ; + parent[level+1]=begin ; + for(int i=0;i=pos && mpiRank1) ; + + + } + + CEventScheduler::~CEventScheduler() + { + + } + + void CEventScheduler::registerEvent(const size_t timeLine, const size_t contextHashId) + { + registerEvent(timeLine, contextHashId, level) ; + } + + void CEventScheduler::registerEvent(const size_t timeLine, const size_t contextHashId, const size_t lev) + { + + SPendingRequest* sentRequest=new SPendingRequest ; + sentRequest->buffer[0]=timeLine ; + sentRequest->buffer[1]=contextHashId ; + sentRequest->buffer[2]=lev-1 ; + + pendingSentParentRequest.push(sentRequest) ; + MPI_Isend(sentRequest->buffer,3, MPI_UNSIGNED_LONG, parent[lev], 0, communicator, &sentRequest->request) ; + } + + bool CEventScheduler::queryEvent(const size_t timeLine, const size_t contextHashId) + { + + if (! eventStack.empty() && eventStack.front().first==timeLine && eventStack.front().second==contextHashId) + { + eventStack.pop() ; + return true ; + } + else return false ; + } + + void CEventScheduler::checkEvent(void) + { + checkChildRequest() ; + checkParentRequest() ; + + } + + + + void CEventScheduler::checkParentRequest(void) + { + int completed ; + MPI_Status status ; + int received ; + SPendingRequest* recvRequest ; + completed=true ; + + // check sent request to parent + while (! pendingSentParentRequest.empty() && completed) + { + MPI_Test( & pendingSentParentRequest.front()->request, &completed, &status) ; + if (completed) + { + delete pendingSentParentRequest.front() ; + pendingSentParentRequest.pop() ; + } + } + + // probe if a message is coming from parent + received=true ; + while(received) + { + MPI_Iprobe(MPI_ANY_SOURCE,1,communicator,&received, &status) ; + if (received) + { + recvRequest=new SPendingRequest ; + MPI_Irecv(recvRequest->buffer, 3, MPI_UNSIGNED_LONG, MPI_ANY_SOURCE, 1, communicator, &(recvRequest->request)) ; + pendingRecvParentRequest.push(recvRequest) ; + } + } + + // check sent request from parent + completed=true ; + while (! pendingRecvParentRequest.empty() && completed) + { + recvRequest=pendingRecvParentRequest.front() ; + MPI_Test( &(recvRequest->request), &completed, &status) ; + if (completed) + { + size_t timeLine=recvRequest->buffer[0] ; + size_t hashId=recvRequest->buffer[1] ; + size_t lev=recvRequest->buffer[2] ; + delete recvRequest ; + pendingRecvParentRequest.pop() ; + + if (lev==level) eventStack.push(pair(timeLine,hashId)) ; + else bcastEvent(timeLine, hashId, lev) ; + } + } + + } + + void CEventScheduler::checkChildRequest(void) + { +// function call only by parent mpi process + + MPI_Status status ; + int received ; + received=true ; + SPendingRequest* recvRequest ; + + // check for posted requests and make the corresponding receive + while(received) + { + MPI_Iprobe(MPI_ANY_SOURCE,0,communicator,&received, &status) ; + if (received) + { + recvRequest=new SPendingRequest ; + MPI_Irecv(recvRequest->buffer, 3, MPI_UNSIGNED_LONG, MPI_ANY_SOURCE, 0, communicator, &recvRequest->request) ; + pendingRecvChildRequest.push_back(recvRequest) ; + } + } + + // check if receive request is achieved + + for(list::iterator it=pendingRecvChildRequest.begin(); it!=pendingRecvChildRequest.end() ; ) + { + MPI_Test(&((*it)->request),&received,&status) ; + if (received) + { + size_t timeLine=(*it)->buffer[0] ; + size_t hashId=(*it)->buffer[1] ; + size_t lev=(*it)->buffer[2] ; + + SEvent event={timeLine,hashId,lev} ; + delete *it ; // free mem + it=pendingRecvChildRequest.erase(it) ; // get out of the list + + map< SEvent,int>::iterator itEvent=recvEvent.find(event) ; + if (itEvent==recvEvent.end()) + { + itEvent=(recvEvent.insert(pair< SEvent ,int > (event,1))).first ; + + } + else (itEvent->second)++ ; + if (itEvent->second==nbChild[lev]) + { + if (lev==0) + { + bcastEvent(timeLine,hashId,lev) ; + recvEvent.erase(itEvent) ; + } + else + { + registerEvent( timeLine,hashId,lev) ; + } + } + } + else ++it ; + } + + // check if bcast request is achieved + + for(list::iterator it=pendingSentChildRequest.begin(); it!=pendingSentChildRequest.end() ; ) + { + MPI_Test(&(*it)->request,&received,&status) ; + if (received) + { + delete *it ; // free memory + it = pendingSentChildRequest.erase(it) ; // get out of the list + + } + else ++it ; + + } + } + + void CEventScheduler::bcastEvent(const size_t timeLine, const size_t contextHashId, const size_t lev) + { + SPendingRequest* sentRequest ; + + + for(int i=0; ibuffer[0]=timeLine ; + sentRequest->buffer[1]=contextHashId ; + sentRequest->buffer[2]=lev+1 ; + MPI_Isend(sentRequest->buffer,3, MPI_UNSIGNED_LONG, child[lev][i], 1, communicator, & sentRequest->request) ; + pendingSentChildRequest.push_back(sentRequest) ; + } + } + + +} diff --git a/src/event_scheduler.hpp b/src/event_scheduler.hpp new file mode 100644 index 0000000..702a7e0 --- /dev/null +++ b/src/event_scheduler.hpp @@ -0,0 +1,176 @@ +#ifndef __EVENT_SCHEDULER_HPP__ +#define __EVENT_SCHEDULER_HPP__ + +#include "xmlioserver_spl.hpp" +#include "mpi.hpp" + +namespace xios +{ + + //! Event scheduling class. An instance of this class is used to order the event providing from different context to avoid dead lock. + /*! + * Event are ordered in a same context using the timeLine id, so each server will process the same event. But between different + * context, events are not scheduled and servers may choose to process different events and deadlock or MPI crash may occurs if + * collective MPI communication are involved by the events. + * This class solve the problem by scheduling the event and choose which event must be process by each server to insure correct + * synchronisation. Information is send by asynchronous MPI communication to the root process that order the different events + * (First In First Out) and brodcast the information to the other servers. To avoid to much incoming communication for the root + * process, and hierachical tree is used for communicating from a limited number of child processes to the parent. + */ + + class CEventScheduler + { + public: + //! Constructor + /*! A new communicator is created by duplicate comm. The communicating tree hierarchy is created. + * @param[in] comm : MPI communicator du duplicate for internal use + */ + CEventScheduler(const MPI_Comm& comm) ; + + + //! Destructor + ~CEventScheduler() ; + + + + //! public interface for registring an event from the server + /*! + * @param[in] timeLine : Time line id of the event + * @param[in] contextHashId : Hashed id of the context + */ + void registerEvent(const size_t timeLine, const size_t contextHashId) ; + + + + //! public interface for query if the event defined by timeLine and hashId is sheduled next + /*! + * @param[in] timeLine : Time line id of the event + * @param[in] contextHasId : Hashed id of the context + * @return : boolean value, true is the event is scheduled next + * + * If the event is scheduled next, it is remove from the `eventStack` queue list + */ + bool queryEvent(const size_t timeLine, const size_t contextHashId) ; + + + //! Public interface to give the hand to the instance to check pending or incoming message. + /*! + * Must be called periodicaly. Call `checkParentRequest` and `checkChildRequest` private method. + */ + void checkEvent(void) ; + + private: + + + //! Send an event to the parent of level `lev+1` + /*! + * @param[in] timeLine : Time line id of the event + * @param[in] contextHasId : Hashed id of the context + * @param[in] lev : actual level of the child in the hierarchy + * The event is sent by an asynchrounous MPI_ISend + */ + void registerEvent(const size_t timeLine, const size_t contextHashId, const size_t lev) ; + + + + //! Children side. Check potential incoming message and if pending request are completed + /*! + * - Check by `MPI_Test` if pending request sent to parents are complete. + * - Probe incoming message from parent by using `MPI_Probe`. If yes, post an asynchronous reception by `MPI_IRecv` + * - Check by `MPI_Test` if pending received requests are complete. if yes : + * + Broadcast the event to the childrens if is also a parent + * + Otherwise : push the incomming event in the `eventStack` queue. + */ + void checkParentRequest(void) ; + + + + //! Parent side. Check potential incoming message and if pending request are completed + /*! + * - Probe incoming message from chidren by using `MPI_Probe`. If yes, post an asynchronous reception by `MPI_IRecv`. + * - Check pending received event request from children using `MPI_Probe`. If and event is received, it is incerted in the + * map `recvEvent` which is increased by 1. If the number of request received from children for this event is equal to the number + * of children then : + * + if the event level is 0, bcast the event to the children. + * + else send the event to the parent. + * - Check pending sent event request to children using `MPI_TEST` and if complete release the corresponding buffer + */ + void checkChildRequest(void) ; + + + + //! Parent side. Broadcast a received event from the parent to the children. + /*! + * @param[in] timeLine : Time line id of the event + * @param[in] contextHasId : Hashed id of the context + * @param[in] lev : actual level of the child in the hierarchy + * Asynchronus MPI_ISend is used. + */ + void bcastEvent(const size_t timeLine, const size_t contextHashId, const size_t lev) ; + + + + + //! Structure defining an event, composed of the timeLine, the context hashId and the hierachical level of the communication. + struct SEvent + { + size_t timeLine ; /*!< Time line id of the event in the context */ + size_t hashId ; /*!< hassh id of the context */ + size_t level ; /*! > eventStack ; + queue pendingSentParentRequest ; /*!< Pending request sent to parent */ + queue pendingRecvParentRequest ; /*!< Pending request recv from parent */ + list pendingRecvChildRequest ; /*!< Pending request recv from child */ + list pendingSentChildRequest ; /*!< Pending request sent to child */ + map< SEvent, int > recvEvent ; /*!< list of event received from children. Contains the currnet number children that have already post the same event */ + + + int level ; /*!< Number of hierachical level for communication */ + vector parent ; /*!< Parent rank for each level */ + vector > child ; /*!< List of child rank for each level */ + vector nbChild ; /*!< Number of child for each level */ + + } ; +} + +#endif diff --git a/src/event_server.cpp b/src/event_server.cpp new file mode 100644 index 0000000..4aa3371 --- /dev/null +++ b/src/event_server.cpp @@ -0,0 +1,64 @@ +#include "xmlioserver_spl.hpp" +#include "buffer_in.hpp" +#include "type.hpp" +#include "event_server.hpp" +#include "buffer_server.hpp" + +namespace xios +{ + + void CEventServer::push(int rank,CServerBuffer* serverBuffer,char* startBuffer,int size) + { + CBufferIn buffer(startBuffer,size) ; + size_t timeLine ; + int myClassId ; + int myType ; + int myNbSender ; + + buffer>>size>>timeLine>>myNbSender>>myClassId>>myType ; + + if (subEvents.empty()) + { + nbSender=myNbSender ; + classId=myClassId; + type=myType ; + } + else + { + if (nbSender!=myNbSender || classId!=myClassId || type!=myType) + ERROR("void CEventServer::push(int rank,char* startBuffer,int size)", + "Callers of an event are not coherent") ; + } + + SSubEvent ev ; + ev.rank=rank ; + ev.serverBuffer=serverBuffer ; + ev.buffer=new CBufferIn(buffer.ptr(),buffer.remain()) ; + ev.size=size ; + subEvents.push_back(ev) ; + + if (subEvents.size()>nbSender) + { + ERROR("void CEventServer::push(int rank,CServerBuffer* serverBuffer,char* startBuffer,int size)", + "Callers of an event are not coherent") ; + } + + } + + bool CEventServer::isFull(void) + { + return (nbSender==subEvents.size()) ; + } + + CEventServer::~CEventServer() + { + list::iterator it; + + for(it=subEvents.begin();it!=subEvents.end();it++) + { + it->serverBuffer->freeBuffer(it->size) ; + delete it->buffer ; + } + } + +} diff --git a/src/event_server.hpp b/src/event_server.hpp new file mode 100644 index 0000000..a686f76 --- /dev/null +++ b/src/event_server.hpp @@ -0,0 +1,38 @@ +#ifndef __EVENT_SERVER_HPP__ +#define __EVENT_SERVER_HPP__ + +#include "xmlioserver_spl.hpp" +#include "buffer_in.hpp" +#include "buffer_server.hpp" + +namespace xios +{ + + class CEventServer + { + public: + + int classId ; + int type ; + int nbSender ; + + + void push(int rank,CServerBuffer* serverBuffer ,char* startBuffer,int size) ; + + struct SSubEvent + { + int rank ; + CServerBuffer* serverBuffer ; + CBufferIn* buffer ; + int size ; + } ; + + list subEvents ; + + bool isFull(void) ; + ~CEventServer() ; + } ; + +} + +#endif diff --git a/src/exception.cpp b/src/exception.cpp new file mode 100644 index 0000000..7bfbeb5 --- /dev/null +++ b/src/exception.cpp @@ -0,0 +1,87 @@ +#include "exception.hpp" + +/// boost headers /// +#include +#include "client.hpp" +#include "server.hpp" +#include "cxios.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CException::CException(void) + : CObject(), desc_rethrow(true) + { /* Ne rien faire de plus */ } + + CException::CException(const StdString & id) + : CObject(id), desc_rethrow(true) + { /* Ne rien faire de plus */ } + + CException::CException(const CException & exception) + : std::basic_ios() + , CObject(exception.getId()) + , StdOStringStream() + , desc_rethrow(false) + { (*this) << exception.str(); } + + CException::~CException(void) + { + if (desc_rethrow) +#ifdef __XIOS_NOABORT + { + throw (*this); + } +#else + { + int numDigit = 0; + int size = 0; + MPI_Comm_size(CXios::globalComm, &size); + while (size) + { + size /= 10; + ++numDigit; + } + + StdOFStream fileStream; + StdStringStream fileNameErr; + std::streambuf* psbuf; + if (CXios::isServerSide) + fileNameErr << CXios::serverFile << "_" << std::setfill('0') + << std::setw(numDigit) << CServer::getRank() << ".err"; + else + fileNameErr << CXios::clientFile << "_" << std::setfill('0') + << std::setw(numDigit) << CClient::getRank() << ".err"; + + + fileStream.open(fileNameErr.str().c_str(), std::ofstream::out); + psbuf = fileStream.rdbuf(); + std::cerr.rdbuf(psbuf); + std::cerr << this->getMessage() << std::endl; + fileStream.close(); + abort(); + } + +#endif + } + + //--------------------------------------------------------------- + + StdString CException::getMessage(void) const + { + StdOStringStream oss; + oss << "> Error [" << this->getId() << "] : " << this->str(); + return (oss.str()); + } + + StdOStringStream & CException::getStream(void) + { return (*boost::polymorphic_cast(this)); } + + StdString CException::toString(void) const + { return (StdString(this->getMessage())); } + + void CException::fromString(const StdString & str) + { this->str(str); } + + //--------------------------------------------------------------- + +} // namespace xios diff --git a/src/exception.hpp b/src/exception.hpp new file mode 100644 index 0000000..e047841 --- /dev/null +++ b/src/exception.hpp @@ -0,0 +1,56 @@ +#ifndef __XMLIO_CException__ +#define __XMLIO_CException__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "object.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CException + : private CObject, public StdOStringStream + { + typedef CObject SuperClass; + + public : + + /// Constructeurs /// + CException(void); + explicit CException(const StdString & id); + CException(const CException & exception); + CException(const CException * const exception); // Not implemented. + + /// Accesseurs /// + StdString getMessage(void) const; + StdOStringStream & getStream(void); + + /// Destructeur /// + virtual ~CException(void); + + /// Autre /// + virtual StdString toString(void) const; + virtual void fromString(const StdString & str); + + private : + + /// Propriétés /// + bool desc_rethrow; // throw destructor + + }; // CException +} // namespace xios + +/// //////////////////////////// Macros //////////////////////////// /// + +#define INFO(x) \ + "In file \'" __FILE__ "\', line " << __LINE__ << " -> " x << std::endl; + +#ifdef __XIOS_DEBUG +# define DEBUG(x) std::clog << "> Debug " << INFO(x) +#else +# define DEBUG(x) +#endif + +#define ERROR(id, x) CException(id).getStream() << INFO(x) + +#endif // __XMLIO_CException__ diff --git a/src/functor.cpp b/src/functor.cpp new file mode 100644 index 0000000..6ec415e --- /dev/null +++ b/src/functor.cpp @@ -0,0 +1,66 @@ +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + CFunctor::CFunctor(const StdString & id, CArray& doutput) + : SuperClass(id), doutput(doutput), nbcall(0),hasMissingValue(false) + { /* Ne rien faire de plus */ } + + CFunctor::CFunctor(const StdString & id, CArray& doutput, double missingValue) + : SuperClass(id), doutput(doutput), nbcall(0),hasMissingValue(true),missingValue(missingValue) + { + /* Ne rien faire de plus */ + } + + CFunctor::~CFunctor(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + CArray CFunctor::getDataOutput(void) const + { + return (this->doutput); + } + + //--------------------------------------------------------------- + + StdString CFunctor::toString(void) const + { + ERROR("CFunctor::toString()", << "Not implemented yet !"); + return (SuperClass::getId()); + } + + void CFunctor::fromString(const StdString & str) + { + ERROR("CFunctor::fromString(str)", + << "[ str = " << str << "] Not implemented yet !"); + } + + //--------------------------------------------------------------- + + CArray CFunctor::operator ()(const CArray& dinput) + { + this->nbcall++; + if (dinput.numElements() != this->doutput.numElements()) + ERROR("CFunctor::operator ()(dinput)", + << "[ input size = " << dinput.numElements() + << ", output size = " << this->doutput.numElements() << " ]" + << " size of input array != size of output array !"); + this->apply(dinput, this->doutput); + return (this->doutput); + } + + void CFunctor::final(void) + { + this->nbcall = 0; + } + + //--------------------------------------------------------------- + + } // namespace func +} // namespace xios diff --git a/src/functor.hpp b/src/functor.hpp new file mode 100644 index 0000000..512aa8e --- /dev/null +++ b/src/functor.hpp @@ -0,0 +1,62 @@ +#ifndef __XMLIO_CFunctor__ +#define __XMLIO_CFunctor__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class CFunctor : public CObject + { + /// Définition de type /// + typedef CObject SuperClass; + public : + enum ETimeType { once, instant, centered } ; + + /// Accesseurs /// + CArray getDataOutput(void) const; + /// Opérateur /// + CArray operator ()(const CArray& dinput); + virtual ETimeType timeType(void) = 0 ; + + /// Destructeur /// + virtual ~CFunctor(void); + + //Traitement /// + virtual void final(void); + + protected : + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput) = 0; + + /// Autres /// + virtual StdString toString(void) const; + virtual void fromString(const StdString & str); + + /// Constructeurs /// + CFunctor(void); // Not implemented. + CFunctor(const StdString & id, CArray& doutput); + CFunctor(const StdString & id, CArray& doutput, double missingValue); + CFunctor(const CFunctor & functor); // Not implemented. + CFunctor(const CFunctor * const functor); // Not implemented. + protected : + /// Propriétés privées /// + CArray& doutput; + /// Propriétés protégées /// + int nbcall; + bool hasMissingValue ; + double missingValue ; + CArray nbcalls ; + }; // class CFunctor + } // namespace func +} // namespace xios + +//#include "functor_type.hpp" + +#endif // __XMLIO_CFunctor__ diff --git a/src/functor/accumulate.cpp b/src/functor/accumulate.cpp new file mode 100644 index 0000000..84ce0ed --- /dev/null +++ b/src/functor/accumulate.cpp @@ -0,0 +1,51 @@ +#include "accumulate.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + CAccumulate::CAccumulate(CArray& doutput) + : SuperClass(StdString("accumulate"), doutput) + { /* Ne rien faire de plus */ } + + CAccumulate::CAccumulate(CArray& doutput, double missingValue) + : SuperClass(StdString("accumulate"), doutput, missingValue) + { /* Ne rien faire de plus */ } + + CAccumulate::~CAccumulate(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + void CAccumulate::apply(const CArray& _dinput, + CArray& _doutput) + { + if (this->nbcall == 1) _doutput=_dinput ; + else + { + if (hasMissingValue) + { + int i, n =_dinput.numElements() ; + const double * in=_dinput.dataFirst() ; + double* out=_doutput.dataFirst(); + for (i=0; inbcall = 0; + } + } // namespace func +} // namespace xmlioserver diff --git a/src/functor/accumulate.hpp b/src/functor/accumulate.hpp new file mode 100644 index 0000000..912687b --- /dev/null +++ b/src/functor/accumulate.hpp @@ -0,0 +1,41 @@ +#ifndef __XMLIO_CAccumulate__ +#define __XMLIO_CAccumulate__ + +/// xmlioserver headers /// +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class CAccumulate : public CFunctor + { + /// Définition de type /// + typedef CFunctor SuperClass; + + public : + + /// Constructeurs /// + //CAccumulate(void); // Not implemented. + //CAccumulate(const CFunData & data); + CAccumulate(CArray& doutput); + CAccumulate(CArray& doutput, double missingValue); + //CAccumulate(const CAccumulate & accumulate); // Not implemented. + //CAccumulate(const CAccumulate * const accumulate); // Not implemented. + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput); + virtual void final(void) ; + virtual ETimeType timeType(void) { return centered ; } + + /// Destructeur /// + virtual ~CAccumulate(void); + + }; // class CAccumulate + + } // namespace func +} // namespace xmlioserver + +#endif //__XMLIO_CAccumulate__ diff --git a/src/functor/average.cpp b/src/functor/average.cpp new file mode 100644 index 0000000..cbee49a --- /dev/null +++ b/src/functor/average.cpp @@ -0,0 +1,88 @@ +#include "average.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + CAverage::CAverage(CArray& doutput) + : SuperClass(StdString("average"), doutput) + { /* Ne rien faire de plus */ } + + CAverage::CAverage(CArray& doutput, double missingValue) + : SuperClass(StdString("average"), doutput, missingValue) + { /* Ne rien faire de plus */ } + + CAverage::~CAverage(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + void CAverage::apply(const CArray& _dinput, + CArray& _doutput) + { + if (hasMissingValue) + { + if (nbcalls.numElements()==0) + { + nbcalls.resize(_dinput.numElements()) ; + nbcalls=0 ; + } + } + + if (this->nbcall == 1) + { + _doutput=_dinput ; + if (hasMissingValue) + { + int i, n =_dinput.numElements() ; + const double * in=_dinput.dataFirst() ; + int* nc=nbcalls.dataFirst() ; + for (i=0; inbcall; + this->nbcall = 0; + + } + } // namespace func +} // namespace xmlioserver diff --git a/src/functor/average.hpp b/src/functor/average.hpp new file mode 100644 index 0000000..d0f6dad --- /dev/null +++ b/src/functor/average.hpp @@ -0,0 +1,41 @@ +#ifndef __XMLIO_CAverage__ +#define __XMLIO_CAverage__ + +/// xmlioserver headers /// +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class CAverage : public CFunctor + { + /// Définition de type /// + typedef CFunctor SuperClass; + + public : + + /// Constructeurs /// + //CAverage(void); // Not implemented. + //CAverage(const CFunData & data); + CAverage(CArray& doutput); + CAverage(CArray& doutput, double missingValue); + //CAverage(const CAverage & average); // Not implemented. + //CAverage(const CAverage * const average); // Not implemented. + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput); + virtual void final(void) ; + virtual ETimeType timeType(void) { return centered ; } + + /// Destructeur /// + virtual ~CAverage(void); + + }; // class CAverage + + } // namespace func +} // namespace xmlioserver + +#endif //__XMLIO_CAverage__ diff --git a/src/functor/functor_type.hpp b/src/functor/functor_type.hpp new file mode 100644 index 0000000..059cdeb --- /dev/null +++ b/src/functor/functor_type.hpp @@ -0,0 +1,12 @@ +#ifndef __XMLIO_functor_type__ +#define __XMLIO_functor_type__ + +#include "average.hpp" +#include "accumulate.hpp" +#include "instant.hpp" +#include "once.hpp" +#include "maximum.hpp" +#include "minimum.hpp" + +#endif //__XMLIO_functor_type__ + diff --git a/src/functor/instant.cpp b/src/functor/instant.cpp new file mode 100644 index 0000000..8caefd4 --- /dev/null +++ b/src/functor/instant.cpp @@ -0,0 +1,36 @@ +#include "instant.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + CInstant::CInstant(CArray& doutput) + : SuperClass(StdString("instant"), doutput) + { /* Ne rien faire de plus */ } + + CInstant::CInstant(CArray& doutput, double missingValue) + : SuperClass(StdString("instant"), doutput, missingValue) + { /* Ne rien faire de plus */ } + + CInstant::~CInstant(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + void CInstant::apply(const CArray& _dinput, + CArray& _doutput) + { +/* const double * it1 = _dinput->data(), + * end1 = _dinput->data() + _dinput->num_elements(); + double * it = _doutput->data(); + for (; it1 != end1; it1++, it++) *it = *it1;*/ + _doutput=_dinput ; + } + + //--------------------------------------------------------------- + + } // namespace func +} // namespace xmlioserver diff --git a/src/functor/instant.hpp b/src/functor/instant.hpp new file mode 100644 index 0000000..c026797 --- /dev/null +++ b/src/functor/instant.hpp @@ -0,0 +1,40 @@ +#ifndef __XMLIO_CInstant__ +#define __XMLIO_CInstant__ + +/// xios headers /// +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class CInstant : public CFunctor + { + /// Définition de type /// + typedef CFunctor SuperClass; + + public : + + /// Constructeurs /// + //CInstant(void); // Not implemented. + //CInstant(const CFunData & data); + CInstant(CArray& doutput); + CInstant(CArray& doutput, double missingValue); + //CInstant(const CInstant & instant); // Not implemented. + //CInstant(const CInstant * const instant); // Not implemented. + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput); + virtual ETimeType timeType(void) { return instant ; } + + /// Destructeur /// + virtual ~CInstant(void); + + }; // class CInstant + + } // namespace func +} // namespace xmlioserver + +#endif //__XMLIO_CInstant__ diff --git a/src/functor/maximum.cpp b/src/functor/maximum.cpp new file mode 100644 index 0000000..53b40aa --- /dev/null +++ b/src/functor/maximum.cpp @@ -0,0 +1,52 @@ +#include "maximum.hpp" +#include "array_new.hpp" + + + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + CMaximum::CMaximum(CArray& doutput) + : SuperClass(StdString("maximum"), doutput) + { /* Ne rien faire de plus */ } + + CMaximum::CMaximum(CArray& doutput, double missingValue) + : SuperClass(StdString("maximum"), doutput, missingValue) + { /* Ne rien faire de plus */ } + + CMaximum::~CMaximum(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + void CMaximum::apply(const CArray& _dinput, + CArray& _doutput) + { + const double * it1 = _dinput.dataFirst(), + * end1 = _dinput.dataFirst() + _dinput.numElements(); + double * it = _doutput.dataFirst(); + if (this->nbcall == 1) for (; it1 != end1; it1++, it++) *it = *it1; + else + { + if (hasMissingValue) + { + for (; it1 != end1; it1++, it++) + if (*it1 != missingValue) + { + if ( *it != missingValue) *it = std::max(*it1, *it); + else *it=*it1 ; + } + } + else for (; it1 != end1; it1++, it++) *it = std::max(*it1, *it); + } + + + } + + //--------------------------------------------------------------- + + } // namespace func +} // namespace xmlioserver diff --git a/src/functor/maximum.hpp b/src/functor/maximum.hpp new file mode 100644 index 0000000..ad2493c --- /dev/null +++ b/src/functor/maximum.hpp @@ -0,0 +1,40 @@ +#ifndef __XMLIO_CMaximum__ +#define __XMLIO_CMaximum__ + +/// xios headers /// +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class CMaximum : public CFunctor + { + /// Définition de type /// + typedef CFunctor SuperClass; + + public : + + /// Constructeurs /// + //CMaximum(void); // Not implemented. + //CMaximum(const CFunData & data); + CMaximum(CArray& doutput); + CMaximum(CArray& doutput, double missingValue); + //CMaximum(const CMaximum & Maximum); // Not implemented. + //CMaximum(const CMaximum * const Maximum); // Not implemented. + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput); + virtual ETimeType timeType(void) { return centered ; } + + /// Destructeur /// + virtual ~CMaximum(void); + + }; // class CMaximum + + } // namespace func +} // namespace xmlioserver + +#endif //__XMLIO_CMaximum__ diff --git a/src/functor/minimum.cpp b/src/functor/minimum.cpp new file mode 100644 index 0000000..9d4e1a6 --- /dev/null +++ b/src/functor/minimum.cpp @@ -0,0 +1,51 @@ +#include "minimum.hpp" +#include "array_new.hpp" +#include + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + CMinimum::CMinimum(CArray& doutput) + : SuperClass(StdString("minimum"), doutput) + { /* Ne rien faire de plus */ } + + CMinimum::CMinimum(CArray& doutput, double missingValue) + : SuperClass(StdString("minimum"), doutput, missingValue) + { /* Ne rien faire de plus */ } + + CMinimum::~CMinimum(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + void CMinimum::apply(const CArray& _dinput, + CArray& _doutput) + { + const double * it1 = _dinput.dataFirst(), + * end1 = _dinput.dataFirst() + _dinput.numElements(); + double * it = _doutput.dataFirst(); + + if (this->nbcall == 1) for (; it1 != end1; it1++, it++) *it = *it1; + else + { + if (hasMissingValue) + { + for (; it1 != end1; it1++, it++) + if (*it1!=missingValue) + { + if (*it != missingValue) *it = std::min(*it1, *it); + else *it=*it1 ; + } + } + else for (; it1 != end1; it1++, it++) *it = std::min(*it1, *it); + } + + } + + //--------------------------------------------------------------- + + } // namespace func +} // namespace xmlioserver diff --git a/src/functor/minimum.hpp b/src/functor/minimum.hpp new file mode 100644 index 0000000..fb980ae --- /dev/null +++ b/src/functor/minimum.hpp @@ -0,0 +1,40 @@ +#ifndef __XMLIO_CMinimum__ +#define __XMLIO_CMinimum__ + +/// xmlioserver headers /// +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class CMinimum : public CFunctor + { + /// Définition de type /// + typedef CFunctor SuperClass; + + public : + + /// Constructeurs /// + //CMinimum(void); // Not implemented. + //CMinimum(const CFunData & data); + CMinimum(CArray& doutput); + CMinimum(CArray& doutput, double missingValue); + //CMinimum(const CMinimum & Minimum); // Not implemented. + //CMinimum(const CMinimum * const Minimum); // Not implemented. + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput); + virtual ETimeType timeType(void) { return centered ; } + + /// Destructeur /// + virtual ~CMinimum(void); + + }; // class CMinimum + + } // namespace func +} // namespace xmlioserver + +#endif //__XMLIO_CMinimum__ diff --git a/src/functor/once.cpp b/src/functor/once.cpp new file mode 100644 index 0000000..b80b1e9 --- /dev/null +++ b/src/functor/once.cpp @@ -0,0 +1,37 @@ +#include "once.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Définitions ////////////////////// /// + + COnce::COnce(CArray& doutput) + : SuperClass(StdString("once"), doutput) + { /* Ne rien faire de plus */ } + + COnce::COnce(CArray& doutput, double missingValue) + : SuperClass(StdString("once"), doutput, missingValue) + { /* Ne rien faire de plus */ } + + COnce::~COnce(void) + { /* Ne rien faire de plus */ } + + //--------------------------------------------------------------- + + void COnce::apply(const CArray& _dinput, + CArray& _doutput) + { +/* const double * it1 = _dinput->data(), + * end1 = _dinput->data() + _dinput->num_elements(); + double * it = _doutput->data(); + for (; it1 != end1; it1++, it++) *it = *it1;*/ + _doutput=_dinput ; + } + + //--------------------------------------------------------------- + + } // namespace func +} // namespace xmlioserver + diff --git a/src/functor/once.hpp b/src/functor/once.hpp new file mode 100644 index 0000000..1eb1ccb --- /dev/null +++ b/src/functor/once.hpp @@ -0,0 +1,40 @@ +#ifndef __XMLIO_COnce__ +#define __XMLIO_COnce__ + +/// xios headers /// +#include "functor.hpp" +#include "array_new.hpp" + +namespace xios +{ + namespace func + { + /// ////////////////////// Déclarations ////////////////////// /// + class COnce : public CFunctor + { + /// Définition de type /// + typedef CFunctor SuperClass; + + public : + + /// Constructeurs /// + //COnce(void); // Not implemented. + COnce(CArray& doutput); + COnce(CArray& doutput, double missingValue); + //COnce(const COnce & once); // Not implemented. + //COnce(const COnce * const once); // Not implemented. + + /// Traitement /// + virtual void apply(const CArray& dinput, CArray& doutput); + virtual ETimeType timeType(void) { return once ; } + + /// Destructeur /// + virtual ~COnce(void); + + }; // class COnce + + } // namespace func +} // namespace xios + +#endif //__XMLIO_COnce__ + diff --git a/src/generate_fortran_interface.cpp b/src/generate_fortran_interface.cpp new file mode 100644 index 0000000..4ff298d --- /dev/null +++ b/src/generate_fortran_interface.cpp @@ -0,0 +1,196 @@ +#include "xmlioserver.hpp" +#include "generate_interface.hpp" +#include "indent.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "context.hpp" +#include "file.hpp" + +int main (int argc, char ** argv, char ** UNUSED (env)) +{ +// string path="./src/attr_interface/" ; + string path="./interface/" ; + + CContext* context=CContext::create("interface") ; + CAxis axis ; + CAxisGroup axisgroup ; + CField field; + CFieldGroup fieldgroup ; + CVariable variable; + CVariableGroup variablegroup ; + CDomain domain ; + CDomainGroup domaingroup ; + CGrid grid ; + CGridGroup gridgroup ; + + CFile afile; + CFileGroup filegroup; + + ostringstream oss ; + ofstream file; + + file.open((path+"axis_interface_attr.f90").c_str()); + axis.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icaxis_attr.cpp").c_str()); + axis.generateCInterface(file) ; + file.close(); + + file.open((path+"iaxis_attr.F90").c_str()); + axis.generateFortranInterface(file) ; + file.close(); + + file.open((path+"axisgroup_interface_attr.f90").c_str()); + axisgroup.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icaxisgroup_attr.cpp").c_str()); + axisgroup.generateCInterface(file) ; + file.close(); + + file.open((path+"iaxisgroup_attr.F90").c_str()); + axisgroup.generateFortranInterface(file) ; + file.close(); + + file.open((path+"domain_interface_attr.f90").c_str()); + domain.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icdomain_attr.cpp").c_str()); + domain.generateCInterface(file) ; + file.close(); + + file.open((path+"idomain_attr.F90").c_str()); + domain.generateFortranInterface(file) ; + file.close(); + + file.open((path+"domaingroup_interface_attr.f90").c_str()); + domaingroup.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icdomaingroup_attr.cpp").c_str()); + domaingroup.generateCInterface(file) ; + file.close(); + + file.open((path+"idomaingroup_attr.F90").c_str()); + domaingroup.generateFortranInterface(file) ; + file.close(); + + + file.open((path+"grid_interface_attr.f90").c_str()); + grid.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icgrid_attr.cpp").c_str()); + grid.generateCInterface(file) ; + file.close(); + + file.open((path+"igrid_attr.F90").c_str()); + grid.generateFortranInterface(file) ; + file.close(); + + file.open((path+"gridgroup_interface_attr.f90").c_str()); + gridgroup.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icgridgroup_attr.cpp").c_str()); + gridgroup.generateCInterface(file) ; + file.close(); + + file.open((path+"igridgroup_attr.F90").c_str()); + gridgroup.generateFortranInterface(file) ; + file.close(); + + + file.open((path+"field_interface_attr.f90").c_str()); + field.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icfield_attr.cpp").c_str()); + field.generateCInterface(file) ; + file.close(); + + file.open((path+"ifield_attr.F90").c_str()); + field.generateFortranInterface(file) ; + file.close(); + + file.open((path+"fieldgroup_interface_attr.f90").c_str()); + fieldgroup.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icfieldgroup_attr.cpp").c_str()); + fieldgroup.generateCInterface(file) ; + file.close(); + + file.open((path+"ifieldgroup_attr.F90").c_str()); + fieldgroup.generateFortranInterface(file) ; + file.close(); + + + + file.open((path+"variable_interface_attr.f90").c_str()); + variable.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icvariable_attr.cpp").c_str()); + variable.generateCInterface(file) ; + file.close(); + + file.open((path+"ivariable_attr.F90").c_str()); + variable.generateFortranInterface(file) ; + file.close(); + + file.open((path+"variablegroup_interface_attr.f90").c_str()); + variablegroup.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icvariablegroup_attr.cpp").c_str()); + variablegroup.generateCInterface(file) ; + file.close(); + + file.open((path+"ivariablegroup_attr.F90").c_str()); + variablegroup.generateFortranInterface(file) ; + file.close(); + + + + file.open((path+"file_interface_attr.f90").c_str()); + afile.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icfile_attr.cpp").c_str()); + afile.generateCInterface(file) ; + file.close(); + + file.open((path+"ifile_attr.F90").c_str()); + afile.generateFortranInterface(file) ; + file.close(); + + file.open((path+"filegroup_interface_attr.f90").c_str()); + filegroup.generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"icfilegroup_attr.cpp").c_str()); + filegroup.generateCInterface(file) ; + file.close(); + + file.open((path+"ifilegroup_attr.F90").c_str()); + filegroup.generateFortranInterface(file) ; + file.close(); + + + file.open((path+"context_interface_attr.f90").c_str()); + context->generateFortran2003Interface(file) ; + file.close(); + + file.open((path+"iccontext_attr.cpp").c_str()); + context->generateCInterface(file) ; + file.close(); + + file.open((path+"icontext_attr.F90").c_str()); + context->generateFortranInterface(file) ; + file.close(); + +} diff --git a/src/generate_interface.hpp b/src/generate_interface.hpp new file mode 100644 index 0000000..faafb6c --- /dev/null +++ b/src/generate_interface.hpp @@ -0,0 +1,72 @@ +#ifndef __XIOS_GENERATE_INTERFACE_HPP__ +#define __XIOS_GENERATE_INTERFACE_HPP__ + +#include "xmlioserver_spl.hpp" + +namespace xios +{ + class CInterface + { + public: + + template + static void AttributeCInterface(ostream& oss,const string& className,const string& name) ; + static void AttributeIsDefinedCInterface(ostream& oss, const string& className,const string& name); + + template + static void AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) ; + static void AttributeIsDefinedFortran2003Interface(ostream& oss,const string& className,const string& name); + + template + static void AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) ; + + template + static void AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) ; + + static void AttributeFortranInterfaceIsDefinedDeclaration(ostream& oss,const string& className,const string& name) ; + + template + static void AttributeFortranInterfaceBody(ostream& oss,const string& className,const string& name) ; + + template + static void AttributeFortranInterfaceGetBody(ostream& oss,const string& className,const string& name) ; + + static void AttributeFortranInterfaceIsDefinedBody(ostream& oss,const string& className,const string& name) ; + + template + static string getStrFortranType(void) ; + + template + static string getStrFortranKind(void) ; + + template + static string getStrFortranKindC(void) ; + + template + static bool matchingTypeCFortran(void) ; + + + }; +/* + template<> string CInterface::getStrFortranType(void) {return string("INTEGER") ;} + template<> string CInterface::getStrFortranType(void) {return string("LOGICAL") ;} + template<> string CInterface::getStrFortranType(void) {return string("REAL") ;} + template<> string CInterface::getStrFortranType(void) {return string("REAL") ;} + + template<> string CInterface::getStrFortranKind(void) {return string("") ;} + template<> string CInterface::getStrFortranKind(void) {return string("") ;} + template<> string CInterface::getStrFortranKind(void) {return string("(KIND=8)") ;} + template<> string CInterface::getStrFortranKind(void) {return string("(KIND=4)") ;} + + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_INT)") ;} + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_BOOL)") ;} + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_DOUBLE)") ;} + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_FLOAT)") ;} + + template<> bool CInterface::matchingTypeCFortran(void) { return true ; } + template<> bool CInterface::matchingTypeCFortran(void) { return false ;} + template<> bool CInterface::matchingTypeCFortran(void) { return true; } + template<> bool CInterface::matchingTypeCFortran(void) { return true; } +*/ +} +#endif diff --git a/src/generate_interface_decl.cpp b/src/generate_interface_decl.cpp new file mode 100644 index 0000000..2bc32e4 --- /dev/null +++ b/src/generate_interface_decl.cpp @@ -0,0 +1,21 @@ +#include "generate_interface_impl.hpp" + +namespace xios +{ + +#define macro(T) \ + template void CInterface::AttributeCInterface(ostream& oss,const string& className,const string& name) ; \ + template void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) ; \ + template void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) ; \ + template void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) ; \ + template void CInterface::AttributeFortranInterfaceBody(ostream& oss,const string& className,const string& name) ; \ + template void CInterface::AttributeFortranInterfaceGetBody(ostream& oss,const string& className,const string& name) ; \ + template string CInterface::getStrFortranType(void) ; \ + template string CInterface::getStrFortranKind(void) ; \ + template string CInterface::getStrFortranKindC(void) ; \ + template bool CInterface::matchingTypeCFortran(void) ; + + macro(bool) + macro(int) + macro(double) +} diff --git a/src/generate_interface_impl.hpp b/src/generate_interface_impl.hpp new file mode 100644 index 0000000..73a3338 --- /dev/null +++ b/src/generate_interface_impl.hpp @@ -0,0 +1,954 @@ +#ifndef __XIOS_GENERATE_INTERFACE_IMPL_HPP__ +#define __XIOS_GENERATE_INTERFACE_IMPL_HPP__ + +#include "xmlioserver_spl.hpp" +#include "generate_interface.hpp" +#include "type_util.hpp" +#include "indent.hpp" +#include "enum.hpp" +#include "array_new.hpp" + +namespace xios +{ + template<> string CInterface::getStrFortranType(void) {return string("INTEGER") ;} + template<> string CInterface::getStrFortranType(void) {return string("LOGICAL") ;} + template<> string CInterface::getStrFortranType(void) {return string("REAL") ;} + template<> string CInterface::getStrFortranType(void) {return string("REAL") ;} + + template<> string CInterface::getStrFortranKind(void) {return string("") ;} + template<> string CInterface::getStrFortranKind(void) {return string("") ;} + template<> string CInterface::getStrFortranKind(void) {return string("(KIND=8)") ;} + template<> string CInterface::getStrFortranKind(void) {return string("(KIND=4)") ;} + + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_INT)") ;} + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_BOOL)") ;} + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_DOUBLE)") ;} + template<> string CInterface::getStrFortranKindC(void) {return string("(KIND=C_FLOAT)") ;} + + template<> bool CInterface::matchingTypeCFortran(void) { return true ; } + template<> bool CInterface::matchingTypeCFortran(void) { return false ;} + template<> bool CInterface::matchingTypeCFortran(void) { return true; } + template<> bool CInterface::matchingTypeCFortran(void) { return true; } + + +// ///////////////////////////////////////////////// +// // C Interface // +// ///////////////////////////////////////////////// + + + void CInterface::AttributeIsDefinedCInterface(ostream& oss, const string& className,const string& name) + { + oss<<"bool cxios_is_defined_"<"< + void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name) + { + string typeName=getStrType() ; + + oss<<"void cxios_set_"<"<sendAttributToServer("<"<"< + void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name) + { + oss<<"void cxios_set_"<"<sendAttributToServer("<"<"< + void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name) + { + oss<<"void cxios_set_"<"<sendAttributToServer("<"<"<mask.getValue(), mask, extent1, extent2)) +// ERROR("cxios_get_domain_mask(XDomainPtr domain_hdl, bool * mask, int extent1, int extent2)",<<"Output array size is not conform to array size attribut") ; + +/* +#define macro(T) \ + template <>\ + void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name)\ + {\ + string typeName=getStrType() ;\ +\ + oss<<"void cxios_set_"<(boost::extents[extent1]));"<num_elements()]), array_tmp->data());"<"<sendAttributToServer("<"<"< \ + void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name)\ + {\ + string typeName=getStrType() ;\ +\ + oss<<"void cxios_set_"<(boost::extents[extent1][extent2]));"<num_elements()]), array_tmp->data());"<"<sendAttributToServer("<"<"<\ + void CInterface::AttributeCInterface(ostream& oss, const string& className,const string& name)\ + {\ + string typeName=getStrType() ;\ +\ + oss<<"void cxios_set_"<(boost::extents[extent1][extent2][extent3]));"<num_elements()]), array_tmp->data());"<"<sendAttributToServer("<"<"< + void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) + { + string fortranType=getStrFortranType() ; + string fortranKindC=getStrFortranKindC() ; + + oss<<"SUBROUTINE cxios_set_"< + void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) + { + + oss<<"SUBROUTINE cxios_set_"<\ + void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) \ + { \ + string fortranType=getStrFortranType() ; \ + string fortranKindC=getStrFortranKindC() ; \ + \ + oss<<"SUBROUTINE cxios_set_"< \ + void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) \ + { \ + string fortranType=getStrFortranType() ; \ + string fortranKindC=getStrFortranKindC() ; \ + \ + oss<<"SUBROUTINE cxios_set_"< \ + void CInterface::AttributeFortran2003Interface(ostream& oss,const string& className,const string& name) \ + { \ + string fortranType=getStrFortranType() ; \ + string fortranKindC=getStrFortranKindC() ; \ + \ + oss<<"SUBROUTINE cxios_set_"< + void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) + { + oss<()<<" "<< getStrFortranKind() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<()<<" :: "< + void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) + { + oss<()<<" "<< getStrFortranKind() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<()<<" :: "< + void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) + { + oss<<"CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: "< + void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) + { + oss<<"CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: "< \ + void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceDeclaration(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceGetDeclaration(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< + void CInterface::AttributeFortranInterfaceBody(ostream& oss,const string& className,const string& name) + { + string name_tmp=name+"__tmp" ; + + oss<<"IF (PRESENT("<()) + { + oss<<" "< + void CInterface::AttributeFortranInterfaceGetBody(ostream& oss,const string& className,const string& name) + { + string name_tmp=name+"__tmp" ; + + oss<<"IF (PRESENT("<()) + { + oss<<" CALL cxios_get_"< + void CInterface::AttributeFortranInterfaceBody(ostream& oss,const string& className,const string& name) + { + oss<<"IF (PRESENT("< + void CInterface::AttributeFortranInterfaceGetBody(ostream& oss,const string& className,const string& name) + { + oss<<"IF (PRESENT("< \ + void CInterface::AttributeFortranInterfaceBody< ARRAY(T,1) >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceBody< ARRAY(T,2) >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceBody< ARRAY(T,3) >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceGetBody< ARRAY(T,1) >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceGetBody< ARRAY(T,2) >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceGetBody< ARRAY(T,3) >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("<\ + void CInterface::AttributeCInterface >(ostream& oss, const string& className,const string& name)\ + {\ + string typeName=getStrType() ;\ +\ + oss<<"void cxios_set_"< tmp("<"<sendAttributToServer("<"< tmp("<"< \ + void CInterface::AttributeCInterface >(ostream& oss, const string& className,const string& name)\ + {\ + string typeName=getStrType() ;\ +\ + oss<<"void cxios_set_"< tmp("<"<sendAttributToServer("<"< tmp("<"<\ + void CInterface::AttributeCInterface >(ostream& oss, const string& className,const string& name)\ + {\ + string typeName=getStrType() ;\ +\ + oss<<"void cxios_set_"< tmp("<"<sendAttributToServer("<"< tmp("<"<\ + void CInterface::AttributeFortran2003Interface >(ostream& oss,const string& className,const string& name) \ + { \ + string fortranType=getStrFortranType() ; \ + string fortranKindC=getStrFortranKindC() ; \ + \ + oss<<"SUBROUTINE cxios_set_"< \ + void CInterface::AttributeFortran2003Interface >(ostream& oss,const string& className,const string& name) \ + { \ + string fortranType=getStrFortranType() ; \ + string fortranKindC=getStrFortranKindC() ; \ + \ + oss<<"SUBROUTINE cxios_set_"< \ + void CInterface::AttributeFortran2003Interface >(ostream& oss,const string& className,const string& name) \ + { \ + string fortranType=getStrFortranType() ; \ + string fortranKindC=getStrFortranKindC() ; \ + \ + oss<<"SUBROUTINE cxios_set_"< \ + void CInterface::AttributeFortranInterfaceDeclaration >(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceGetDeclaration >(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceDeclaration >(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceGetDeclaration >(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceDeclaration >(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(IN) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceGetDeclaration >(ostream& oss,const string& className,const string& name) \ + { \ + oss<()<<" "<() <<" , OPTIONAL, INTENT(OUT) :: "<()) oss<()<<" "<() <<" , ALLOCATABLE :: "< \ + void CInterface::AttributeFortranInterfaceBody< CArray >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceBody< CArray >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceBody< CArray >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceGetBody< CArray >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceGetBody< CArray >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< \ + void CInterface::AttributeFortranInterfaceGetBody< CArray >(ostream& oss,const string& className,const string& name) \ + { \ + string name_tmp=name+"__tmp" ; \ + \ + oss<<"IF (PRESENT("<()) \ + { \ + oss<<" ALLOCATE("< + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "object_factory.hpp" +#include "group_template.hpp" +#include "xml_parser.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CGroupFactory + { + public : + + /// Mutateurs /// + static void SetCurrentContextId(const StdString & context); + + template + static void AddGroup(boost::shared_ptr pgroup, + boost::shared_ptr cgroup); + + template + static void AddChild(boost::shared_ptr group, + boost::shared_ptr child); + + /// Accesseurs /// + static StdString & GetCurrentContextId(void); + + template + static boost::shared_ptr + GetGroup(boost::shared_ptr group, const StdString & id); + + template + static boost::shared_ptr + GetChild(boost::shared_ptr group, const StdString & id); + + template + static int GetGroupNum(boost::shared_ptr group); + template + static int GetGroupIdNum(boost::shared_ptr group); + template + static int GetChildNum(boost::shared_ptr group); + template + static int GetChildIdNum(boost::shared_ptr group); + + /// Tests /// + template + static bool HasGroup(boost::shared_ptr group, const StdString & id); + + template + static bool HasChild(boost::shared_ptr group, const StdString & id); + + /// Instanciateur /// + template + static boost::shared_ptr + CreateGroup(boost::shared_ptr group, const StdString & id = StdString("")); + + template + static boost::shared_ptr + CreateChild(boost::shared_ptr group, const StdString & id = StdString("")); + + private : + + /// Propriétés statiques /// + static StdString CurrContext; + + }; // class CGroupFactory +} // namespace xios + +//#include "group_factory_impl.hpp" +//#include "group_parser.hpp" + +#endif // __XMLIO_CGroupFactory__ diff --git a/src/group_factory_decl.cpp b/src/group_factory_decl.cpp new file mode 100644 index 0000000..c177556 --- /dev/null +++ b/src/group_factory_decl.cpp @@ -0,0 +1,27 @@ +#include "group_factory_impl.hpp" +#include "node_type.hpp" + +namespace xios +{ +# define macro(U) \ + template void CGroupFactory::AddGroup(shared_ptr pgroup,shared_ptr cgroup); \ + template void CGroupFactory::AddChild(shared_ptr group, shared_ptr child); \ + template shared_ptr CGroupFactory::GetGroup(shared_ptr group, const StdString & id); \ + template shared_ptr CGroupFactory::GetChild(shared_ptr group, const StdString & id); \ + template int CGroupFactory::GetGroupNum(shared_ptr group); \ + template int CGroupFactory::GetGroupIdNum(shared_ptr group); \ + template int CGroupFactory::GetChildNum(shared_ptr group); \ + template int CGroupFactory::GetChildIdNum(boost::shared_ptr group); \ + template bool CGroupFactory::HasGroup(shared_ptr group, const StdString & id); \ + template bool CGroupFactory::HasChild(boost::shared_ptr group, const StdString & id); \ + template shared_ptr CGroupFactory::CreateGroup(shared_ptr group, const StdString & id ); \ + template shared_ptr CGroupFactory::CreateChild(shared_ptr group, const StdString & id); + + macro(CFieldGroup) + macro(CFileGroup) + macro(CGridGroup) + macro(CAxisGroup) + macro(CDomainGroup) + macro(CContextGroup) + macro(CVariableGroup) +} diff --git a/src/group_factory_impl.hpp b/src/group_factory_impl.hpp new file mode 100644 index 0000000..0c8efc9 --- /dev/null +++ b/src/group_factory_impl.hpp @@ -0,0 +1,140 @@ +#ifndef __XMLIO_CGroupFactory_impl__ +#define __XMLIO_CGroupFactory_impl__ + +#include "group_factory.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + template + void CGroupFactory::AddGroup(boost::shared_ptr pgroup, + boost::shared_ptr cgroup) + { + if (cgroup.get() == NULL || pgroup.get() == NULL ) + ERROR("CGroupFactory::AddGroup(boost::shared_ptr pgroup, boost::shared_ptr cgroup)", + << " pgroup or cgroup NULL !"); + if (!cgroup->hasId()) + pgroup->groupList.insert(pgroup->groupList.end(), cgroup.get()); + else + { + pgroup->groupList.insert(pgroup->groupList.end(), cgroup.get()); + pgroup->groupMap.insert(std::make_pair(cgroup->getId(), cgroup.get())); + } + } + + template + void CGroupFactory::AddChild(boost::shared_ptr group, + boost::shared_ptr child) + { + if (group.get() == NULL || child.get() == NULL ) + ERROR("CGroupFactory::AddGroup(boost::shared_ptr pgroup, boost::shared_ptr cgroup)", + << " pgroup or cgroup NULL !"); + if (!child->hasId()) + group->childList.insert(group->childList.end(), child.get()); + else + { + group->childList.insert(group->childList.end(), child.get()); + group->childMap.insert(std::make_pair(child->getId(), child.get())); + } + } + + template + boost::shared_ptr + CGroupFactory::CreateGroup(boost::shared_ptr group, const StdString & id) + { + CObjectFactory::SetCurrentContextId + (CGroupFactory::GetCurrentContextId()); + if (id.size() == 0) + { + boost::shared_ptr value = CObjectFactory::CreateObject(CObjectFactory::GenUId()); + group->groupList.insert(group->groupList.end(), value.get()); + group->groupMap.insert(std::make_pair(value->getId(), value.get())); + return (value); + } + else if (CGroupFactory::HasGroup(group, id)) + return (CGroupFactory::GetGroup(group, id)); + else + { + boost::shared_ptr value = CObjectFactory::CreateObject(id); + group->groupList.insert(group->groupList.end(), value.get()); + group->groupMap.insert(std::make_pair(id, value.get())); + return (value); + } + } + + template + boost::shared_ptr + CGroupFactory::CreateChild(boost::shared_ptr group, const StdString & id) + { + CObjectFactory::SetCurrentContextId + (CGroupFactory::GetCurrentContextId()); + if (id.size() == 0) + { + boost::shared_ptr value = + CObjectFactory::CreateObject(); + group->childList.insert(group->childList.end(), value.get()); + group->childMap.insert(std::make_pair(value->getId(), value.get())); + return (value); + } + else if (CGroupFactory::HasChild(group, id)) + return (CGroupFactory::GetChild(group, id)); + else + { + boost::shared_ptr value = + CObjectFactory::CreateObject(id); + group->childList.insert(group->childList.end(), value.get()); + group->childMap.insert(std::make_pair(id, value.get())); + return (value); + } + } + + template + bool CGroupFactory::HasGroup(boost::shared_ptr group, const StdString & id) + { return (group->groupMap.find(id) != group->groupMap.end()); } + + template + bool CGroupFactory::HasChild(boost::shared_ptr group, const StdString & id) + { return (group->childMap.find(id) != group->childMap.end()); } + + template + int CGroupFactory::GetGroupNum(boost::shared_ptr group) + { return (group->groupList.size()); } + + template + int CGroupFactory::GetGroupIdNum(boost::shared_ptr group) + { return (group->groupMap.size()); } + + template + int CGroupFactory::GetChildNum(boost::shared_ptr group) + { return (group->childList.size()); } + + template + int CGroupFactory::GetChildIdNum(boost::shared_ptr group) + { return (group->childMap.size()); } + + template + boost::shared_ptr + CGroupFactory::GetGroup(boost::shared_ptr group, const StdString & id) + { + if (!CGroupFactory::HasGroup(group, id)) + ERROR("CGroupFactory::GetGroup(boost::shared_ptr group, const StdString & id)", + << "[ id = " << id << ", U = " << U::GetName() << " ] " + << " group is not referenced !"); + return (group->groupMap[id]->getShared()); + } + + template + boost::shared_ptr + CGroupFactory::GetChild(boost::shared_ptr group, const StdString & id) + { + if (!CGroupFactory::HasChild(group, id)) + ERROR("CGroupFactory::GetChild(boost::shared_ptr group, const StdString & id)", + << "[ id = " << id << ", U = " << U::GetName() << " ] " + << " child is not referenced !"); + return (group->childMap[id]->getShared()); + } + +} // namespace xios + +#endif // __XMLIO_CGroupFactory_impl__ diff --git a/src/group_parser.hpp b/src/group_parser.hpp new file mode 100644 index 0000000..7ebb6ce --- /dev/null +++ b/src/group_parser.hpp @@ -0,0 +1,127 @@ +#ifndef __XMLIO_GroupParser__ +#define __XMLIO_GroupParser__ + +/// boost headers /// +#include + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + template + void CGroupTemplate::parse(xml::CXMLNode & node, bool withAttr) + { + + StdString name = node.getElementName(); + xml::THashAttributes attributes = node.getAttributes(); + if (withAttr) + { + CGroupTemplate::SuperClass::parse(node); + if (attributes.end() != attributes.find("src")) + { + StdIFStream ifs ( attributes["src"].c_str() , StdIFStream::in ); + if ( (ifs.rdstate() & std::ifstream::failbit ) != 0 ) + ERROR(" void CGroupTemplate::parse(xml::CXMLNode & node, bool withAttr)", + < file" ); + if (!ifs.good()) + ERROR("CGroupTemplate::parse(xml::CXMLNode & node, bool withAttr)", + << "[ filename = " << attributes["src"] << " ] Bad xml stream !"); + xml::CXMLParser::ParseInclude(ifs, attributes["src"].c_str(), *this); + } + } + + // PARSING POUR GESTION DES ENFANTS + V* group_ptr = (this->hasId()) + ? V::get(this->getId()) + : boost::polymorphic_downcast(this); + + if (!(node.goToChildElement())) + { + if (this->hasId()) + { + DEBUG(<< "L'objet de type \'" << V::GetName() + << "\' nommé \'" << this->getId() + << "\' ne contient pas d\'enfant !"); + } + } + else + { + do { // Parcours pour traitement. + + StdString name = node.getElementName(); + attributes.clear(); + attributes = node.getAttributes(); + + if (name.compare(V::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateGroup(group_ptr->getShared())->parse(node); + else + CGroupFactory::CreateGroup(group_ptr->getShared(), attributes["id"])->parse(node); + continue; + } + + if (name.compare(U::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateChild(group_ptr->getShared())->parse(node); + else + CGroupFactory::CreateChild(group_ptr->getShared(), attributes["id"])->parse(node); + continue; + } + + DEBUG(<< "Dans le contexte \'" << CContext::getCurrent()->getId() + << "\', un objet de type \'" << V::GetName() + << "\' ne peut contenir qu'un objet de type \'" << V::GetName() + << "\' ou de type \'" << U::GetName() + << "\' (reçu : " << name << ") !"); + + } while (node.goToNextElement()); + node.goToParentElement(); // Retour au parent + } + } + + /// ////////////////////// Définitions ////////////////////// /// + template + void CGroupTemplate::parseChild(xml::CXMLNode & node) + { + + + // PARSING POUR GESTION DES ENFANTS + V* group_ptr = (this->hasId()) + ? V::get(this->getId()) + : boost::polymorphic_downcast(this); + + StdString name = node.getElementName(); + attributes.clear(); + attributes = node.getAttributes(); + + if (name.compare(V::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateGroup(group_ptr->getShared())->parse(node); + return ; + else + CGroupFactory::CreateGroup(group_ptr->getShared(), attributes["id"])->parse(node); + continue; + } + + if (name.compare(U::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateChild(group_ptr->getShared())->parse(node); + return ; + else + CGroupFactory::CreateChild(group_ptr->getShared(), attributes["id"])->parse(node); + continue; + } + + DEBUG(<< "Dans le contexte \'" << CContext::getCurrent()->getId() + << "\', un objet de type \'" << V::GetName() + << "\' ne peut contenir qu'un objet de type \'" << V::GetName() + << "\' ou de type \'" << U::GetName() + << "\' (reçu : " << name << ") !"); + + } +} // namespace xios + +#endif // __XMLIO_GroupParser__ diff --git a/src/group_template.hpp b/src/group_template.hpp new file mode 100644 index 0000000..dd24e08 --- /dev/null +++ b/src/group_template.hpp @@ -0,0 +1,106 @@ +#ifndef __XMLIO_CGroupTemplate__ +#define __XMLIO_CGroupTemplate__ + +#include "xmlioserver_spl.hpp" +#include "declare_attribute.hpp" +#include "event_server.hpp" +#include "object_template.hpp" + +namespace xios +{ + + /// ////////////////////// Déclarations ////////////////////// /// + template + class CGroupTemplate + : public CObjectTemplate, public virtual W + { + /// Friend /// + friend class CGroupFactory; + + /// Typedef /// + typedef U Child; + typedef V Derived, Group; + typedef W SuperClassAttribute; + typedef CObjectTemplate SuperClass; + + public : + + enum EEventId + { + EVENT_ID_CREATE_CHILD=200, EVENT_ID_CREATE_CHILD_GROUP + } ; + + /// Spécifique /// + DECLARE_ATTRIBUTE(StdString, group_ref) + + /// Accesseurs /// + const xios_map& getGroupMap(void) const; + const vector& getChildList(void) const; + + void getAllChildren(vector & allc) const; + vector getAllChildren(void) const; + + /// Autres /// + virtual StdString toString(void) const; + virtual void fromString(const StdString & str); + +// virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + + virtual void parse(xml::CXMLNode & node); + virtual void parse(xml::CXMLNode & node, bool withAttr); + virtual void parseChild(xml::CXMLNode & node); + + /// Test /// + virtual bool hasChild(void) const; + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + + /// Traitements /// + virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0); + void solveRefInheritance(void); +// static bool has(const string & id); +// static boost::shared_ptr get(const string& id) ; +// static boost::shared_ptr create(const string& id=string("")) ; + U* createChild(const string& id="") ; + + void addChild(U* child) ; + V* createChildGroup(const string& id="") ; + void addChildGroup(V* childGroup) ; + static bool dispatchEvent(CEventServer& event) ; + void sendCreateChild(const string& id="") ; + void sendCreateChildGroup(const string& id="") ; + static void recvCreateChild(CEventServer& event) ; + void recvCreateChild(CBufferIn& buffer) ; + static void recvCreateChildGroup(CEventServer& event) ; + void recvCreateChildGroup(CBufferIn& buffer) ; + + /// Destructeur /// + virtual ~CGroupTemplate(void); + + protected : + + /// Constructeurs /// + CGroupTemplate(void); + CGroupTemplate(const StdString & id); + CGroupTemplate(const CGroupTemplate & group, + bool withAttrList = true, bool withId = true); // Not implemented yet. + CGroupTemplate(const CGroupTemplate * const group); // Not implemented yet. + + private : + + /// Propriétés /// + xios_map childMap; + vector childList; + + xios_map groupMap; + vector groupList; + + }; // class CGroupTemplate +} // namespace xios + +//#include "group_template_impl.hpp" + +#endif // __XMLIO_CGroupTemplate__ diff --git a/src/group_template_decl.cpp b/src/group_template_decl.cpp new file mode 100644 index 0000000..3b44df6 --- /dev/null +++ b/src/group_template_decl.cpp @@ -0,0 +1,18 @@ +#include "group_template_impl.hpp" +#include "node_type.hpp" + +namespace xios +{ +# define macro(T) \ + template class CGroupTemplate ; + + macro(Context) + macro(Field) + macro(File) + macro(Domain) + macro(Grid) + macro(Axis) + macro(Variable) + + +} diff --git a/src/group_template_impl.hpp b/src/group_template_impl.hpp new file mode 100644 index 0000000..91b8e6f --- /dev/null +++ b/src/group_template_impl.hpp @@ -0,0 +1,594 @@ +#ifndef __XMLIO_CGroupTemplate_impl__ +#define __XMLIO_CGroupTemplate_impl__ + +#include "xmlioserver_spl.hpp" +#include "event_server.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "context.hpp" +#include "event_client.hpp" +#include "context_client.hpp" +#include "message.hpp" +#include "type.hpp" +#include "type_util.hpp" + + +namespace xios +{ + + /// ////////////////////// Définitions ////////////////////// /// + + template + CGroupTemplate::CGroupTemplate(void) + : CObjectTemplate() //, V() + , childMap(), childList() + , groupMap(), groupList() + { /* Ne rien faire de plus */ } + + template + CGroupTemplate::CGroupTemplate(const StdString & id) + : CObjectTemplate(id) //, V() + , childMap(), childList() + , groupMap(), groupList() + { /* Ne rien faire de plus */ } + + template + CGroupTemplate::~CGroupTemplate(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- +/* + template + void CGroupTemplate::toBinary(StdOStream & os) const + { + SuperClass::toBinary(os); + + const StdSize grpnb = this->groupList.size(); + const StdSize chdnb = this->childList.size(); + ENodeType cenum = U::GetType(); + ENodeType genum = V::GetType(); + + os.write (reinterpret_cast(&grpnb) , sizeof(StdSize)); + os.write (reinterpret_cast(&chdnb) , sizeof(StdSize)); + + typename std::vector::const_iterator + itg = this->groupList.begin(), endg = this->groupList.end(); + typename std::vector::const_iterator + itc = this->childList.begin(), endc = this->childList.end(); + + for (; itg != endg; itg++) + { + V* group = *itg; + bool hid = group->hasId(); + + os.write (reinterpret_cast(&genum), sizeof(ENodeType)); + os.write (reinterpret_cast(&hid), sizeof(bool)); + + if (hid) + { + const StdString & id = group->getId(); + const StdSize size = id.size(); + + os.write (reinterpret_cast(&size), sizeof(StdSize)); + os.write (id.data(), size * sizeof(char)); + } + group->toBinary(os); + } + + for (; itc != endc; itc++) + { + U* child = *itc; + bool hid = child->hasId(); + + os.write (reinterpret_cast(&cenum), sizeof(ENodeType)); + os.write (reinterpret_cast(&hid), sizeof(bool)); + + if (hid) + { + const StdString & id = child->getId(); + const StdSize size = id.size(); + + os.write (reinterpret_cast(&size), sizeof(StdSize)); + os.write (id.data(), size * sizeof(char)); + } + child->toBinary(os); + } + + } + + template + void CGroupTemplate::fromBinary(StdIStream & is) + { + SuperClass::fromBinary(is); + + V* group_ptr = (this->hasId()) + ? V::get(this->getId()) + : V::get((V*)this); + + StdSize grpnb = 0; + StdSize chdnb = 0; + ENodeType renum = Unknown; + + is.read (reinterpret_cast(&grpnb), sizeof(StdSize)); + is.read (reinterpret_cast(&chdnb), sizeof(StdSize)); + + for (StdSize i = 0; i < grpnb; i++) + { + bool hid = false; + is.read (reinterpret_cast(&renum), sizeof(ENodeType)); + is.read (reinterpret_cast(&hid), sizeof(bool)); + + if (renum != V::GetType()) + ERROR("CGroupTemplate::fromBinary(StdIStream & is)", + << "[ renum = " << renum << "] Bad type !"); + + if (hid) + { + StdSize size = 0; + is.read (reinterpret_cast(&size), sizeof(StdSize)); + StdString id(size, ' '); + is.read (const_cast(id.data()), size * sizeof(char)); + CGroupFactory::CreateGroup(group_ptr->getShared(), id)->fromBinary(is); + } + else + { + CGroupFactory::CreateGroup(group_ptr->getShared())->fromBinary(is); + } + } + + for (StdSize j = 0; j < chdnb; j++) + { + bool hid = false; + is.read (reinterpret_cast(&renum), sizeof(ENodeType)); + is.read (reinterpret_cast(&hid), sizeof(bool)); + + if (renum != U::GetType()) + ERROR("CGroupTemplate::fromBinary(StdIStream & is)", + << "[ renum = " << renum << "] Bad type !"); + + if (hid) + { + StdSize size = 0; + is.read (reinterpret_cast(&size), sizeof(StdSize)); + StdString id(size, ' '); + is.read (const_cast(id.data()), size * sizeof(char)); + CGroupFactory::CreateChild(group_ptr->getShared(), id)->fromBinary(is); + } + else + { + CGroupFactory::CreateChild(group_ptr->getShared())->fromBinary(is); + } + } + } +*/ + //-------------------------------------------------------------- + + template + StdString CGroupTemplate::toString(void) const + { + StdOStringStream oss; + StdString name = (this->getId().compare(V::GetDefName()) != 0) + ? V::GetName() : V::GetDefName(); + + oss << "<" << name << " "; + if (this->hasId() && (this->getId().compare(V::GetDefName()) != 0)) + oss << " id=\"" << this->getId() << "\" "; + + if (this->hasChild()) + { + oss << SuperClassAttribute::toString() << ">" << std::endl; + + typename std::vector::const_iterator + itg = this->groupList.begin(), endg = this->groupList.end(); + typename std::vector::const_iterator + itc = this->childList.begin(), endc = this->childList.end(); + + for (; itg != endg; itg++) + { + V* group = *itg; + oss << *group << std::endl; + } + + for (; itc != endc; itc++) + { + U* child = *itc; + oss << *child << std::endl; + } + + oss << ""; + } + else + { + oss << SuperClassAttribute::toString() << "/>"; + } + return (oss.str()); + } + + template + void CGroupTemplate::fromString(const StdString & str) + { + ERROR("CGroupTemplate::toString(void)", + << "[ str = " << str << "] Not implemented yet !"); + } + + //--------------------------------------------------------------- + + template + StdString CGroupTemplate::GetName(void) + { + return (U::GetName().append("_group")); + } + + template + StdString CGroupTemplate::GetDefName(void) + { + return (U::GetName().append("_definition")); + } + + //--------------------------------------------------------------- + + template + const std::vector& + CGroupTemplate::getChildList(void) const + { + return (this->childList); + } + + //--------------------------------------------------------------- + + template + const xios_map& + CGroupTemplate::getGroupMap(void) const + { + return (this->groupMap); + } + + //--------------------------------------------------------------- + + template + bool CGroupTemplate::hasChild(void) const + { + return ((groupList.size() + childList.size()) > 0); + } + + //--------------------------------------------------------------- + + template + void CGroupTemplate::parse(xml::CXMLNode & node) + { + this->parse(node, true); + } + + //--------------------------------------------------------------- + + template + void CGroupTemplate::solveDescInheritance(bool apply, const CAttributeMap * const parent) + { + if (parent != NULL) + SuperClassAttribute::setAttributes(parent, apply); + + typename std::vector::const_iterator + itc = this->childList.begin(), endc = this->childList.end(); + typename std::vector::const_iterator + itg = this->groupList.begin(), endg = this->groupList.end(); + + for (; itc != endc; itc++) + { + U* child = *itc; + child->solveDescInheritance(apply,this); + } + + for (; itg != endg; itg++) + { + V* group = *itg; + if (apply) group->solveRefInheritance(); + group->solveDescInheritance(apply,this); + } + } + + //--------------------------------------------------------------- + + template + void CGroupTemplate::getAllChildren(std::vector& allc) const + { + allc.insert (allc.end(), childList.begin(), childList.end()); + typename std::vector::const_iterator + itg = this->groupList.begin(), endg = this->groupList.end(); + + for (; itg != endg; itg++) + { + V* group = *itg; + group->getAllChildren(allc); + } + } + + //--------------------------------------------------------------- + + template + std::vector CGroupTemplate::getAllChildren(void) const + { + std::vector allc; + this->getAllChildren(allc); + return (allc); + } + + //--------------------------------------------------------------- + + template + void CGroupTemplate::solveRefInheritance(void) + { /* Ne rien faire de plus */ } + +// template +// bool CGroupTemplate::has(const string& id) +// { +// return CObjectFactory::HasObject(id) ; +// } + +// template +// boost::shared_ptr CGroupTemplate::get(const string& id) +// { +// return CObjectFactory::GetObject(id) ; +// } + +// template +// boost::shared_ptr CGroupTemplate::get() +// { +// return CObjectFactory::GetObject(this) ; +// } + +// template +// boost::shared_ptr CGroupTemplate::create(const string& id) +// { +// return CObjectFactory::CreateObject(id) ; +// } + ///-------------------------------------------------------------- + + + template + U* CGroupTemplate::createChild(const string& id) + { + return CGroupFactory::CreateChild(this->getShared(), id).get() ; + } + + template + void CGroupTemplate::addChild(U* child) + { + return CGroupFactory::AddChild(this->getShared(),child->getShared()) ; + } + + template + V* CGroupTemplate::createChildGroup(const string& id) + { + return CGroupFactory::CreateGroup(this->getShared(), id).get() ; + } + + template + void CGroupTemplate::addChildGroup(V* childGroup) + { + return CGroupFactory::AddGroup(this->getShared(), childGroup->getShared()) ; + } + + + template + void CGroupTemplate::sendCreateChild(const string& id) + { + CContext* context=CContext::getCurrent() ; + + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_CREATE_CHILD) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + template + void CGroupTemplate::sendCreateChildGroup(const string& id) + { + CContext* context=CContext::getCurrent() ; + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_CREATE_CHILD_GROUP) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + template + void CGroupTemplate::recvCreateChild(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + V::get(id)->recvCreateChild(*buffer) ; + } + + + template + void CGroupTemplate::recvCreateChild(CBufferIn& buffer) + { + string id ; + buffer>>id ; + createChild(id) ; + } + + template + void CGroupTemplate::recvCreateChildGroup(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + V::get(id)->recvCreateChildGroup(*buffer) ; + } + + + template + void CGroupTemplate::recvCreateChildGroup(CBufferIn& buffer) + { + string id ; + buffer>>id ; + createChildGroup(id) ; + } + + + template + bool CGroupTemplate::dispatchEvent(CEventServer& event) + { + if (CObjectTemplate::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_CREATE_CHILD : + recvCreateChild(event) ; + return true ; + break ; + + case EVENT_ID_CREATE_CHILD_GROUP : + recvCreateChildGroup(event) ; + return true ; + break ; + + default : + return false ; + } + } + } + + template + void CGroupTemplate::parse(xml::CXMLNode & node, bool withAttr) + { + + StdString name = node.getElementName(); + xml::THashAttributes attributes = node.getAttributes(); + if (withAttr) + { + CGroupTemplate::SuperClass::parse(node); + if (attributes.end() != attributes.find("src")) + { + StdIFStream ifs ( attributes["src"].c_str() , StdIFStream::in ); + if ( (ifs.rdstate() & std::ifstream::failbit ) != 0 ) + ERROR("void CGroupTemplate::parse(xml::CXMLNode & node, bool withAttr)", + < file" ); + + if (!ifs.good()) + ERROR("CGroupTemplate::parse(xml::CXMLNode & node, bool withAttr)", + << "[ filename = " << attributes["src"] << " ] Bad xml stream !"); + xml::CXMLParser::ParseInclude(ifs, attributes["src"].c_str(), *this); + } + } + + // PARSING POUR GESTION DES ENFANTS + V* group_ptr = (this->hasId()) + ? V::get(this->getId()) + : boost::polymorphic_downcast(this); + + if (!(node.goToChildElement())) + { + if (this->hasId()) + { + DEBUG(<< "L'objet de type \'" << V::GetName() + << "\' nommé \'" << this->getId() + << "\' ne contient pas d\'enfant !"); + } + } + else + { + do { // Parcours pour traitement. + + StdString name = node.getElementName(); + attributes.clear(); + attributes = node.getAttributes(); + + if (name.compare(V::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateGroup(group_ptr->getShared())->parse(node); + else + CGroupFactory::CreateGroup(group_ptr->getShared(), attributes["id"])->parse(node); + continue; + } + + if (name.compare(U::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateChild(group_ptr->getShared())->parse(node); + else + CGroupFactory::CreateChild(group_ptr->getShared(), attributes["id"])->parse(node); + continue; + } + + DEBUG(<< "Dans le contexte \'" << CContext::getCurrent()->getId() + << "\', un objet de type \'" << V::GetName() + << "\' ne peut contenir qu'un objet de type \'" << V::GetName() + << "\' ou de type \'" << U::GetName() + << "\' (reçu : " << name << ") !"); + + } while (node.goToNextElement()); + node.goToParentElement(); // Retour au parent + } + } + + template + void CGroupTemplate::parseChild(xml::CXMLNode & node) + { + + + // PARSING POUR GESTION DES ENFANTS + V* group_ptr = (this->hasId()) + ? V::get(this->getId()) + : boost::polymorphic_downcast(this); + + StdString name = node.getElementName(); + xml::THashAttributes attributes = node.getAttributes(); + + if (name.compare(V::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateGroup(group_ptr->getShared())->parse(node); + else + CGroupFactory::CreateGroup(group_ptr->getShared(), attributes["id"])->parse(node); + return ; + } + else if (name.compare(U::GetName()) == 0) + { + if (attributes.end() == attributes.find("id")) + CGroupFactory::CreateChild(group_ptr->getShared())->parse(node); + else + CGroupFactory::CreateChild(group_ptr->getShared(), attributes["id"])->parse(node); + return ; + } + + DEBUG(<< "Dans le contexte \'" << CContext::getCurrent()->getId() + << "\', un objet de type \'" << V::GetName() + << "\' ne peut contenir qu'un objet de type \'" << V::GetName() + << "\' ou de type \'" << U::GetName() + << "\' (reçu : " << name << ") !"); + + } +} // namespace xios + + +#endif // __XMLIO_CGroupTemplate_impl__ diff --git a/src/indent.cpp b/src/indent.cpp new file mode 100644 index 0000000..74673cf --- /dev/null +++ b/src/indent.cpp @@ -0,0 +1,71 @@ +#include "indent.hpp" +#include +#include + +using namespace std ; + +namespace xios +{ + Cindent iendl ; + Cindent ireset(0,true) ; + int Cindent::defaultIncSize=2 ; + int Cindent::index=ios::xalloc() ; + + Cindent::Cindent(int i,bool r) : offset(i), reset(r), incSize(defaultIncSize) + { } + + Cindent Cindent::operator++() + { + return Cindent(incSize) ; + } + + Cindent Cindent::operator--() + { + return Cindent(-incSize) ; + } + + Cindent Cindent::operator++(int) + { + return Cindent(incSize) ; + } + + Cindent Cindent::operator--(int) + { + return Cindent(-incSize) ; + } + + Cindent Cindent::operator+=(int i) + { + return Cindent(incSize*i) ; + } + + Cindent Cindent::operator-=(int i) + { + return Cindent(-incSize*i) ; + } + + ostream& Cindent::iendl(ostream& o) const + { + if (reset) + { + o.iword(index)=0 ; + return o ; + } + else + { + o.iword(index)+=offset ; + if (o.iword(index)<0) o.iword(index)=0 ; + o<<"\n" ; + int mem=o.width(o.iword(index)) ; + o<<""; + o.width(mem) ; + return o ; + } + } + + ostream& operator <<(ostream& o, const Cindent& indent) + { + return indent.iendl(o) ; + } + +} diff --git a/src/indent.hpp b/src/indent.hpp new file mode 100644 index 0000000..8af2f6b --- /dev/null +++ b/src/indent.hpp @@ -0,0 +1,34 @@ +#ifndef __XIOS_INDENT_HPP__ +#define __XIOS_INDENT_HPP__ + +#include + +namespace xios +{ + class Cindent + { + public: + static int defaultIncSize; + static int index ; + int incSize ; + int offset ; + bool reset ; + public : + + Cindent(int i=0, bool r=false) ; + Cindent operator++(int) ; + Cindent operator--(int) ; + Cindent operator++() ; + Cindent operator--() ; + Cindent operator+=(int n) ; + Cindent operator-=(int n) ; + std::ostream& iendl(std::ostream& o) const ; + }; + + std::ostream& operator <<(std::ostream& o, const Cindent& indent) ; + + extern Cindent iendl; + extern Cindent ireset; + +} +#endif diff --git a/src/indent_xml.cpp b/src/indent_xml.cpp new file mode 100644 index 0000000..59cb84f --- /dev/null +++ b/src/indent_xml.cpp @@ -0,0 +1,53 @@ +#include "indent_xml.hpp" + +/// boost headers /// +#include +#include + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + unsigned int CIndent::Indent = 0; + StdString CIndent::Increm = StdString(" "); + bool CIndent::WithLine = false; + + StdOStream & CIndent::NIndent(StdOStream& out) + { + static unsigned int LineNB = 1; + if (CIndent::WithLine) out << LineNB++ << ". "; + for(unsigned int i = 0; i < CIndent::Indent; out << CIndent::Increm , i++){} + return (out); + } + + StdOStream & CIndent::IncIndent(StdOStream& out) + { CIndent::Indent++; return (CIndent::NIndent(out)); } + + StdOStream & CIndent::DecEndl (StdOStream& out) + { CIndent::Indent--; return (out); } + + ///---------------------------------------- + + StdString CIndentedXml::Indented(const StdString & content) + { + StdOStringStream retvalue; + std::vector str; + boost::split(str, content, boost::is_any_of("\n")); + + std::vector::iterator it = str.begin(), end = str.end(); + + for (; it != end; it++) + { + StdString & line = *it; + if (line.find("") != StdString::npos) + retvalue << CIndent::IncIndent << line << CIndent::DecEndl << std::endl; + else + retvalue << CIndent::IncIndent << line << std::endl; + } + return (retvalue.str()); + } +} // namespace xios diff --git a/src/indent_xml.hpp b/src/indent_xml.hpp new file mode 100644 index 0000000..10c699e --- /dev/null +++ b/src/indent_xml.hpp @@ -0,0 +1,50 @@ +#ifndef __XMLIO_CIndent_XML__ +#define __XMLIO_CIndent_XML__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "xml_node.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CIndent + { + public : + + /// Méthodes statiques /// + static StdOStream & NIndent (StdOStream & out); + static StdOStream & IncIndent(StdOStream & out); + static StdOStream & DecEndl (StdOStream & out); + + private : + + /// Propriétés statiques /// + static unsigned int Indent; + static StdString Increm; + static bool WithLine; + + }; // class CIndent + + ///-------------------------------------------------------------- + + class CIndentedXml + { + public : + + /// Méthode statique /// + static StdString Indented(const StdString & content); + + }; // class CIndentedXml + + ///-------------------------------------------------------------- + +} // namespace xios + + /// ////////////////////// Macros ////////////////////// /// + +#define NIndent CIndent::NIndent +#define IncIndent CIndent::IncIndent +#define DecEndl CIndent::DecEndl + +#endif // __XMLIO_CIndent__ diff --git a/src/input/inetcdf4.cpp b/src/input/inetcdf4.cpp new file mode 100644 index 0000000..4b29709 --- /dev/null +++ b/src/input/inetcdf4.cpp @@ -0,0 +1,788 @@ +#include "inetcdf4.hpp" + +#include + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CINetCDF4::CINetCDF4(const StdString & filename) + { + CheckError(nc_open(filename.c_str(), NC_NOWRITE, &this->ncidp)); + } + + CINetCDF4::~CINetCDF4(void) + { + CheckError(nc_close(this->ncidp)); + } + + ///-------------------------------------------------------------- + + void CINetCDF4::CheckError(int status) + { + if (status != NC_NOERR) + { + StdString errormsg (nc_strerror(status)); // fuite mémoire ici ? + ERROR("CINetCDF4::CheckError(int status)", + << "[ status = " << status << " ] " << errormsg); + } + } + + //--------------------------------------------------------------- + + int CINetCDF4::getGroup(const CVarPath * const path) + { + int retvalue = this->ncidp; + if (path == NULL) return (retvalue); + CVarPath::const_iterator it = path->begin(), end = path->end(); + + for (; it != end; it++) + { + const StdString & groupid = *it; + CheckError(nc_inq_ncid(retvalue, const_cast(groupid.c_str()), &retvalue)); + } + + return (retvalue); + } + + int CINetCDF4::getVariable(const StdString & varname, + const CVarPath * const path) + { + int varid = 0; + int grpid = this->getGroup(path); + CheckError(nc_inq_varid (grpid, varname.c_str(), &varid)); + return (varid); + } + + int CINetCDF4::getDimension(const StdString & dimname, + const CVarPath * const path) + { + int dimid = 0; + int grpid = this->getGroup(path); + CheckError(nc_inq_dimid (grpid, dimname.c_str(), &dimid)); + return (dimid); + } + + std::pair CINetCDF4::getAttribute + (const StdString & attname, + const StdString * const var, + const CVarPath * const path) + { + std::pair retvalue; + int grpid = this->getGroup(path); + int varid = (var != NULL) + ? this->getVariable(*var, path) : NC_GLOBAL; + CheckError(nc_inq_att(grpid, varid, attname.c_str(), + &retvalue.first, &retvalue.second)); + return (retvalue); + } + + int CINetCDF4::getUnlimitedDimension(const CVarPath * const path) + { + int dimid = 0; + int grpid = this->getGroup(path); + CheckError(nc_inq_unlimdim (grpid, &dimid)); + return (dimid); + } + + StdString CINetCDF4::getUnlimitedDimensionName(const CVarPath * const path) + { + char full_name_in[NC_MAX_NAME +1]; + int grpid = this->getGroup(path); + int dimid = this->getUnlimitedDimension(path); + CheckError(nc_inq_dimname(grpid, dimid, full_name_in)); + + StdString dimname(full_name_in); + return (dimname); + } + + //--------------------------------------------------------------- + StdSize CINetCDF4::getNbVertex(const StdString & name, + const CVarPath * const path) + { + + if (this->isRectilinear(name, path) || + this->isCurvilinear(name, path)) + { + if (this->is3Dim(name, path)) return (8); + else return (4); + } + if (this->isUnstructured(name, path)) + { + StdString bound = this->getBoundsId + (this->getCoordinatesIdList(name, path).back(), path); + StdString dim = this->getDimensionsList(&bound, path).back(); + return (this->getDimensions(&bound, path)[dim]); + } + return ((size_t)(-1)); + } + + //--------------------------------------------------------------- + + std::list CINetCDF4::getGroups(const CVarPath * const path) + { + StdSize strlen = 0; + char full_name_in[NC_MAX_NAME +1]; + int nbgroup = 0, *groupid = NULL; + int grpid = this->getGroup(path); + std::list retvalue; + + CheckError(nc_inq_grps(grpid, &nbgroup, NULL)); + groupid = new int[nbgroup](); + CheckError(nc_inq_grps(grpid, NULL, groupid)); + + for (int i = 0; i < nbgroup; i++) + { + CheckError(nc_inq_grpname_full(groupid[i], &strlen, full_name_in)); + StdString groupname(full_name_in, strlen); + retvalue.push_back(groupname); + } + + delete [] groupid; + return (retvalue); + } + + std::list CINetCDF4::getVariables(const CVarPath * const path) + { + char full_name_in[NC_MAX_NAME +1]; + int nbvar = 0, *varid = NULL; + int grpid = this->getGroup(path); + std::list retvalue; + + CheckError(nc_inq_varids(grpid, &nbvar, NULL)); + varid = new int[nbvar](); + CheckError(nc_inq_varids(grpid, NULL, varid)); + + for (int i = 0; i < nbvar; i++) + { + CheckError(nc_inq_varname(grpid, varid[i], full_name_in)); + StdString varname(full_name_in); + retvalue.push_back(varname); + } + + delete [] varid; + return (retvalue); + } + + StdSize CINetCDF4::getNbOfTimestep(const CVarPath * const path) + { + return (this->getDimensions(NULL, path)[this->getUnlimitedDimensionName(path)]); + } + + std::set CINetCDF4::getBoundVariables(const CVarPath * const path) + { + std::set retvalue; + std::list variables = this->getVariables(path); + std::list::const_iterator it = variables.begin(), end = variables.end(); + for (; it != end; it++) + { + const StdString & var = *it; + if (this->hasBounds(var, path)) + retvalue.insert(retvalue.end(), this->getBoundsId(var, path)); + } + return (retvalue); + } + + std::set CINetCDF4::getCoordVariables(const CVarPath * const path) + { + std::set retvalue; + std::list variables = this->getVariables(path); + std::list::const_iterator it = variables.begin(), end = variables.end(); + for (; it != end; it++) + { + const StdString & var = *it; + std::list coords = this->getCoordinatesIdList(var, path); + std::list::const_iterator it = coords.begin(), end = coords.end(); + for (; it != end; it++) + { + const StdString & coord = *it; + if (this->hasVariable(coord, path)) + retvalue.insert(retvalue.end(), coord); + } + } + return (retvalue); + } + + std::list CINetCDF4::getDimensionsList + (const StdString * const var, const CVarPath * const path) + { + char full_name_in[NC_MAX_NAME +1]; + int nbdim = 0, *dimid = NULL; + int grpid = this->getGroup(path); + int varid = (var != NULL) + ? this->getVariable(*var, path) : NC_GLOBAL; + std::list retvalue; + + if (var != NULL) + { + CheckError(nc_inq_varndims(grpid, varid, &nbdim)); + dimid = new int[nbdim](); + CheckError(nc_inq_vardimid(grpid, varid, dimid)); + } + else + { + CheckError(nc_inq_dimids(grpid, &nbdim, NULL, 1)); + dimid = new int[nbdim](); + CheckError(nc_inq_dimids(grpid, NULL, dimid, 1)); + } + + for (int i = 0; i < nbdim; i++) + { + CheckError(nc_inq_dimname(grpid, dimid[i], full_name_in)); + StdString dimname(full_name_in); + retvalue.push_back(dimname); + } + delete [] dimid; + + return (retvalue); + } + + std::map CINetCDF4::getDimensions + (const StdString * const var, const CVarPath * const path) + { + StdSize size = 0; + char full_name_in[NC_MAX_NAME +1]; + int nbdim = 0, *dimid = NULL; + int grpid = this->getGroup(path); + int varid = (var != NULL) + ? this->getVariable(*var, path) : NC_GLOBAL; + std::map retvalue; + + if (var != NULL) + { + CheckError(nc_inq_varndims(grpid, varid, &nbdim)); + dimid = new int[nbdim](); + CheckError(nc_inq_vardimid(grpid, varid, dimid)); + } + else + { + CheckError(nc_inq_dimids(grpid, &nbdim, NULL, 1)); + dimid = new int[nbdim](); + CheckError(nc_inq_dimids(grpid, NULL, dimid, 1)); + } + + for (int i = 0; i < nbdim; i++) + { + CheckError(nc_inq_dimname(grpid, dimid[i], full_name_in)); + CheckError(nc_inq_dimlen (grpid, dimid[i], &size)); + + StdString dimname(full_name_in); + retvalue.insert(retvalue.end(), std::make_pair(dimname, size)); + } + delete [] dimid; + + return (retvalue); + } + + std::list CINetCDF4::getAttributes + (const StdString * const var, const CVarPath * const path ) + { + int nbatt = 0; + char full_name_in[NC_MAX_NAME +1]; + std::list retvalue; + int grpid = this->getGroup(path); + int varid = (var != NULL) + ? this->getVariable(*var, path) : NC_GLOBAL; + + if (var != NULL) + CheckError(nc_inq_varnatts (grpid, varid, &nbatt)); + else + CheckError(nc_inq_natts(grpid, &nbatt)); + + for (int i = 0; i < nbatt; i++) + { + CheckError(nc_inq_attname(grpid, varid, i, full_name_in)); + StdString attname(full_name_in); + retvalue.push_back(attname); + } + return (retvalue); + } + + int CINetCDF4::getAttributeId(const StdString & name, + const StdString * const var, + const CVarPath * const path) + { + int retvalue = 0; + std::list atts = this->getAttributes(var, path); + std::list::const_iterator it = atts.begin(), end = atts.end(); + for (; it != end; it++) + { + const StdString & attname = *it; + if (attname.compare(name) == 0) + return (retvalue); + retvalue++; + } + return (-1); + } + + //--------------------------------------------------------------- + + bool CINetCDF4::hasMissingValue(const StdString & name, + const CVarPath * const path) + { + return (this->hasAttribute("missing_value", &name, path) || + this->hasAttribute("_FillValue", &name, path)); + } + + bool CINetCDF4::hasAttribute(const StdString & name, + const StdString * const var , + const CVarPath * const path) + { + std::list atts = this->getAttributes(var, path); + std::list::const_iterator it = atts.begin(), end = atts.end(); + for (; it != end; it++) + { + const StdString & attname = *it; + if (attname.compare(name) == 0) return (true); + } + return (false); + } + + bool CINetCDF4::hasVariable(const StdString & name, + const CVarPath * const path) + { + std::list variables = this->getVariables(path); + std::list::const_iterator it = variables.begin(), end = variables.end(); + for (; it != end; it++) + { + const StdString & varname = *it; + if (varname.compare(name) == 0) return (true); + } + return (false); + } + + bool CINetCDF4::hasCoordinates(const StdString & name, + const CVarPath * const path) + { + return (this->hasAttribute("coordinates", &name, path)); + } + + bool CINetCDF4::hasBounds(const StdString & name, + const CVarPath * const path) + { + return (this->hasAttribute("bounds", &name, path)); + } + + bool CINetCDF4::hasTemporalDim(const CVarPath * const path) + { + return (this->getUnlimitedDimension(path) != -1); + } + + //--------------------------------------------------------------- + +#define GET_ATTRIBUTE_VALUE(type, func_ext, type_enum) \ + template <> \ + std::vector CINetCDF4::getAttributeValue \ + (const StdString & name, const StdString * const var, \ + const CVarPath * const path) \ + { \ + int grpid = this->getGroup(path); \ + int varid = (var != NULL) \ + ? this->getVariable(*var, path) : NC_GLOBAL; \ + std::pair attinfos = \ + this->getAttribute(name, var, path); \ + std::vector retvalue(attinfos.second); \ + if (attinfos.first != type_enum) \ + ERROR("CINetCDF4::getAttributeValue(name, var, path", \ + << "[ name : " << name \ + << ", type requested :" << attinfos.first \ + << ", type stored : " << type_enum << "]" \ + << " Invalid type !"); \ + CheckError(nc_get_att_##func_ext \ + (grpid, varid, name.c_str(), &(retvalue[0]))); \ + return (retvalue); \ + } + + GET_ATTRIBUTE_VALUE(double, double, NC_DOUBLE) + GET_ATTRIBUTE_VALUE(float , float , NC_FLOAT) + GET_ATTRIBUTE_VALUE(int , int , NC_INT) + GET_ATTRIBUTE_VALUE(char , text , NC_CHAR) + + template <> + StdString CINetCDF4::getAttributeValue + (const StdString & name, const StdString * const var, + const CVarPath * const path) + { + std::vector chart = this->getAttributeValue + >(name, var, path); + StdString retvalue(&(chart[0]), chart.size()); + return (retvalue); + } + + template <> + int CINetCDF4::getMissingValue(const StdString & name, + const CVarPath * const path) + { + if (this->hasAttribute("missing_value", &name, path)) + return (this->getAttributeValue >("missing_value", &name, path)[0]); + if (this->hasAttribute("_FillValue", &name, path)) + return (this->getAttributeValue >("_FillValue", &name, path)[0]); + return (0); + } + + template <> + double CINetCDF4::getMissingValue(const StdString & name, + const CVarPath * const path) + { + if (this->hasAttribute("missing_value", &name, path)) + return (this->getAttributeValue >("missing_value", &name, path)[0]); + if (this->hasAttribute("_FillValue", &name, path)) + return (this->getAttributeValue >("_FillValue", &name, path)[0]); + return (0); + } + + template <> + float CINetCDF4::getMissingValue(const StdString & name, + const CVarPath * const path) + { + if (this->hasAttribute("missing_value", &name, path)) + return (this->getAttributeValue >("missing_value", &name, path)[0]); + if (this->hasAttribute("_FillValue", &name, path)) + return (this->getAttributeValue >("_FillValue", &name, path)[0]); + return (0); + } + + //--------------------------------------------------------------- + + std::list CINetCDF4::getCoordinatesIdList + (const StdString & name, const CVarPath * const path) + { + std::list retvalue; + StdString value = this->getCoordinatesId(name, path); + + boost::split(retvalue, value, boost::is_any_of(" ")); + + std::list::iterator it = retvalue.begin(), end = retvalue.end(); + for (; it != end; it++) + { + StdString & coord = *it; + coord.assign(coord.data()); + } + return (retvalue); + } + + StdString CINetCDF4::getCoordinatesId + (const StdString & name, const CVarPath * const path) + { + StdString retvalue; + if (this->hasAttribute("coordinates", &name, path)) + { + return (this->getAttributeValue("coordinates", &name, path)); + } + else + { + std::list dims = this->getDimensionsList(&name, path); + std::list::const_iterator it = dims.begin(), end = dims.end(); + for (; it != end; it++) + { + const StdString & value = *it; + retvalue.append(value).push_back(' '); + } + retvalue.erase (retvalue.end()-1) ; + } + + return (retvalue); + } + + StdString CINetCDF4::getBoundsId(const StdString & name, + const CVarPath * const path) + { + StdString retvalue; + if (this->hasAttribute("bounds", &name, path)) + return (this->getAttributeValue("bounds", &name, path)); + return (retvalue); + } + + //--------------------------------------------------------------- + + bool CINetCDF4::isBound(const StdString & name, + const CVarPath * const path) + { + std::set bounds = this->getBoundVariables(path); + return (bounds.find(name) != bounds.end()); + } + + bool CINetCDF4::isCoordinate(const StdString & name, + const CVarPath * const path) + { + std::set coords = this->getCoordVariables(path); + return (coords.find(name) != coords.end()); + } + + bool CINetCDF4::isRectilinear(const StdString & name, const CVarPath * const path) + { + std::list coords = this->getCoordinatesIdList(name, path); + std::list::const_iterator it = coords.begin(), end = coords.end(); + for (; it != end; it++) + { + const StdString & coord = *it; + if (this->hasVariable(coord, path) && !this->isTemporal(coord, path)) + { + std::map dimvar = this->getDimensions(&coord, path); + if ((dimvar.size() == 1) && (dimvar.find(coord) != dimvar.end())) + continue; + else + return (false); + } + } + return (true); + } + + bool CINetCDF4::isCurvilinear(const StdString & name, const CVarPath * const path) + { + if (this->isRectilinear(name, path) || + !this->hasCoordinates(name, path)) + return (false); + + std::list coords = this->getCoordinatesIdList(name, path); + std::list::const_iterator it = coords.begin(), end = coords.end(); + for (; it != end; it++) + { + const StdString & coord = *it; + if (this->hasVariable(coord, path)) + { + std::map dimvar = this->getDimensions(&coord, path); + if (dimvar.size() != 2) return (false); + } + else return (false); + } + return (true); + } + + bool CINetCDF4::isUnstructured(const StdString & name, const CVarPath * const path) + { + if (this->isRectilinear(name, path) || + this->isCurvilinear(name, path) || + !this->hasCoordinates(name, path)) + return (false); + + StdString dimname = this->getDimensionsList(&name, path).back(); + + std::list coords = this->getCoordinatesIdList(name, path); + std::list::const_iterator it = coords.begin(), end = coords.end(); + for (; it != end; it++) + { + const StdString & coord = *it; + if (this->hasVariable(coord, path)) + { + std::map dimvar = this->getDimensions(&coord, path); + if ((dimvar.size() == 1) && + (dimvar.find(dimname) != dimvar.end())) + continue; + else + return (false); + } + else return (false); + } + + return (true); + } + + bool CINetCDF4::isUnknown(const StdString & name, const CVarPath * const path) + { + return !(this->isRectilinear(name, path) || + this->isCurvilinear(name, path) || + this->isUnstructured(name, path)); + } + + bool CINetCDF4::isTemporal(const StdString & name, const CVarPath * const path) + { + if (!this->hasTemporalDim(path)) return (false); + std::map dims = this->getDimensions(&name, path); + if (dims.find(this->getUnlimitedDimensionName(path)) != dims.end()) + return (true); + return (false); + } + + bool CINetCDF4::is3Dim(const StdString & name, const CVarPath * const path) + { + int i = 0; + std::list coords = this->getCoordinatesIdList(name, path); + std::list::const_iterator it = coords.begin(), end = coords.end(); + for (; it != end; it++) + { + const StdString & coord = *it; + if (this->hasVariable(coord, path)) + { + if (this->isTemporal(coord, path)) + continue; + i++; + } + else + { + if (coord.compare(this->getUnlimitedDimensionName()) == 0) + continue; + i++; + } + } + return (i == 3); + } + + bool CINetCDF4::isCellGrid(const StdString & name, const CVarPath * const path) + { + if (this->isCoordinate(name, path)) + { + return (this->hasBounds(name, path)); + } + else + { + std::list coords = this->getCoordinatesIdList(name, path); + std::list::const_iterator it = coords.begin(), end = coords.end(); + for (; it != end; it++) + { + const StdString & coord = *it; + if (this->hasVariable(coord, path)) + { + if (this->isTemporal(coord, path)) + continue; + if (this->isCellGrid(coord, path)) + continue; + return (false); + } + else + { + if (coord.compare(this->getUnlimitedDimensionName()) == 0) + continue; + return (false); + } + } + } + + return (true); + } + + //--------------------------------------------------------------- + + std::list CINetCDF4::getDataVariables(bool _is3D, bool _isRecti, + bool _isCurvi, bool _isUnstr, + bool _isCellData, bool _isTemporal, + const CVarPath * const path) + { + std::list retvalue; + std::list allvars = this->getVariables(path); + std::set allcoords = this->getCoordVariables(path); + + std::list::const_iterator it = allvars.begin(), end = allvars.end(); + for (; it != end; it++) + { + const StdString & var = *it; + if (this->isCoordinate(var, path)) continue; + + if (!_isRecti && this->isRectilinear(var, path) ) continue; + if (!_isCurvi && this->isCurvilinear(var, path) ) continue; + if (!_isUnstr && this->isUnstructured(var, path)) continue; + + if (!_isTemporal && this->isTemporal(var, path)) continue; + if (!_is3D && this->is3Dim(var, path) ) continue; + if (!_isCellData && this->isCellGrid(var, path)) continue; + + if (this->isUnknown(var, path)) continue; + + retvalue.push_back(var); + } + return (retvalue); + } + + //--------------------------------------------------------------- + + void CINetCDF4::getDataInfo(const StdString & var, const CVarPath * const path, StdSize record, + std::vector & start, std::vector & count, + StdSize & array_size) + { + std::list dimlist = this->getDimensionsList(&var, path); + std::map dimmap = this->getDimensions(&var, path); + std::list::iterator it = dimlist.begin(); + if (this->isTemporal(var, path)) + { + if (record != UNLIMITED_DIM) + start.push_back(record); + else + start.push_back(0); + count.push_back(1); + it++; + } + for (; it != dimlist.end(); it++) + { + start.push_back(0); + count.push_back(dimmap[*it]); + array_size *= dimmap[*it]; + } + } + + template <> + void CINetCDF4::getData(CArray& data, const StdString & var, + const CVarPath * const path, StdSize record) + { + + std::vector start, count; + int grpid = this->getGroup(path); + int varid = this->getVariable(var, path); + StdSize array_size = 1; + this->getDataInfo(var, path, record, start, count, array_size); + data.resize(array_size); + CheckError(nc_get_vara_int (grpid, varid, &(start[0]), &(count[0]), data.dataFirst())); + } + + template <> + void CINetCDF4::getData(CArray& data, const StdString & var, + const CVarPath * const path, StdSize record) + { + std::vector start, count; + int grpid = this->getGroup(path); + int varid = this->getVariable(var, path); + StdSize array_size = 1; + this->getDataInfo(var, path, record, start, count, array_size); + data.resize(array_size); + CheckError(nc_get_vara_double (grpid, varid, &(start[0]), &(count[0]), data.dataFirst())); + } + + template <> + void CINetCDF4::getData(CArray& data, const StdString & var, + const CVarPath * const path, StdSize record) + { + std::vector start, count; + int grpid = this->getGroup(path); + int varid = this->getVariable(var, path); + StdSize array_size = 1; + this->getDataInfo(var, path, record, start, count, array_size); + data.resize(array_size); + CheckError(nc_get_vara_float (grpid, varid, &(start[0]), &(count[0]), data.dataFirst())); + } + + //--------------------------------------------------------------- + StdString CINetCDF4::getLonCoordName(const StdString & varname, + const CVarPath * const path) + { + std::list clist = + this->getCoordinatesIdList(varname, path); + if (this->hasCoordinates(varname, path)) + return (*clist.begin()); + else + return (*clist.rbegin()); + } + + StdString CINetCDF4::getLatCoordName(const StdString & varname, + const CVarPath * const path) + { + std::list clist = + this->getCoordinatesIdList(varname, path); + if (this->hasCoordinates(varname, path)) + return (*(++clist.begin())); + else + return (*(++clist.rbegin())); + } + + StdString CINetCDF4::getVertCoordName(const StdString & varname, + const CVarPath * const path) + { + if (!this->is3Dim(varname, path)) return (""); + std::list clist = + this->getCoordinatesIdList(varname, path); + if (this->hasCoordinates(varname, path)) + return (*(++(++clist.begin()))); + else + return (*(++(++clist.rbegin()))); + } + + ///-------------------------------------------------------------- + +} // namespace xios diff --git a/src/input/inetcdf4.hpp b/src/input/inetcdf4.hpp new file mode 100644 index 0000000..528d132 --- /dev/null +++ b/src/input/inetcdf4.hpp @@ -0,0 +1,235 @@ +#ifndef __XMLIO_INETCDF4__ +#define __XMLIO_INETCDF4__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "array_new.hpp" + +#include "mpi.hpp" +#include "netcdf.hpp" + +#ifndef UNLIMITED_DIM + #define UNLIMITED_DIM (size_t)(-1) +#endif //UNLIMITED_DIM + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + typedef std::vector CVarPath; + + class CINetCDF4 + { + public : + + /// Constructeurs /// + CINetCDF4(void); // Not implemented. + CINetCDF4(const StdString & filename); + CINetCDF4(const CINetCDF4 & inetcdf4); // Not implemented. + CINetCDF4(const CINetCDF4 * const inetcdf4); // Not implemented. + + //------------------------------------------------------------- + + /// Accesseurs /// + StdSize getNbOfTimestep(const CVarPath * const path = NULL); + + StdString getUnlimitedDimensionName(const CVarPath * const path = NULL); + + StdString getCoordinatesId(const StdString & name, + const CVarPath * const path = NULL); + + StdString getBoundsId(const StdString & name, + const CVarPath * const path = NULL); + + StdString getLonCoordName(const StdString & varname, + const CVarPath * const path = NULL); + StdString getLatCoordName(const StdString & varname, + const CVarPath * const path = NULL); + StdString getVertCoordName(const StdString & varname, + const CVarPath * const path = NULL); + + std::set getCoordVariables(const CVarPath * const path = NULL); + std::set getBoundVariables(const CVarPath * const path = NULL); + + std::list getGroups (const CVarPath * const path = NULL); + std::list getVariables(const CVarPath * const path = NULL); + + std::list getDataVariables(bool _is3D = true, + bool _isRecti = true, + bool _isCurvi = true, + bool _isUnstr = true, + bool _isCellData = true, + bool _isTemporal = true, + const CVarPath * const path = NULL); + + std::list getAttributes + (const StdString * const var = NULL, + const CVarPath * const path = NULL); + + std::list getDimensionsList + (const StdString * const var = NULL, + const CVarPath * const path = NULL); + + std::list getCoordinatesIdList(const StdString & name, + const CVarPath * const path = NULL); + + std::map getDimensions (const StdString * const var = NULL, + const CVarPath * const path = NULL); + + StdSize getNbVertex(const StdString & name, + const CVarPath * const path = NULL); + //------------------------------------------------------------- + + template + T getMissingValue(const StdString & name, + const CVarPath * const path = NULL); + + template + T getAttributeValue(const StdString & name, + const StdString * const var = NULL, + const CVarPath * const path = NULL); + + template + void getData(CArray& data, + const StdString & var, + const CVarPath * const path = NULL, + StdSize record = UNLIMITED_DIM); + + //------------------------------------------------------------- + + /// Tests /// + bool hasMissingValue(const StdString & name, + const CVarPath * const path = NULL); + + bool hasAttribute(const StdString & name, + const StdString * const var = NULL, + const CVarPath * const path = NULL); + + bool hasVariable(const StdString & name, + const CVarPath * const path = NULL); + + bool hasCoordinates(const StdString & name, + const CVarPath * const path = NULL); + + bool hasTemporalDim(const CVarPath * const path = NULL); + + bool hasBounds(const StdString & name, + const CVarPath * const path = NULL); + + //------------------------------------------------------------- + + bool isBound(const StdString & name, + const CVarPath * const path = NULL); + bool isCoordinate(const StdString & name, + const CVarPath * const path = NULL); + bool isRectilinear(const StdString & name, + const CVarPath * const path = NULL); + bool isCurvilinear(const StdString & name, + const CVarPath * const path = NULL); + bool isUnknown(const StdString & name, + const CVarPath * const path = NULL); + bool isUnstructured(const StdString & name, + const CVarPath * const path = NULL); + + bool isTemporal(const StdString & name, + const CVarPath * const path = NULL); + bool is3Dim(const StdString & name, + const CVarPath * const path = NULL); + bool isCellGrid(const StdString & name, + const CVarPath * const path = NULL); + + //------------------------------------------------------------- + + /// Destructeur /// + virtual ~CINetCDF4(void); + + protected : + + //------------------------------------------------------------- + + /// Accesseurs /// + int getGroup (const CVarPath * const path = NULL); + int getVariable(const StdString & varname, + const CVarPath * const path = NULL); + int getDimension(const StdString & dimname, + const CVarPath * const path = NULL); + int getUnlimitedDimension(const CVarPath * const path = NULL); + int getAttributeId(const StdString & name, + const StdString * const var = NULL, + const CVarPath * const path = NULL); + + std::pair getAttribute(const StdString & attname, + const StdString * const var = NULL, + const CVarPath * const path = NULL); + + //------------------------------------------------------------- + + void getDataInfo(const StdString & var, const CVarPath * const path, StdSize record, + std::vector & start, std::vector & count, + StdSize & array_size); + + private : + + /// Vérification des erreurs NetCDF /// + static void CheckError(int status); + + int ncidp; // Identifiant de fichier netcdf. + + }; // class CINetCDF4 + + ///-------------------------------------------------------------- + template <> + StdString CINetCDF4::getAttributeValue + (const StdString & name, const StdString * const var, + const CVarPath * const path); + + template <> + std::vector CINetCDF4::getAttributeValue + (const StdString & name, const StdString * const var, + const CVarPath * const path); + + template <> + std::vector CINetCDF4::getAttributeValue + (const StdString & name, const StdString * const var, + const CVarPath * const path); + + template <> + std::vector CINetCDF4::getAttributeValue + (const StdString & name, const StdString * const var, + const CVarPath * const path); + + template <> + std::vector CINetCDF4::getAttributeValue + (const StdString & name, const StdString * const var, + const CVarPath * const path); + + //--------------------------------------------------------------- + template <> + int CINetCDF4::getMissingValue + (const StdString & name, const CVarPath * const path); + + template <> + double CINetCDF4::getMissingValue + (const StdString & name, const CVarPath * const path); + + template <> + float CINetCDF4::getMissingValue + (const StdString & name, const CVarPath * const path); + + //--------------------------------------------------------------- + template <> + void CINetCDF4::getData(CArray& data, const StdString & var, + const CVarPath * const path, StdSize record); + + template <> + void CINetCDF4::getData(CArray& data, const StdString & var, + const CVarPath * const path, StdSize record); + + template <> + void CINetCDF4::getData(CArray& data, const StdString & var, + const CVarPath * const path, StdSize record); + ///-------------------------------------------------------------- + +} // namespace xmlioserver + +#endif //__XMLIO_INETCDF4__ diff --git a/src/input/nc4_data_input.cpp b/src/input/nc4_data_input.cpp new file mode 100644 index 0000000..e54b500 --- /dev/null +++ b/src/input/nc4_data_input.cpp @@ -0,0 +1,12 @@ +#include "nc4_data_input.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CNc4DataInput::CNc4DataInput(void) + { /* ne rien faire de plus */ } + + CNc4DataInput::~CNc4DataInput(void) + { /* ne rien faire de plus */ } + +} // namespace xios diff --git a/src/input/nc4_data_input.hpp b/src/input/nc4_data_input.hpp new file mode 100644 index 0000000..90f0509 --- /dev/null +++ b/src/input/nc4_data_input.hpp @@ -0,0 +1,28 @@ +#ifndef __XMLIO_NC4_DATA_INPUT__ +#define __XMLIO_NC4_DATA_INPUT__ + +/// xmlioserver headers /// +#include "xmlioserver_spl.hpp" +#include "inetcdf4.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + class CNc4DataInput + { + public : + + /// Constructeurs /// + CNc4DataInput(void); + CNc4DataInput(const CNc4DataInput & datainput); // Not implemented. + CNc4DataInput(const CNc4DataInput * const datainput); // Not implemented. + + /// Destructeur /// + virtual ~CNc4DataInput(void); + + }; // class CNc4DataInput + +} // namespace xios + +#endif //__XMLIO_NC4_DATA_INPUT__ diff --git a/src/interface/c/icaxis.cpp b/src/interface/c/icaxis.cpp new file mode 100644 index 0000000..038f730 --- /dev/null +++ b/src/interface/c/icaxis.cpp @@ -0,0 +1,70 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "object_template.hpp" +#include "group_template.hpp" +#include "attribute_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "axis.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CAxis * XAxisPtr; + typedef xios::CAxisGroup * XAxisGroupPtr; + + // ------------------------ Création des handle ----------------------------- + + void cxios_axis_handle_create (XAxisPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = xios::CAxis::get(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_axisgroup_handle_create (XAxisGroupPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = xios::CAxisGroup::get(id); + CTimer::get("XIOS").suspend() ; + } + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_axis_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + *_ret = xios::CAxis::has(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_axisgroup_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + *_ret = xios::CAxisGroup::has(id); + CTimer::get("XIOS").suspend() ; + + } + +} // extern "C" diff --git a/src/interface/c/iccontext.cpp b/src/interface/c/iccontext.cpp new file mode 100644 index 0000000..b1729b7 --- /dev/null +++ b/src/interface/c/iccontext.cpp @@ -0,0 +1,85 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "calendar_type.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "context.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef enum { D360 = 0 , ALLLEAP, NOLEAP, JULIAN, GREGORIAN } XCalendarType ; + + typedef xios::CContext * XContextPtr; + + // ------------------------ Création des handle ----------------------------- + + void cxios_context_handle_create (XContextPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + + std::vector def_vector = + xios::CContext::getRoot()->getChildList(); + + for (std::size_t i = 0; i < def_vector.size(); i++) + { + if (def_vector[i]->getId().compare(id) == 0) + { + *_ret = def_vector[i]; + CTimer::get("XIOS").suspend() ; + return; + } + } + CTimer::get("XIOS").suspend() ; + ERROR("void cxios_context_handle_create (XContextPtr * _ret, const char * _id, int _id_len)", + << "Context "<getId()); + CTimer::get("XIOS").suspend() ; + } + + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_context_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + std::vector def_vector = + xios::CContext::getRoot()->getChildList(); + + for (std::size_t i = 0; i < def_vector.size(); i++) + { + if (def_vector[i]->getId().compare(id) == 0) + *_ret = true; + } + *_ret = false; + CTimer::get("XIOS").suspend() ; + } +} // extern "C" diff --git a/src/interface/c/icdata.cpp b/src/interface/c/icdata.cpp new file mode 100644 index 0000000..a7c1f4d --- /dev/null +++ b/src/interface/c/icdata.cpp @@ -0,0 +1,463 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include +#include +#include +#include + + +#include "xmlioserver.hpp" +#include "oasis_cinterface.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "icutil.hpp" +#include "cxios.hpp" +#include "client.hpp" +#include "field.hpp" +#include "context.hpp" +#include "context_client.hpp" +#include "mpi.hpp" +#include "timer.hpp" +#include "array_new.hpp" + + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef enum { NETCDF4 = 0 } XFileType; + + typedef xios::CContext * XContextPtr; + + // -------------------- Traitement des données ------------------------------ + void cxios_init_server(void) + { + CXios::initServerSide(); + } + + void cxios_init_client(const char * client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm ) + { + std::string str; + MPI_Comm local_comm ; + MPI_Comm return_comm ; + + if (!cstr2string(client_id, len_client_id, str)) return; + + int initialized ; + MPI_Initialized(&initialized) ; + if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm) ; + else local_comm=MPI_COMM_NULL ; + CXios::initClientSide(str,local_comm,return_comm); + *f_return_comm=MPI_Comm_c2f(return_comm) ; + CTimer::get("XIOS init").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm) + { + std::string str; + MPI_Comm comm ; + + if (!cstr2string(context_id, len_context_id, str)) return; + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS init context").resume() ; + comm=MPI_Comm_f2c(*f_comm) ; + CClient::registerContext(str,comm) ; + CTimer::get("XIOS init context").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_context_is_initialized(const char * context_id , int len_context_id, bool* initialized) + { + std::string str; + + if (!cstr2string(context_id, len_context_id, str)) return; + CTimer::get("XIOS").resume() ; + CContext* context = CContext::get(str,str) ; + *initialized=context->isInitialized() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_context_close_definition() + { + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS close definition").resume() ; + CContext* context = CContext::getCurrent() ; + context->closeDefinition() ; + CTimer::get("XIOS close definition").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_context_finalize() + { + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS context finalize").resume() ; + CContext* context = CContext::getCurrent() ; + context->finalize() ; + CTimer::get("XIOS context finalize").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_finalize() + { + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS finalize").resume() ; + CXios::clientFinalize() ; + } + + void cxios_solve_inheritance() + { + CTimer::get("XIOS").resume() ; + CContext* context = CContext::getCurrent() ; + context->solveAllInheritance(false) ; + CTimer::get("XIOS").suspend() ; + } + + /*! \brief This group of functions retrieve variable information from the configuration file (.xml) + * + * These functions provide intermediate C interfaces to get variable information of the configuration file (e.x iodef.xml), + * from a Fortran one, for example the value of a variable with id = "using_server". + * Each function corresponds to each basic type. + * \param varId [in] id of the variable that we'd like to get + * \param varIdSize [in] size of the variable type (integer, float, double, string) + * \param dataInt [in/out] the retrieved data + * \param isVarExisted [in/out] Verify whether variable with varId exists + */ + void cxios_get_variable_data_k8(const char * varId, int varIdSize, double * data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS get variable data").resume(); + + CContext* context = CContext::getCurrent(); + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + *data = CVariable::get(context->getId(),varIdStr)->getData(); + } + + CTimer::get("XIOS get variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_get_variable_data_k4(const char * varId, int varIdSize, float * data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS get variable data").resume(); + + CContext* context = CContext::getCurrent(); + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + *data = CVariable::get(context->getId(),varIdStr)->getData(); + } + + CTimer::get("XIOS get variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_get_variable_data_int(const char * varId, int varIdSize, int * data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS get variable data").resume(); + + CContext* context = CContext::getCurrent(); + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + *data = CVariable::get(context->getId(),varIdStr)->getData(); + } + + CTimer::get("XIOS get variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_get_variable_data_logic(const char * varId, int varIdSize, bool * data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS get variable data").resume(); + + CContext* context = CContext::getCurrent(); + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + *data = CVariable::get(context->getId(),varIdStr)->getData(); + } + + CTimer::get("XIOS get variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_get_variable_data_char(const char * varId, int varIdSize, char * data, int dataSizeIn, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS get variable data").resume(); + + CContext* context = CContext::getCurrent(); + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + int dataSizeOut = CVariable::get(context->getId(),varIdStr)->getData().length(); + strncpy(data, CVariable::get(context->getId(),varIdStr)->getData().c_str(), std::min(dataSizeIn, dataSizeOut)); + } + + CTimer::get("XIOS get variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + /*! \brief This group of functions write information into existing variable in the configuration file (.xml) + * + * These functions provide intermediate C interfaces to get variable information of the configuration file (e.x iodef.xml), + * from a Fortran one, for example the value of a variable with id = "using_server". + * Each function corresponds to each basic type. + * \param varId [in] id of the variable that we'd like to get + * \param varIdSize [in] size of the variable type (integer, float, double, string) + * \param data [in] the input data + * \param isVarExisted [in/out] Verify whether variable with varId exists + */ + void cxios_set_variable_data_k8(const char * varId, int varIdSize, double data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS set variable data").resume(); + + CContext* context = CContext::getCurrent() ; + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + CVariable::get(context->getId(),varIdStr)->setData(data); + CVariable::get(context->getId(),varIdStr)->sendValue(); + } + + CTimer::get("XIOS set variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_set_variable_data_k4(const char * varId, int varIdSize, float data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS set variable data").resume(); + + CContext* context = CContext::getCurrent() ; + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + CVariable::get(context->getId(),varIdStr)->setData(data); + CVariable::get(context->getId(),varIdStr)->sendValue(); + } + + CTimer::get("XIOS set variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_set_variable_data_int(const char * varId, int varIdSize, int data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS set variable data").resume(); + + CContext* context = CContext::getCurrent() ; + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + CVariable::get(context->getId(),varIdStr)->setData(data); + CVariable::get(context->getId(),varIdStr)->sendValue(); + } + + + CTimer::get("XIOS set variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_set_variable_data_logic(const char * varId, int varIdSize, bool data, bool * isVarExisted) + { + std::string varIdStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS set variable data").resume(); + + CContext* context = CContext::getCurrent() ; + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + CVariable::get(context->getId(),varIdStr)->setData(data); + CVariable::get(context->getId(),varIdStr)->sendValue(); + } + + CTimer::get("XIOS set variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_set_variable_data_char(const char * varId, int varIdSize, const char * data, int dataSizeIn, bool * isVarExisted) + { + std::string varIdStr, dataStr; + if (!cstr2string(varId, varIdSize, varIdStr)) return; + if (!cstr2string(data, dataSizeIn, dataStr)) + { + *isVarExisted = false; + return; + } + + CTimer::get("XIOS").resume(); + CTimer::get("XIOS set variable data").resume(); + + CContext* context = CContext::getCurrent() ; + *isVarExisted = CVariable::has(context->getId(), varIdStr); + + if (*isVarExisted) + { + CVariable::get(context->getId(),varIdStr)->setData(dataStr); + CVariable::get(context->getId(),varIdStr)->sendValue(); + } + + CTimer::get("XIOS set variable data").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + + // ---------------------- Ecriture des données ------------------------------ + + void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize) + { + std::string fieldid_str; + if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; + + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS send field").resume() ; + CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + CArray data(data_k8,shape(data_Xsize),neverDeleteData) ; + CField::get(fieldid_str)->setData(data) ; + CTimer::get("XIOS send field").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize) + { + std::string fieldid_str; + if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; + + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS send field").resume() ; + CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + + CArraydata(data_k8,shape(data_Xsize,data_Ysize),neverDeleteData) ; + CField::get(fieldid_str)->setData(data) ; + CTimer::get("XIOS send field").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize) + { + std::string fieldid_str; + if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; + + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS send field").resume() ; + CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + + CArraydata(data_k8,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ; + CField::get(fieldid_str)->setData(data) ; + CTimer::get("XIOS send field").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize) + { + std::string fieldid_str; + if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; + + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS send field").resume() ; + CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + + CArray data_tmp(data_k4,shape(data_Xsize),neverDeleteData) ; + CArray data(data_Xsize) ; + data=data_tmp ; + CField::get(fieldid_str)->setData(data) ; + CTimer::get("XIOS send field").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize) + { + std::string fieldid_str; + if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; + + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS send field").resume() ; + CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + + CArray data_tmp(data_k4,shape(data_Xsize,data_Ysize),neverDeleteData) ; + CArray data(data_Xsize,data_Ysize) ; + data=data_tmp ; + CField::get(fieldid_str)->setData(data) ; + CTimer::get("XIOS send field").suspend() ; + CTimer::get("XIOS").suspend() ; + } + + void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize) + { + std::string fieldid_str; + + if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; + + CTimer::get("XIOS").resume() ; + CTimer::get("XIOS send field").resume() ; + CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + + CArray data_tmp(data_k4,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ; + CArray data(data_Xsize,data_Ysize,data_Zsize) ; + data=data_tmp ; + + CField::get(fieldid_str)->setData(data) ; + CTimer::get("XIOS send field").suspend() ; + CTimer::get("XIOS").suspend() ; + + } + +} // extern "C" diff --git a/src/interface/c/icdate.cpp b/src/interface/c/icdate.cpp new file mode 100644 index 0000000..a4521f6 --- /dev/null +++ b/src/interface/c/icdate.cpp @@ -0,0 +1,56 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "calendar_type.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "context.hpp" +#include "context_client.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + void cxios_set_timestep(double ts_year, double ts_month, double ts_day, + double ts_hour, double ts_minute, double ts_second) + { + try + { + CTimer::get("XIOS").resume() ; + CDuration dur = {ts_year, ts_month, ts_day, ts_hour, ts_minute, ts_second, 0}; + xios::CContext* context = CContext::getCurrent() ; + + context->timestep.setValue(dur.toString()); + context->sendAttributToServer("timestep") ; + CTimer::get("XIOS").suspend() ; + } + catch (xios::CException & exc) + { + std::cerr << exc.getMessage() << std::endl; + exit (EXIT_FAILURE); + } + } + + void cxios_update_calendar(int step) + { + CTimer::get("XIOS").resume() ; + xios::CContext* context = CContext::getCurrent() ; + if (!context->hasServer) context->client->checkBuffers() ; + context->updateCalendar(step) ; + context->sendUpdateCalendar(step) ; + CTimer::get("XIOS").suspend() ; + + } + +} // extern "C" diff --git a/src/interface/c/icdomain.cpp b/src/interface/c/icdomain.cpp new file mode 100644 index 0000000..127e6bd --- /dev/null +++ b/src/interface/c/icdomain.cpp @@ -0,0 +1,68 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "domain.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CDomain * XDomainPtr; + typedef xios::CDomainGroup * XDomainGroupPtr; + + // ------------------------ Création des handle ----------------------------- + + void cxios_domain_handle_create (XDomainPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CDomain::get(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_domaingroup_handle_create (XDomainGroupPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + *_ret = CDomainGroup::get(id); + CTimer::get("XIOS").suspend() ; + } + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_domain_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + *_ret = CDomain::has(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_domaingroup_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CDomainGroup::has(id); + CTimer::get("XIOS").suspend() ; + } +} // extern "C" diff --git a/src/interface/c/icfield.cpp b/src/interface/c/icfield.cpp new file mode 100644 index 0000000..eed5251 --- /dev/null +++ b/src/interface/c/icfield.cpp @@ -0,0 +1,81 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "field.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CField * XFieldPtr; + typedef xios::CFieldGroup * XFieldGroupPtr; + +// -------------------------------------------------------------------------- +// ------------------------ Création des handle ----------------------------- +// -------------------------------------------------------------------------- + + void cxios_field_handle_create (XFieldPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CField::get(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_fieldgroup_handle_create (XFieldGroupPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CFieldGroup::get(id); + CTimer::get("XIOS").suspend() ; + } + + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_field_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CField::has(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_fieldgroup_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CFieldGroup::has(id); + CTimer::get("XIOS").suspend() ; + } + +// ----------------------------------------------------------------------------------------------------- +// ------------------------- other function---------- --------------------------- --------------------- +// ----------------------------------------------------------------------------------------------------- + + void cxios_field_is_active (XFieldPtr field_hdl, bool* ret) + { + CTimer::get("XIOS").resume() ; + *ret = field_hdl->isActive(); + CTimer::get("XIOS").suspend() ; + } + +} // extern "C" diff --git a/src/interface/c/icfile.cpp b/src/interface/c/icfile.cpp new file mode 100644 index 0000000..fe57090 --- /dev/null +++ b/src/interface/c/icfile.cpp @@ -0,0 +1,66 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "file.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CFile * XFilePtr; + typedef xios::CFileGroup * XFileGroupPtr; + + // ------------------------ Création des handle ----------------------------- + + void cxios_file_handle_create (XFilePtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CFile::get(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_filegroup_handle_create (XFileGroupPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CFileGroup::get(id); + CTimer::get("XIOS").suspend() ; + } + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_file_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CFile::has(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_filegroup_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CFileGroup::has(id); + CTimer::get("XIOS").suspend() ; + } +} // extern "C" diff --git a/src/interface/c/icgrid.cpp b/src/interface/c/icgrid.cpp new file mode 100644 index 0000000..ad1b642 --- /dev/null +++ b/src/interface/c/icgrid.cpp @@ -0,0 +1,66 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "grid.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CGrid * XGridPtr; + typedef xios::CGridGroup * XGridGroupPtr; + + // ------------------------ Création des handle ----------------------------- + + void cxios_grid_handle_create (XGridPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CGrid::get(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_gridgroup_handle_create (XGridGroupPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CGridGroup::get(id); + CTimer::get("XIOS").suspend() ; + } + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_grid_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CGrid::has(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_gridgroup_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = CGridGroup::has(id); + CTimer::get("XIOS").suspend() ; + } +} // extern "C" diff --git a/src/interface/c/icutil.hpp b/src/interface/c/icutil.hpp new file mode 100644 index 0000000..4a2d901 --- /dev/null +++ b/src/interface/c/icutil.hpp @@ -0,0 +1,68 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + + +#ifndef __ICUTIL_HPP__ +#define __ICUTIL_HPP__ + +#include +#include +// ///////////////////////// Définitions/Déclarations /////////////////////// // + +inline bool cstr2string(const char * cstr, int cstr_size, std::string & str) +{ + std::string valtemp; + std::size_t d, f = 0; + if (cstr_size != -1) + { + valtemp.append (cstr, cstr_size); + d = valtemp.find_first_not_of(' '); + f = valtemp.find_last_not_of (' '); + str = valtemp.substr(d, f-d+1); + return (true); + } + else + { + return (false); + } +} + +inline bool string_copy(const string& str, char* cstr,int cstr_size) +{ + + if (str.size()>cstr_size) return false ; + else + { + std::memset (cstr,' ',cstr_size); + str.copy(cstr,cstr_size) ; + return true ; + } +} +/* + template + inline bool array_copy(ARRAY(T,1) array_in, T* array_out, size_t extent1) + { + if (array_in->num_elements() != extent1) return false ; + std::copy(array_in->data(), array_in->data() + array_in->num_elements(), array_out); + return true ; + } + + template + inline bool array_copy(ARRAY(T,2) array_in, T* array_out, size_t extent1, size_t extent2) + { + if (array_in->num_elements() != extent1*extent2) return false ; + std::copy(array_in->data(), array_in->data() + array_in->num_elements(), array_out); + return true ; + } + + template + inline bool array_copy(ARRAY(T,3) array_in, T* array_out, size_t extent1, size_t extent2, size_t extent3) + { + if (array_in->num_elements() != extent1*extent2*extent3) return false ; + std::copy(array_in->data(), array_in->data() + array_in->num_elements(), array_out); + return true ; + } +*/ + +#endif // __ICUTIL_HPP__ diff --git a/src/interface/c/icvariable.cpp b/src/interface/c/icvariable.cpp new file mode 100644 index 0000000..2012973 --- /dev/null +++ b/src/interface/c/icvariable.cpp @@ -0,0 +1,71 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "object_template.hpp" +#include "group_template.hpp" +#include "attribute_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "variable.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CVariable * XVariablePtr; + typedef xios::CVariableGroup * XVariableGroupPtr; + + // ------------------------ Création des handle ----------------------------- + + void cxios_variable_handle_create (XVariablePtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = xios::CVariable::get(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_variablegroup_handle_create (XVariableGroupPtr * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + CTimer::get("XIOS").resume() ; + *_ret = xios::CVariableGroup::get(id); + CTimer::get("XIOS").suspend() ; + } + + // -------------------- Vérification des identifiants ----------------------- + + void cxios_variable_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + *_ret = xios::CVariable::has(id); + CTimer::get("XIOS").suspend() ; + } + + void cxios_variablegroup_valid_id (bool * _ret, const char * _id, int _id_len) + { + std::string id; + if (!cstr2string(_id, _id_len, id)) return; + + CTimer::get("XIOS").resume() ; + *_ret = xios::CVariableGroup::has(id); + CTimer::get("XIOS").suspend() ; + + } + +} // extern "C" + diff --git a/src/interface/c/icxml_tree.cpp b/src/interface/c/icxml_tree.cpp new file mode 100644 index 0000000..7424ddc --- /dev/null +++ b/src/interface/c/icxml_tree.cpp @@ -0,0 +1,401 @@ +/* ************************************************************************** * + * Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011 * + * ************************************************************************** */ + +#include +#include + +#include "xmlioserver.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "icutil.hpp" +#include "timer.hpp" +#include "context.hpp" +#include "grid.hpp" +#include "file.hpp" +#include "field.hpp" +#include "axis.hpp" +#include "domain.hpp" +#include "variable.hpp" + +extern "C" +{ +// /////////////////////////////// Définitions ////////////////////////////// // + + // ----------------------- Redéfinition de types ---------------------------- + + typedef xios::CContext * XContextPtr; + + typedef xios::CGrid * XGridPtr; + typedef xios::CGridGroup * XGridGroupPtr; + + typedef xios::CFile * XFilePtr; + typedef xios::CFileGroup * XFileGroupPtr; + + typedef xios::CField * XFieldPtr; + typedef xios::CFieldGroup * XFieldGroupPtr; + + typedef xios::CDomain * XDomainPtr; + typedef xios::CDomainGroup * XDomainGroupPtr; + + typedef xios::CAxis * XAxisPtr; + typedef xios::CAxisGroup * XAxisGroupPtr; + + typedef xios::CVariable * XVariablePtr; + typedef xios::CVariableGroup * XVariableGroupPtr; + + // ----------------------- Ajout d'enfant à un parent ----------------------- + + void cxios_xml_tree_add_field + (XFieldGroupPtr parent_, XFieldPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChild(child_id_str) ; + parent_->sendCreateChild(child_id_str) ; + } + else + { + *child_ = parent_->createChild() ; + parent_->sendCreateChild() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_grid + (XGridGroupPtr parent_, XGridPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChild(child_id_str) ; + parent_->sendCreateChild(child_id_str) ; + } + else + { + *child_ = parent_->createChild() ; + parent_->sendCreateChild() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_file + (XFileGroupPtr parent_, XFilePtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChild(child_id_str) ; + parent_->sendCreateChild(child_id_str) ; + } + else + { + *child_ = parent_->createChild() ; + parent_->sendCreateChild() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_axis + (XAxisGroupPtr parent_, XAxisPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChild(child_id_str) ; + parent_->sendCreateChild(child_id_str) ; + } + else + { + *child_ = parent_->createChild() ; + parent_->sendCreateChild() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_domain + (XDomainGroupPtr parent_, XDomainPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChild(child_id_str) ; + parent_->sendCreateChild(child_id_str) ; + } + else + { + *child_ = parent_->createChild() ; + parent_->sendCreateChild() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_fieldtofile + (XFilePtr parent_, XFieldPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->addField(child_id_str); + parent_->sendAddField(child_id_str) ; + } + else + { + *child_ = parent_->addField(); + parent_->sendAddField() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_variabletofile + (XFilePtr parent_, XVariablePtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->addVariable(child_id_str); + parent_->sendAddVariable(child_id_str) ; + } + else + { + *child_ = parent_->addVariable(); + parent_->sendAddVariable() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_variabletofield + (XFieldPtr parent_, XVariablePtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->addVariable(child_id_str); + parent_->sendAddVariable(child_id_str) ; + } + else + { + *child_ = parent_->addVariable(); + parent_->sendAddVariable() ; + } + CTimer::get("XIOS").suspend() ; + } + // ----------------------- Ajout de groupe à un parent ---------------------- + + void cxios_xml_tree_add_fieldgroup + (XFieldGroupPtr parent_, XFieldGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChildGroup(child_id_str) ; + parent_->sendCreateChildGroup(child_id_str) ; + } + else + { + *child_ = parent_->createChildGroup() ; + parent_->sendCreateChildGroup(child_id_str) ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_gridgroup + (XGridGroupPtr parent_, XGridGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChildGroup(child_id_str) ; + parent_->sendCreateChildGroup(child_id_str) ; + } + else + { + *child_ = parent_->createChildGroup() ; + parent_->sendCreateChildGroup(child_id_str) ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_filegroup + (XFileGroupPtr parent_, XFileGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChildGroup(child_id_str) ; + parent_->sendCreateChildGroup(child_id_str) ; + } + else + { + *child_ = parent_->createChildGroup() ; + parent_->sendCreateChildGroup(child_id_str) ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_axisgroup + (XAxisGroupPtr parent_, XAxisGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChildGroup(child_id_str) ; + parent_->sendCreateChildGroup(child_id_str) ; + } + else + { + *child_ = parent_->createChildGroup() ; + parent_->sendCreateChildGroup(child_id_str) ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_domaingroup + (XDomainGroupPtr parent_, XDomainGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->createChildGroup(child_id_str) ; + parent_->sendCreateChildGroup(child_id_str) ; + } + else + { + *child_ = parent_->createChildGroup() ; + parent_->sendCreateChildGroup(child_id_str) ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_fieldgrouptofile + (XFilePtr parent_, XFieldGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->addFieldGroup(child_id_str); + parent_->sendAddFieldGroup(child_id_str) ; + } + else + { + *child_ = parent_->addFieldGroup(); + parent_->sendAddFieldGroup() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_variablegrouptofile + (XFilePtr parent_, XVariableGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->addVariableGroup(child_id_str); + parent_->sendAddVariableGroup(child_id_str) ; + } + else + { + *child_ = parent_->addVariableGroup(); + parent_->sendAddVariableGroup() ; + } + CTimer::get("XIOS").suspend() ; + } + + void cxios_xml_tree_add_variablegrouptofield + (XFieldPtr parent_, XVariableGroupPtr * child_, const char * child_id, int child_id_size) + { + std::string child_id_str; + CTimer::get("XIOS").resume() ; + if (cstr2string(child_id, child_id_size, child_id_str)) + { + *child_ = parent_->addVariableGroup(child_id_str); + parent_->sendAddVariableGroup(child_id_str) ; + } + else + { + *child_ = parent_->addVariableGroup(); + parent_->sendAddVariableGroup() ; + } + CTimer::get("XIOS").suspend() ; + } + + + // ----------------------- Affichage de l'arborescence ---------------------- + +// void cxios_xml_tree_show (const char * filename, int filename_size) +// { +// std::string filename_str; +// try +// { +// if (cstr2string(filename, filename_size, filename_str)) +// xios::CTreeManager::PrintTreeToFile(filename_str); +// else +// xios::CTreeManager::PrintTreeToStream(std::clog); +// } +// catch (xios::CException & exc) +// { +// std::cerr << exc.getMessage() << std::endl; +// exit (EXIT_FAILURE); +// } +// } + + + // ----------------------- Parsing de document xml -------------------------- + +// void cxios_xml_parse_file (const char * filename , int filename_size)// +// { +// std::string filename_str; +// if (!cstr2string(filename, filename_size, filename_str)) return; +// +// try +// { +// xios::CTreeManager::ParseFile(filename_str); +// } +// catch (xios::CException & exc) +// { +// std::cerr << exc.getMessage() << std::endl; +// exit (EXIT_FAILURE); +// } +// } + +// void cxios_xml_parse_string(const char * xmlcontent, int xmlcontent_size) +// { +// std::string xmlcontent_str; +// if (!cstr2string(xmlcontent, xmlcontent_size, xmlcontent_str)) return; +// +// try +// { +// xios::CTreeManager::ParseString(xmlcontent_str); +// } +// catch (xios::CException & exc) +// { +// std::cerr << exc.getMessage() << std::endl; +// exit (EXIT_FAILURE); +// } +// } + + + +} // extern "C" diff --git a/src/interface/c/oasis_cinterface.cpp b/src/interface/c/oasis_cinterface.cpp new file mode 100644 index 0000000..61c9aa5 --- /dev/null +++ b/src/interface/c/oasis_cinterface.cpp @@ -0,0 +1,46 @@ +#include "oasis_cinterface.hpp" +#include +#include "mpi.hpp" + +namespace xios +{ + + void oasis_init(const std::string& server_id) + { + fxios_oasis_init(server_id.data(),server_id.size()) ; + } + + void oasis_finalize(void) + { + fxios_oasis_finalize() ; + } + + void oasis_enddef(void) + { + fxios_oasis_enddef() ; + } + + void oasis_get_localcomm(MPI_Comm& comm) + { + MPI_Fint f_comm ; + + fxios_oasis_get_localcomm(&f_comm) ; + comm=MPI_Comm_f2c(f_comm) ; + } + + void oasis_get_intracomm(MPI_Comm& comm_client_server,const std::string& server_id) + { + MPI_Fint f_comm ; + + fxios_oasis_get_intracomm(&f_comm,server_id.data(),server_id.size()) ; + comm_client_server=MPI_Comm_f2c(f_comm) ; + } + + void oasis_get_intercomm(MPI_Comm& comm_client_server,const std::string& server_id) + { + MPI_Fint f_comm ; + + fxios_oasis_get_intercomm(&f_comm,server_id.data(),server_id.size()) ; + comm_client_server=MPI_Comm_f2c(f_comm) ; + } +} diff --git a/src/interface/c/oasis_cinterface.hpp b/src/interface/c/oasis_cinterface.hpp new file mode 100644 index 0000000..6cff58b --- /dev/null +++ b/src/interface/c/oasis_cinterface.hpp @@ -0,0 +1,26 @@ +#ifndef __OASIS_CINTERFACE__ +#define __OASIS_CINTERFACE__ +#include +#include "mpi.hpp" + +extern "C" +{ + + void fxios_oasis_init(const char* server_id,int str_len) ; + void fxios_oasis_enddef(void) ; + void fxios_oasis_finalize(void) ; + void fxios_oasis_get_localcomm(MPI_Fint* f_comm) ; + void fxios_oasis_get_intracomm(MPI_Fint* f_comm_client_server,const char* client_id,int str_len) ; + void fxios_oasis_get_intercomm(MPI_Fint* f_comm_client_server,const char* client_id,int str_len) ; +} + +namespace xios +{ + void oasis_init(const std::string& server_id) ; + void oasis_enddef(void) ; + void oasis_finalize(void) ; + void oasis_get_localcomm(MPI_Comm& comm) ; + void oasis_get_intracomm(MPI_Comm& comm_client_server,const std::string& server_id) ; + void oasis_get_intercomm(MPI_Comm& comm_client_server,const std::string& server_id) ; +} +#endif diff --git a/src/interface/c_attr/icaxis_attr.cpp b/src/interface/c_attr/icaxis_attr.cpp new file mode 100644 index 0000000..86285c2 --- /dev/null +++ b/src/interface/c_attr/icaxis_attr.cpp @@ -0,0 +1,269 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CAxis* axis_Ptr; + + void cxios_set_axis_long_name(axis_Ptr axis_hdl, const char * long_name, int long_name_size) + { + std::string long_name_str; + if(!cstr2string(long_name, long_name_size, long_name_str)) return; + CTimer::get("XIOS").resume(); + axis_hdl->long_name.setValue(long_name_str); + axis_hdl->sendAttributToServer(axis_hdl->long_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_long_name(axis_Ptr axis_hdl, char * long_name, int long_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axis_hdl->long_name.getInheritedValue(),long_name , long_name_size)) + ERROR("void cxios_get_axis_long_name(axis_Ptr axis_hdl, char * long_name, int long_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axis_long_name(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_name(axis_Ptr axis_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + axis_hdl->name.setValue(name_str); + axis_hdl->sendAttributToServer(axis_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_name(axis_Ptr axis_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axis_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_axis_name(axis_Ptr axis_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axis_name(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_positive(axis_Ptr axis_hdl, const char * positive, int positive_size) + { + std::string positive_str; + if(!cstr2string(positive, positive_size, positive_str)) return; + CTimer::get("XIOS").resume(); + axis_hdl->positive.fromString(positive_str); + axis_hdl->sendAttributToServer(axis_hdl->positive); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_positive(axis_Ptr axis_hdl, char * positive, int positive_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axis_hdl->positive.getInheritedStringValue(),positive , positive_size)) + ERROR("void cxios_get_axis_positive(axis_Ptr axis_hdl, char * positive, int positive_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axis_positive(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->positive.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_size(axis_Ptr axis_hdl, int size) + { + CTimer::get("XIOS").resume(); + axis_hdl->size.setValue(size); + axis_hdl->sendAttributToServer(axis_hdl->size); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_size(axis_Ptr axis_hdl, int* size) + { + *size = axis_hdl->size.getInheritedValue(); + } + + bool cxios_is_defined_axis_size(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_standard_name(axis_Ptr axis_hdl, const char * standard_name, int standard_name_size) + { + std::string standard_name_str; + if(!cstr2string(standard_name, standard_name_size, standard_name_str)) return; + CTimer::get("XIOS").resume(); + axis_hdl->standard_name.setValue(standard_name_str); + axis_hdl->sendAttributToServer(axis_hdl->standard_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_standard_name(axis_Ptr axis_hdl, char * standard_name, int standard_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axis_hdl->standard_name.getInheritedValue(),standard_name , standard_name_size)) + ERROR("void cxios_get_axis_standard_name(axis_Ptr axis_hdl, char * standard_name, int standard_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axis_standard_name(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_unit(axis_Ptr axis_hdl, const char * unit, int unit_size) + { + std::string unit_str; + if(!cstr2string(unit, unit_size, unit_str)) return; + CTimer::get("XIOS").resume(); + axis_hdl->unit.setValue(unit_str); + axis_hdl->sendAttributToServer(axis_hdl->unit); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_unit(axis_Ptr axis_hdl, char * unit, int unit_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axis_hdl->unit.getInheritedValue(),unit , unit_size)) + ERROR("void cxios_get_axis_unit(axis_Ptr axis_hdl, char * unit, int unit_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axis_unit(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_value(axis_Ptr axis_hdl, double* value, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(value,shape(extent1),neverDeleteData) ; + axis_hdl->value.reference(tmp.copy()); + axis_hdl->sendAttributToServer(axis_hdl->value); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_value(axis_Ptr axis_hdl, double* value, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(value,shape(extent1),neverDeleteData) ; + tmp=axis_hdl->value.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axis_value(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_zoom_begin(axis_Ptr axis_hdl, int zoom_begin) + { + CTimer::get("XIOS").resume(); + axis_hdl->zoom_begin.setValue(zoom_begin); + axis_hdl->sendAttributToServer(axis_hdl->zoom_begin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_zoom_begin(axis_Ptr axis_hdl, int* zoom_begin) + { + *zoom_begin = axis_hdl->zoom_begin.getInheritedValue(); + } + + bool cxios_is_defined_axis_zoom_begin(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->zoom_begin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_zoom_end(axis_Ptr axis_hdl, int zoom_end) + { + CTimer::get("XIOS").resume(); + axis_hdl->zoom_end.setValue(zoom_end); + axis_hdl->sendAttributToServer(axis_hdl->zoom_end); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_zoom_end(axis_Ptr axis_hdl, int* zoom_end) + { + *zoom_end = axis_hdl->zoom_end.getInheritedValue(); + } + + bool cxios_is_defined_axis_zoom_end(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->zoom_end.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axis_zoom_size(axis_Ptr axis_hdl, int zoom_size) + { + CTimer::get("XIOS").resume(); + axis_hdl->zoom_size.setValue(zoom_size); + axis_hdl->sendAttributToServer(axis_hdl->zoom_size); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axis_zoom_size(axis_Ptr axis_hdl, int* zoom_size) + { + *zoom_size = axis_hdl->zoom_size.getInheritedValue(); + } + + bool cxios_is_defined_axis_zoom_size(axis_Ptr axis_hdl ) + { + CTimer::get("XIOS").resume(); + return axis_hdl->zoom_size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icaxisgroup_attr.cpp b/src/interface/c_attr/icaxisgroup_attr.cpp new file mode 100644 index 0000000..c3e7751 --- /dev/null +++ b/src/interface/c_attr/icaxisgroup_attr.cpp @@ -0,0 +1,296 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CAxisGroup* axisgroup_Ptr; + + void cxios_set_axisgroup_group_ref(axisgroup_Ptr axisgroup_hdl, const char * group_ref, int group_ref_size) + { + std::string group_ref_str; + if(!cstr2string(group_ref, group_ref_size, group_ref_str)) return; + CTimer::get("XIOS").resume(); + axisgroup_hdl->group_ref.setValue(group_ref_str); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_group_ref(axisgroup_Ptr axisgroup_hdl, char * group_ref, int group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axisgroup_hdl->group_ref.getInheritedValue(),group_ref , group_ref_size)) + ERROR("void cxios_get_axisgroup_group_ref(axisgroup_Ptr axisgroup_hdl, char * group_ref, int group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_group_ref(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_long_name(axisgroup_Ptr axisgroup_hdl, const char * long_name, int long_name_size) + { + std::string long_name_str; + if(!cstr2string(long_name, long_name_size, long_name_str)) return; + CTimer::get("XIOS").resume(); + axisgroup_hdl->long_name.setValue(long_name_str); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->long_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_long_name(axisgroup_Ptr axisgroup_hdl, char * long_name, int long_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axisgroup_hdl->long_name.getInheritedValue(),long_name , long_name_size)) + ERROR("void cxios_get_axisgroup_long_name(axisgroup_Ptr axisgroup_hdl, char * long_name, int long_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_long_name(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_name(axisgroup_Ptr axisgroup_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + axisgroup_hdl->name.setValue(name_str); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_name(axisgroup_Ptr axisgroup_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axisgroup_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_axisgroup_name(axisgroup_Ptr axisgroup_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_name(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_positive(axisgroup_Ptr axisgroup_hdl, const char * positive, int positive_size) + { + std::string positive_str; + if(!cstr2string(positive, positive_size, positive_str)) return; + CTimer::get("XIOS").resume(); + axisgroup_hdl->positive.fromString(positive_str); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->positive); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_positive(axisgroup_Ptr axisgroup_hdl, char * positive, int positive_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axisgroup_hdl->positive.getInheritedStringValue(),positive , positive_size)) + ERROR("void cxios_get_axisgroup_positive(axisgroup_Ptr axisgroup_hdl, char * positive, int positive_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_positive(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->positive.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_size(axisgroup_Ptr axisgroup_hdl, int size) + { + CTimer::get("XIOS").resume(); + axisgroup_hdl->size.setValue(size); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->size); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_size(axisgroup_Ptr axisgroup_hdl, int* size) + { + *size = axisgroup_hdl->size.getInheritedValue(); + } + + bool cxios_is_defined_axisgroup_size(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_standard_name(axisgroup_Ptr axisgroup_hdl, const char * standard_name, int standard_name_size) + { + std::string standard_name_str; + if(!cstr2string(standard_name, standard_name_size, standard_name_str)) return; + CTimer::get("XIOS").resume(); + axisgroup_hdl->standard_name.setValue(standard_name_str); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->standard_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_standard_name(axisgroup_Ptr axisgroup_hdl, char * standard_name, int standard_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axisgroup_hdl->standard_name.getInheritedValue(),standard_name , standard_name_size)) + ERROR("void cxios_get_axisgroup_standard_name(axisgroup_Ptr axisgroup_hdl, char * standard_name, int standard_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_standard_name(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_unit(axisgroup_Ptr axisgroup_hdl, const char * unit, int unit_size) + { + std::string unit_str; + if(!cstr2string(unit, unit_size, unit_str)) return; + CTimer::get("XIOS").resume(); + axisgroup_hdl->unit.setValue(unit_str); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->unit); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_unit(axisgroup_Ptr axisgroup_hdl, char * unit, int unit_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(axisgroup_hdl->unit.getInheritedValue(),unit , unit_size)) + ERROR("void cxios_get_axisgroup_unit(axisgroup_Ptr axisgroup_hdl, char * unit, int unit_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_unit(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_value(axisgroup_Ptr axisgroup_hdl, double* value, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(value,shape(extent1),neverDeleteData) ; + axisgroup_hdl->value.reference(tmp.copy()); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->value); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_value(axisgroup_Ptr axisgroup_hdl, double* value, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(value,shape(extent1),neverDeleteData) ; + tmp=axisgroup_hdl->value.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_axisgroup_value(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_zoom_begin(axisgroup_Ptr axisgroup_hdl, int zoom_begin) + { + CTimer::get("XIOS").resume(); + axisgroup_hdl->zoom_begin.setValue(zoom_begin); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->zoom_begin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_zoom_begin(axisgroup_Ptr axisgroup_hdl, int* zoom_begin) + { + *zoom_begin = axisgroup_hdl->zoom_begin.getInheritedValue(); + } + + bool cxios_is_defined_axisgroup_zoom_begin(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->zoom_begin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_zoom_end(axisgroup_Ptr axisgroup_hdl, int zoom_end) + { + CTimer::get("XIOS").resume(); + axisgroup_hdl->zoom_end.setValue(zoom_end); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->zoom_end); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_zoom_end(axisgroup_Ptr axisgroup_hdl, int* zoom_end) + { + *zoom_end = axisgroup_hdl->zoom_end.getInheritedValue(); + } + + bool cxios_is_defined_axisgroup_zoom_end(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->zoom_end.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_axisgroup_zoom_size(axisgroup_Ptr axisgroup_hdl, int zoom_size) + { + CTimer::get("XIOS").resume(); + axisgroup_hdl->zoom_size.setValue(zoom_size); + axisgroup_hdl->sendAttributToServer(axisgroup_hdl->zoom_size); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_axisgroup_zoom_size(axisgroup_Ptr axisgroup_hdl, int* zoom_size) + { + *zoom_size = axisgroup_hdl->zoom_size.getInheritedValue(); + } + + bool cxios_is_defined_axisgroup_zoom_size(axisgroup_Ptr axisgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return axisgroup_hdl->zoom_size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/iccontext_attr.cpp b/src/interface/c_attr/iccontext_attr.cpp new file mode 100644 index 0000000..3c46a81 --- /dev/null +++ b/src/interface/c_attr/iccontext_attr.cpp @@ -0,0 +1,155 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CContext* context_Ptr; + + void cxios_set_context_calendar_type(context_Ptr context_hdl, const char * calendar_type, int calendar_type_size) + { + std::string calendar_type_str; + if(!cstr2string(calendar_type, calendar_type_size, calendar_type_str)) return; + CTimer::get("XIOS").resume(); + context_hdl->calendar_type.setValue(calendar_type_str); + context_hdl->sendAttributToServer(context_hdl->calendar_type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_context_calendar_type(context_Ptr context_hdl, char * calendar_type, int calendar_type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(context_hdl->calendar_type.getInheritedValue(),calendar_type , calendar_type_size)) + ERROR("void cxios_get_context_calendar_type(context_Ptr context_hdl, char * calendar_type, int calendar_type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_context_calendar_type(context_Ptr context_hdl ) + { + CTimer::get("XIOS").resume(); + return context_hdl->calendar_type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_context_output_dir(context_Ptr context_hdl, const char * output_dir, int output_dir_size) + { + std::string output_dir_str; + if(!cstr2string(output_dir, output_dir_size, output_dir_str)) return; + CTimer::get("XIOS").resume(); + context_hdl->output_dir.setValue(output_dir_str); + context_hdl->sendAttributToServer(context_hdl->output_dir); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_context_output_dir(context_Ptr context_hdl, char * output_dir, int output_dir_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(context_hdl->output_dir.getInheritedValue(),output_dir , output_dir_size)) + ERROR("void cxios_get_context_output_dir(context_Ptr context_hdl, char * output_dir, int output_dir_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_context_output_dir(context_Ptr context_hdl ) + { + CTimer::get("XIOS").resume(); + return context_hdl->output_dir.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_context_start_date(context_Ptr context_hdl, const char * start_date, int start_date_size) + { + std::string start_date_str; + if(!cstr2string(start_date, start_date_size, start_date_str)) return; + CTimer::get("XIOS").resume(); + context_hdl->start_date.setValue(start_date_str); + context_hdl->sendAttributToServer(context_hdl->start_date); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_context_start_date(context_Ptr context_hdl, char * start_date, int start_date_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(context_hdl->start_date.getInheritedValue(),start_date , start_date_size)) + ERROR("void cxios_get_context_start_date(context_Ptr context_hdl, char * start_date, int start_date_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_context_start_date(context_Ptr context_hdl ) + { + CTimer::get("XIOS").resume(); + return context_hdl->start_date.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_context_time_origin(context_Ptr context_hdl, const char * time_origin, int time_origin_size) + { + std::string time_origin_str; + if(!cstr2string(time_origin, time_origin_size, time_origin_str)) return; + CTimer::get("XIOS").resume(); + context_hdl->time_origin.setValue(time_origin_str); + context_hdl->sendAttributToServer(context_hdl->time_origin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_context_time_origin(context_Ptr context_hdl, char * time_origin, int time_origin_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(context_hdl->time_origin.getInheritedValue(),time_origin , time_origin_size)) + ERROR("void cxios_get_context_time_origin(context_Ptr context_hdl, char * time_origin, int time_origin_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_context_time_origin(context_Ptr context_hdl ) + { + CTimer::get("XIOS").resume(); + return context_hdl->time_origin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_context_timestep(context_Ptr context_hdl, const char * timestep, int timestep_size) + { + std::string timestep_str; + if(!cstr2string(timestep, timestep_size, timestep_str)) return; + CTimer::get("XIOS").resume(); + context_hdl->timestep.setValue(timestep_str); + context_hdl->sendAttributToServer(context_hdl->timestep); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_context_timestep(context_Ptr context_hdl, char * timestep, int timestep_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(context_hdl->timestep.getInheritedValue(),timestep , timestep_size)) + ERROR("void cxios_get_context_timestep(context_Ptr context_hdl, char * timestep, int timestep_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_context_timestep(context_Ptr context_hdl ) + { + CTimer::get("XIOS").resume(); + return context_hdl->timestep.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icdomain_attr.cpp b/src/interface/c_attr/icdomain_attr.cpp new file mode 100644 index 0000000..d72221c --- /dev/null +++ b/src/interface/c_attr/icdomain_attr.cpp @@ -0,0 +1,895 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CDomain* domain_Ptr; + + void cxios_set_domain_bounds_lat(domain_Ptr domain_hdl, double* bounds_lat, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lat,shape(extent1,extent2),neverDeleteData) ; + domain_hdl->bounds_lat.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->bounds_lat); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_bounds_lat(domain_Ptr domain_hdl, double* bounds_lat, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lat,shape(extent1,extent2),neverDeleteData) ; + tmp=domain_hdl->bounds_lat.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_bounds_lat(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->bounds_lat.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_bounds_lon(domain_Ptr domain_hdl, double* bounds_lon, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lon,shape(extent1,extent2),neverDeleteData) ; + domain_hdl->bounds_lon.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->bounds_lon); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_bounds_lon(domain_Ptr domain_hdl, double* bounds_lon, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lon,shape(extent1,extent2),neverDeleteData) ; + tmp=domain_hdl->bounds_lon.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_bounds_lon(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->bounds_lon.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_dim(domain_Ptr domain_hdl, int data_dim) + { + CTimer::get("XIOS").resume(); + domain_hdl->data_dim.setValue(data_dim); + domain_hdl->sendAttributToServer(domain_hdl->data_dim); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_dim(domain_Ptr domain_hdl, int* data_dim) + { + *data_dim = domain_hdl->data_dim.getInheritedValue(); + } + + bool cxios_is_defined_domain_data_dim(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_dim.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_i_index(domain_Ptr domain_hdl, int* data_i_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_i_index,shape(extent1),neverDeleteData) ; + domain_hdl->data_i_index.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->data_i_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_i_index(domain_Ptr domain_hdl, int* data_i_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_i_index,shape(extent1),neverDeleteData) ; + tmp=domain_hdl->data_i_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_data_i_index(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_ibegin(domain_Ptr domain_hdl, int data_ibegin) + { + CTimer::get("XIOS").resume(); + domain_hdl->data_ibegin.setValue(data_ibegin); + domain_hdl->sendAttributToServer(domain_hdl->data_ibegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_ibegin(domain_Ptr domain_hdl, int* data_ibegin) + { + *data_ibegin = domain_hdl->data_ibegin.getInheritedValue(); + } + + bool cxios_is_defined_domain_data_ibegin(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_j_index(domain_Ptr domain_hdl, int* data_j_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_j_index,shape(extent1),neverDeleteData) ; + domain_hdl->data_j_index.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->data_j_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_j_index(domain_Ptr domain_hdl, int* data_j_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_j_index,shape(extent1),neverDeleteData) ; + tmp=domain_hdl->data_j_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_data_j_index(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_jbegin(domain_Ptr domain_hdl, int data_jbegin) + { + CTimer::get("XIOS").resume(); + domain_hdl->data_jbegin.setValue(data_jbegin); + domain_hdl->sendAttributToServer(domain_hdl->data_jbegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_jbegin(domain_Ptr domain_hdl, int* data_jbegin) + { + *data_jbegin = domain_hdl->data_jbegin.getInheritedValue(); + } + + bool cxios_is_defined_domain_data_jbegin(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_n_index(domain_Ptr domain_hdl, int data_n_index) + { + CTimer::get("XIOS").resume(); + domain_hdl->data_n_index.setValue(data_n_index); + domain_hdl->sendAttributToServer(domain_hdl->data_n_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_n_index(domain_Ptr domain_hdl, int* data_n_index) + { + *data_n_index = domain_hdl->data_n_index.getInheritedValue(); + } + + bool cxios_is_defined_domain_data_n_index(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_n_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_ni(domain_Ptr domain_hdl, int data_ni) + { + CTimer::get("XIOS").resume(); + domain_hdl->data_ni.setValue(data_ni); + domain_hdl->sendAttributToServer(domain_hdl->data_ni); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_ni(domain_Ptr domain_hdl, int* data_ni) + { + *data_ni = domain_hdl->data_ni.getInheritedValue(); + } + + bool cxios_is_defined_domain_data_ni(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_data_nj(domain_Ptr domain_hdl, int data_nj) + { + CTimer::get("XIOS").resume(); + domain_hdl->data_nj.setValue(data_nj); + domain_hdl->sendAttributToServer(domain_hdl->data_nj); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_data_nj(domain_Ptr domain_hdl, int* data_nj) + { + *data_nj = domain_hdl->data_nj.getInheritedValue(); + } + + bool cxios_is_defined_domain_data_nj(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->data_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_domain_group_ref(domain_Ptr domain_hdl, const char * domain_group_ref, int domain_group_ref_size) + { + std::string domain_group_ref_str; + if(!cstr2string(domain_group_ref, domain_group_ref_size, domain_group_ref_str)) return; + CTimer::get("XIOS").resume(); + domain_hdl->domain_group_ref.setValue(domain_group_ref_str); + domain_hdl->sendAttributToServer(domain_hdl->domain_group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_domain_group_ref(domain_Ptr domain_hdl, char * domain_group_ref, int domain_group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domain_hdl->domain_group_ref.getInheritedValue(),domain_group_ref , domain_group_ref_size)) + ERROR("void cxios_get_domain_domain_group_ref(domain_Ptr domain_hdl, char * domain_group_ref, int domain_group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_domain_group_ref(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->domain_group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_i_index(domain_Ptr domain_hdl, int* i_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(i_index,shape(extent1,extent2),neverDeleteData) ; + domain_hdl->i_index.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->i_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_i_index(domain_Ptr domain_hdl, int* i_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(i_index,shape(extent1,extent2),neverDeleteData) ; + tmp=domain_hdl->i_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_i_index(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_ibegin(domain_Ptr domain_hdl, int ibegin) + { + CTimer::get("XIOS").resume(); + domain_hdl->ibegin.setValue(ibegin); + domain_hdl->sendAttributToServer(domain_hdl->ibegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_ibegin(domain_Ptr domain_hdl, int* ibegin) + { + *ibegin = domain_hdl->ibegin.getInheritedValue(); + } + + bool cxios_is_defined_domain_ibegin(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_iend(domain_Ptr domain_hdl, int iend) + { + CTimer::get("XIOS").resume(); + domain_hdl->iend.setValue(iend); + domain_hdl->sendAttributToServer(domain_hdl->iend); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_iend(domain_Ptr domain_hdl, int* iend) + { + *iend = domain_hdl->iend.getInheritedValue(); + } + + bool cxios_is_defined_domain_iend(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->iend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_j_index(domain_Ptr domain_hdl, int* j_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(j_index,shape(extent1,extent2),neverDeleteData) ; + domain_hdl->j_index.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->j_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_j_index(domain_Ptr domain_hdl, int* j_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(j_index,shape(extent1,extent2),neverDeleteData) ; + tmp=domain_hdl->j_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_j_index(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_jbegin(domain_Ptr domain_hdl, int jbegin) + { + CTimer::get("XIOS").resume(); + domain_hdl->jbegin.setValue(jbegin); + domain_hdl->sendAttributToServer(domain_hdl->jbegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_jbegin(domain_Ptr domain_hdl, int* jbegin) + { + *jbegin = domain_hdl->jbegin.getInheritedValue(); + } + + bool cxios_is_defined_domain_jbegin(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_jend(domain_Ptr domain_hdl, int jend) + { + CTimer::get("XIOS").resume(); + domain_hdl->jend.setValue(jend); + domain_hdl->sendAttributToServer(domain_hdl->jend); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_jend(domain_Ptr domain_hdl, int* jend) + { + *jend = domain_hdl->jend.getInheritedValue(); + } + + bool cxios_is_defined_domain_jend(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->jend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_latvalue(domain_Ptr domain_hdl, double* latvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(latvalue,shape(extent1),neverDeleteData) ; + domain_hdl->latvalue.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->latvalue); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_latvalue(domain_Ptr domain_hdl, double* latvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(latvalue,shape(extent1),neverDeleteData) ; + tmp=domain_hdl->latvalue.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_latvalue(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->latvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_long_name(domain_Ptr domain_hdl, const char * long_name, int long_name_size) + { + std::string long_name_str; + if(!cstr2string(long_name, long_name_size, long_name_str)) return; + CTimer::get("XIOS").resume(); + domain_hdl->long_name.setValue(long_name_str); + domain_hdl->sendAttributToServer(domain_hdl->long_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_long_name(domain_Ptr domain_hdl, char * long_name, int long_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domain_hdl->long_name.getInheritedValue(),long_name , long_name_size)) + ERROR("void cxios_get_domain_long_name(domain_Ptr domain_hdl, char * long_name, int long_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_long_name(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_lonvalue(domain_Ptr domain_hdl, double* lonvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(lonvalue,shape(extent1),neverDeleteData) ; + domain_hdl->lonvalue.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->lonvalue); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_lonvalue(domain_Ptr domain_hdl, double* lonvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(lonvalue,shape(extent1),neverDeleteData) ; + tmp=domain_hdl->lonvalue.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_lonvalue(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->lonvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_mask(domain_Ptr domain_hdl, bool* mask, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2),neverDeleteData) ; + domain_hdl->mask.reference(tmp.copy()); + domain_hdl->sendAttributToServer(domain_hdl->mask); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_mask(domain_Ptr domain_hdl, bool* mask, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2),neverDeleteData) ; + tmp=domain_hdl->mask.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_mask(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_name(domain_Ptr domain_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + domain_hdl->name.setValue(name_str); + domain_hdl->sendAttributToServer(domain_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_name(domain_Ptr domain_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domain_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_domain_name(domain_Ptr domain_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_name(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_ni(domain_Ptr domain_hdl, int ni) + { + CTimer::get("XIOS").resume(); + domain_hdl->ni.setValue(ni); + domain_hdl->sendAttributToServer(domain_hdl->ni); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_ni(domain_Ptr domain_hdl, int* ni) + { + *ni = domain_hdl->ni.getInheritedValue(); + } + + bool cxios_is_defined_domain_ni(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_ni_glo(domain_Ptr domain_hdl, int ni_glo) + { + CTimer::get("XIOS").resume(); + domain_hdl->ni_glo.setValue(ni_glo); + domain_hdl->sendAttributToServer(domain_hdl->ni_glo); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_ni_glo(domain_Ptr domain_hdl, int* ni_glo) + { + *ni_glo = domain_hdl->ni_glo.getInheritedValue(); + } + + bool cxios_is_defined_domain_ni_glo(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->ni_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_nj(domain_Ptr domain_hdl, int nj) + { + CTimer::get("XIOS").resume(); + domain_hdl->nj.setValue(nj); + domain_hdl->sendAttributToServer(domain_hdl->nj); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_nj(domain_Ptr domain_hdl, int* nj) + { + *nj = domain_hdl->nj.getInheritedValue(); + } + + bool cxios_is_defined_domain_nj(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_nj_glo(domain_Ptr domain_hdl, int nj_glo) + { + CTimer::get("XIOS").resume(); + domain_hdl->nj_glo.setValue(nj_glo); + domain_hdl->sendAttributToServer(domain_hdl->nj_glo); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_nj_glo(domain_Ptr domain_hdl, int* nj_glo) + { + *nj_glo = domain_hdl->nj_glo.getInheritedValue(); + } + + bool cxios_is_defined_domain_nj_glo(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->nj_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_nvertex(domain_Ptr domain_hdl, int nvertex) + { + CTimer::get("XIOS").resume(); + domain_hdl->nvertex.setValue(nvertex); + domain_hdl->sendAttributToServer(domain_hdl->nvertex); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_nvertex(domain_Ptr domain_hdl, int* nvertex) + { + *nvertex = domain_hdl->nvertex.getInheritedValue(); + } + + bool cxios_is_defined_domain_nvertex(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->nvertex.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_standard_name(domain_Ptr domain_hdl, const char * standard_name, int standard_name_size) + { + std::string standard_name_str; + if(!cstr2string(standard_name, standard_name_size, standard_name_str)) return; + CTimer::get("XIOS").resume(); + domain_hdl->standard_name.setValue(standard_name_str); + domain_hdl->sendAttributToServer(domain_hdl->standard_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_standard_name(domain_Ptr domain_hdl, char * standard_name, int standard_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domain_hdl->standard_name.getInheritedValue(),standard_name , standard_name_size)) + ERROR("void cxios_get_domain_standard_name(domain_Ptr domain_hdl, char * standard_name, int standard_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_standard_name(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_type(domain_Ptr domain_hdl, const char * type, int type_size) + { + std::string type_str; + if(!cstr2string(type, type_size, type_str)) return; + CTimer::get("XIOS").resume(); + domain_hdl->type.fromString(type_str); + domain_hdl->sendAttributToServer(domain_hdl->type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_type(domain_Ptr domain_hdl, char * type, int type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domain_hdl->type.getInheritedStringValue(),type , type_size)) + ERROR("void cxios_get_domain_type(domain_Ptr domain_hdl, char * type, int type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domain_type(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_ibegin(domain_Ptr domain_hdl, int zoom_ibegin) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_ibegin.setValue(zoom_ibegin); + domain_hdl->sendAttributToServer(domain_hdl->zoom_ibegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_ibegin(domain_Ptr domain_hdl, int* zoom_ibegin) + { + *zoom_ibegin = domain_hdl->zoom_ibegin.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_ibegin(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_ibegin_loc(domain_Ptr domain_hdl, int zoom_ibegin_loc) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_ibegin_loc.setValue(zoom_ibegin_loc); + domain_hdl->sendAttributToServer(domain_hdl->zoom_ibegin_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_ibegin_loc(domain_Ptr domain_hdl, int* zoom_ibegin_loc) + { + *zoom_ibegin_loc = domain_hdl->zoom_ibegin_loc.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_ibegin_loc(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_ibegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_jbegin(domain_Ptr domain_hdl, int zoom_jbegin) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_jbegin.setValue(zoom_jbegin); + domain_hdl->sendAttributToServer(domain_hdl->zoom_jbegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_jbegin(domain_Ptr domain_hdl, int* zoom_jbegin) + { + *zoom_jbegin = domain_hdl->zoom_jbegin.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_jbegin(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_jbegin_loc(domain_Ptr domain_hdl, int zoom_jbegin_loc) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_jbegin_loc.setValue(zoom_jbegin_loc); + domain_hdl->sendAttributToServer(domain_hdl->zoom_jbegin_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_jbegin_loc(domain_Ptr domain_hdl, int* zoom_jbegin_loc) + { + *zoom_jbegin_loc = domain_hdl->zoom_jbegin_loc.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_jbegin_loc(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_jbegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_ni(domain_Ptr domain_hdl, int zoom_ni) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_ni.setValue(zoom_ni); + domain_hdl->sendAttributToServer(domain_hdl->zoom_ni); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_ni(domain_Ptr domain_hdl, int* zoom_ni) + { + *zoom_ni = domain_hdl->zoom_ni.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_ni(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_ni_loc(domain_Ptr domain_hdl, int zoom_ni_loc) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_ni_loc.setValue(zoom_ni_loc); + domain_hdl->sendAttributToServer(domain_hdl->zoom_ni_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_ni_loc(domain_Ptr domain_hdl, int* zoom_ni_loc) + { + *zoom_ni_loc = domain_hdl->zoom_ni_loc.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_ni_loc(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_ni_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_nj(domain_Ptr domain_hdl, int zoom_nj) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_nj.setValue(zoom_nj); + domain_hdl->sendAttributToServer(domain_hdl->zoom_nj); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_nj(domain_Ptr domain_hdl, int* zoom_nj) + { + *zoom_nj = domain_hdl->zoom_nj.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_nj(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domain_zoom_nj_loc(domain_Ptr domain_hdl, int zoom_nj_loc) + { + CTimer::get("XIOS").resume(); + domain_hdl->zoom_nj_loc.setValue(zoom_nj_loc); + domain_hdl->sendAttributToServer(domain_hdl->zoom_nj_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domain_zoom_nj_loc(domain_Ptr domain_hdl, int* zoom_nj_loc) + { + *zoom_nj_loc = domain_hdl->zoom_nj_loc.getInheritedValue(); + } + + bool cxios_is_defined_domain_zoom_nj_loc(domain_Ptr domain_hdl ) + { + CTimer::get("XIOS").resume(); + return domain_hdl->zoom_nj_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icdomaingroup_attr.cpp b/src/interface/c_attr/icdomaingroup_attr.cpp new file mode 100644 index 0000000..64079d8 --- /dev/null +++ b/src/interface/c_attr/icdomaingroup_attr.cpp @@ -0,0 +1,922 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CDomainGroup* domaingroup_Ptr; + + void cxios_set_domaingroup_bounds_lat(domaingroup_Ptr domaingroup_hdl, double* bounds_lat, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lat,shape(extent1,extent2),neverDeleteData) ; + domaingroup_hdl->bounds_lat.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->bounds_lat); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_bounds_lat(domaingroup_Ptr domaingroup_hdl, double* bounds_lat, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lat,shape(extent1,extent2),neverDeleteData) ; + tmp=domaingroup_hdl->bounds_lat.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_bounds_lat(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->bounds_lat.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_bounds_lon(domaingroup_Ptr domaingroup_hdl, double* bounds_lon, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lon,shape(extent1,extent2),neverDeleteData) ; + domaingroup_hdl->bounds_lon.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->bounds_lon); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_bounds_lon(domaingroup_Ptr domaingroup_hdl, double* bounds_lon, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(bounds_lon,shape(extent1,extent2),neverDeleteData) ; + tmp=domaingroup_hdl->bounds_lon.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_bounds_lon(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->bounds_lon.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_dim(domaingroup_Ptr domaingroup_hdl, int data_dim) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->data_dim.setValue(data_dim); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_dim); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_dim(domaingroup_Ptr domaingroup_hdl, int* data_dim) + { + *data_dim = domaingroup_hdl->data_dim.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_data_dim(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_dim.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_i_index(domaingroup_Ptr domaingroup_hdl, int* data_i_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_i_index,shape(extent1),neverDeleteData) ; + domaingroup_hdl->data_i_index.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_i_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_i_index(domaingroup_Ptr domaingroup_hdl, int* data_i_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_i_index,shape(extent1),neverDeleteData) ; + tmp=domaingroup_hdl->data_i_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_data_i_index(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_ibegin(domaingroup_Ptr domaingroup_hdl, int data_ibegin) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->data_ibegin.setValue(data_ibegin); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_ibegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_ibegin(domaingroup_Ptr domaingroup_hdl, int* data_ibegin) + { + *data_ibegin = domaingroup_hdl->data_ibegin.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_data_ibegin(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_j_index(domaingroup_Ptr domaingroup_hdl, int* data_j_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_j_index,shape(extent1),neverDeleteData) ; + domaingroup_hdl->data_j_index.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_j_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_j_index(domaingroup_Ptr domaingroup_hdl, int* data_j_index, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(data_j_index,shape(extent1),neverDeleteData) ; + tmp=domaingroup_hdl->data_j_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_data_j_index(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_jbegin(domaingroup_Ptr domaingroup_hdl, int data_jbegin) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->data_jbegin.setValue(data_jbegin); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_jbegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_jbegin(domaingroup_Ptr domaingroup_hdl, int* data_jbegin) + { + *data_jbegin = domaingroup_hdl->data_jbegin.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_data_jbegin(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_n_index(domaingroup_Ptr domaingroup_hdl, int data_n_index) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->data_n_index.setValue(data_n_index); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_n_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_n_index(domaingroup_Ptr domaingroup_hdl, int* data_n_index) + { + *data_n_index = domaingroup_hdl->data_n_index.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_data_n_index(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_n_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_ni(domaingroup_Ptr domaingroup_hdl, int data_ni) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->data_ni.setValue(data_ni); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_ni); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_ni(domaingroup_Ptr domaingroup_hdl, int* data_ni) + { + *data_ni = domaingroup_hdl->data_ni.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_data_ni(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_data_nj(domaingroup_Ptr domaingroup_hdl, int data_nj) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->data_nj.setValue(data_nj); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->data_nj); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_data_nj(domaingroup_Ptr domaingroup_hdl, int* data_nj) + { + *data_nj = domaingroup_hdl->data_nj.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_data_nj(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->data_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_domain_group_ref(domaingroup_Ptr domaingroup_hdl, const char * domain_group_ref, int domain_group_ref_size) + { + std::string domain_group_ref_str; + if(!cstr2string(domain_group_ref, domain_group_ref_size, domain_group_ref_str)) return; + CTimer::get("XIOS").resume(); + domaingroup_hdl->domain_group_ref.setValue(domain_group_ref_str); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->domain_group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_domain_group_ref(domaingroup_Ptr domaingroup_hdl, char * domain_group_ref, int domain_group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domaingroup_hdl->domain_group_ref.getInheritedValue(),domain_group_ref , domain_group_ref_size)) + ERROR("void cxios_get_domaingroup_domain_group_ref(domaingroup_Ptr domaingroup_hdl, char * domain_group_ref, int domain_group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_domain_group_ref(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->domain_group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_group_ref(domaingroup_Ptr domaingroup_hdl, const char * group_ref, int group_ref_size) + { + std::string group_ref_str; + if(!cstr2string(group_ref, group_ref_size, group_ref_str)) return; + CTimer::get("XIOS").resume(); + domaingroup_hdl->group_ref.setValue(group_ref_str); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_group_ref(domaingroup_Ptr domaingroup_hdl, char * group_ref, int group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domaingroup_hdl->group_ref.getInheritedValue(),group_ref , group_ref_size)) + ERROR("void cxios_get_domaingroup_group_ref(domaingroup_Ptr domaingroup_hdl, char * group_ref, int group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_group_ref(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_i_index(domaingroup_Ptr domaingroup_hdl, int* i_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(i_index,shape(extent1,extent2),neverDeleteData) ; + domaingroup_hdl->i_index.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->i_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_i_index(domaingroup_Ptr domaingroup_hdl, int* i_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(i_index,shape(extent1,extent2),neverDeleteData) ; + tmp=domaingroup_hdl->i_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_i_index(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_ibegin(domaingroup_Ptr domaingroup_hdl, int ibegin) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->ibegin.setValue(ibegin); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->ibegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_ibegin(domaingroup_Ptr domaingroup_hdl, int* ibegin) + { + *ibegin = domaingroup_hdl->ibegin.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_ibegin(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_iend(domaingroup_Ptr domaingroup_hdl, int iend) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->iend.setValue(iend); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->iend); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_iend(domaingroup_Ptr domaingroup_hdl, int* iend) + { + *iend = domaingroup_hdl->iend.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_iend(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->iend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_j_index(domaingroup_Ptr domaingroup_hdl, int* j_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(j_index,shape(extent1,extent2),neverDeleteData) ; + domaingroup_hdl->j_index.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->j_index); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_j_index(domaingroup_Ptr domaingroup_hdl, int* j_index, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(j_index,shape(extent1,extent2),neverDeleteData) ; + tmp=domaingroup_hdl->j_index.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_j_index(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_jbegin(domaingroup_Ptr domaingroup_hdl, int jbegin) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->jbegin.setValue(jbegin); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->jbegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_jbegin(domaingroup_Ptr domaingroup_hdl, int* jbegin) + { + *jbegin = domaingroup_hdl->jbegin.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_jbegin(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_jend(domaingroup_Ptr domaingroup_hdl, int jend) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->jend.setValue(jend); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->jend); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_jend(domaingroup_Ptr domaingroup_hdl, int* jend) + { + *jend = domaingroup_hdl->jend.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_jend(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->jend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_latvalue(domaingroup_Ptr domaingroup_hdl, double* latvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(latvalue,shape(extent1),neverDeleteData) ; + domaingroup_hdl->latvalue.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->latvalue); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_latvalue(domaingroup_Ptr domaingroup_hdl, double* latvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(latvalue,shape(extent1),neverDeleteData) ; + tmp=domaingroup_hdl->latvalue.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_latvalue(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->latvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_long_name(domaingroup_Ptr domaingroup_hdl, const char * long_name, int long_name_size) + { + std::string long_name_str; + if(!cstr2string(long_name, long_name_size, long_name_str)) return; + CTimer::get("XIOS").resume(); + domaingroup_hdl->long_name.setValue(long_name_str); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->long_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_long_name(domaingroup_Ptr domaingroup_hdl, char * long_name, int long_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domaingroup_hdl->long_name.getInheritedValue(),long_name , long_name_size)) + ERROR("void cxios_get_domaingroup_long_name(domaingroup_Ptr domaingroup_hdl, char * long_name, int long_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_long_name(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_lonvalue(domaingroup_Ptr domaingroup_hdl, double* lonvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(lonvalue,shape(extent1),neverDeleteData) ; + domaingroup_hdl->lonvalue.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->lonvalue); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_lonvalue(domaingroup_Ptr domaingroup_hdl, double* lonvalue, int extent1) + { + CTimer::get("XIOS").resume(); + CArray tmp(lonvalue,shape(extent1),neverDeleteData) ; + tmp=domaingroup_hdl->lonvalue.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_lonvalue(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->lonvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_mask(domaingroup_Ptr domaingroup_hdl, bool* mask, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2),neverDeleteData) ; + domaingroup_hdl->mask.reference(tmp.copy()); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->mask); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_mask(domaingroup_Ptr domaingroup_hdl, bool* mask, int extent1, int extent2) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2),neverDeleteData) ; + tmp=domaingroup_hdl->mask.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_mask(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_name(domaingroup_Ptr domaingroup_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + domaingroup_hdl->name.setValue(name_str); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_name(domaingroup_Ptr domaingroup_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domaingroup_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_domaingroup_name(domaingroup_Ptr domaingroup_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_name(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_ni(domaingroup_Ptr domaingroup_hdl, int ni) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->ni.setValue(ni); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->ni); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_ni(domaingroup_Ptr domaingroup_hdl, int* ni) + { + *ni = domaingroup_hdl->ni.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_ni(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_ni_glo(domaingroup_Ptr domaingroup_hdl, int ni_glo) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->ni_glo.setValue(ni_glo); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->ni_glo); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_ni_glo(domaingroup_Ptr domaingroup_hdl, int* ni_glo) + { + *ni_glo = domaingroup_hdl->ni_glo.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_ni_glo(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->ni_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_nj(domaingroup_Ptr domaingroup_hdl, int nj) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->nj.setValue(nj); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->nj); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_nj(domaingroup_Ptr domaingroup_hdl, int* nj) + { + *nj = domaingroup_hdl->nj.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_nj(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_nj_glo(domaingroup_Ptr domaingroup_hdl, int nj_glo) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->nj_glo.setValue(nj_glo); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->nj_glo); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_nj_glo(domaingroup_Ptr domaingroup_hdl, int* nj_glo) + { + *nj_glo = domaingroup_hdl->nj_glo.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_nj_glo(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->nj_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_nvertex(domaingroup_Ptr domaingroup_hdl, int nvertex) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->nvertex.setValue(nvertex); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->nvertex); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_nvertex(domaingroup_Ptr domaingroup_hdl, int* nvertex) + { + *nvertex = domaingroup_hdl->nvertex.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_nvertex(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->nvertex.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_standard_name(domaingroup_Ptr domaingroup_hdl, const char * standard_name, int standard_name_size) + { + std::string standard_name_str; + if(!cstr2string(standard_name, standard_name_size, standard_name_str)) return; + CTimer::get("XIOS").resume(); + domaingroup_hdl->standard_name.setValue(standard_name_str); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->standard_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_standard_name(domaingroup_Ptr domaingroup_hdl, char * standard_name, int standard_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domaingroup_hdl->standard_name.getInheritedValue(),standard_name , standard_name_size)) + ERROR("void cxios_get_domaingroup_standard_name(domaingroup_Ptr domaingroup_hdl, char * standard_name, int standard_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_standard_name(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_type(domaingroup_Ptr domaingroup_hdl, const char * type, int type_size) + { + std::string type_str; + if(!cstr2string(type, type_size, type_str)) return; + CTimer::get("XIOS").resume(); + domaingroup_hdl->type.fromString(type_str); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_type(domaingroup_Ptr domaingroup_hdl, char * type, int type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(domaingroup_hdl->type.getInheritedStringValue(),type , type_size)) + ERROR("void cxios_get_domaingroup_type(domaingroup_Ptr domaingroup_hdl, char * type, int type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_domaingroup_type(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_ibegin(domaingroup_Ptr domaingroup_hdl, int zoom_ibegin) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_ibegin.setValue(zoom_ibegin); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_ibegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_ibegin(domaingroup_Ptr domaingroup_hdl, int* zoom_ibegin) + { + *zoom_ibegin = domaingroup_hdl->zoom_ibegin.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_ibegin(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_ibegin_loc(domaingroup_Ptr domaingroup_hdl, int zoom_ibegin_loc) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_ibegin_loc.setValue(zoom_ibegin_loc); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_ibegin_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_ibegin_loc(domaingroup_Ptr domaingroup_hdl, int* zoom_ibegin_loc) + { + *zoom_ibegin_loc = domaingroup_hdl->zoom_ibegin_loc.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_ibegin_loc(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_ibegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_jbegin(domaingroup_Ptr domaingroup_hdl, int zoom_jbegin) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_jbegin.setValue(zoom_jbegin); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_jbegin); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_jbegin(domaingroup_Ptr domaingroup_hdl, int* zoom_jbegin) + { + *zoom_jbegin = domaingroup_hdl->zoom_jbegin.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_jbegin(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_jbegin_loc(domaingroup_Ptr domaingroup_hdl, int zoom_jbegin_loc) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_jbegin_loc.setValue(zoom_jbegin_loc); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_jbegin_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_jbegin_loc(domaingroup_Ptr domaingroup_hdl, int* zoom_jbegin_loc) + { + *zoom_jbegin_loc = domaingroup_hdl->zoom_jbegin_loc.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_jbegin_loc(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_jbegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_ni(domaingroup_Ptr domaingroup_hdl, int zoom_ni) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_ni.setValue(zoom_ni); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_ni); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_ni(domaingroup_Ptr domaingroup_hdl, int* zoom_ni) + { + *zoom_ni = domaingroup_hdl->zoom_ni.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_ni(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_ni_loc(domaingroup_Ptr domaingroup_hdl, int zoom_ni_loc) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_ni_loc.setValue(zoom_ni_loc); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_ni_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_ni_loc(domaingroup_Ptr domaingroup_hdl, int* zoom_ni_loc) + { + *zoom_ni_loc = domaingroup_hdl->zoom_ni_loc.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_ni_loc(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_ni_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_nj(domaingroup_Ptr domaingroup_hdl, int zoom_nj) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_nj.setValue(zoom_nj); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_nj); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_nj(domaingroup_Ptr domaingroup_hdl, int* zoom_nj) + { + *zoom_nj = domaingroup_hdl->zoom_nj.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_nj(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_domaingroup_zoom_nj_loc(domaingroup_Ptr domaingroup_hdl, int zoom_nj_loc) + { + CTimer::get("XIOS").resume(); + domaingroup_hdl->zoom_nj_loc.setValue(zoom_nj_loc); + domaingroup_hdl->sendAttributToServer(domaingroup_hdl->zoom_nj_loc); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_domaingroup_zoom_nj_loc(domaingroup_Ptr domaingroup_hdl, int* zoom_nj_loc) + { + *zoom_nj_loc = domaingroup_hdl->zoom_nj_loc.getInheritedValue(); + } + + bool cxios_is_defined_domaingroup_zoom_nj_loc(domaingroup_Ptr domaingroup_hdl ) + { + CTimer::get("XIOS").resume(); + return domaingroup_hdl->zoom_nj_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icfield_attr.cpp b/src/interface/c_attr/icfield_attr.cpp new file mode 100644 index 0000000..cc23bae --- /dev/null +++ b/src/interface/c_attr/icfield_attr.cpp @@ -0,0 +1,515 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CField* field_Ptr; + + void cxios_set_field_add_offset(field_Ptr field_hdl, double add_offset) + { + CTimer::get("XIOS").resume(); + field_hdl->add_offset.setValue(add_offset); + field_hdl->sendAttributToServer(field_hdl->add_offset); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_add_offset(field_Ptr field_hdl, double* add_offset) + { + *add_offset = field_hdl->add_offset.getInheritedValue(); + } + + bool cxios_is_defined_field_add_offset(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->add_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_axis_ref(field_Ptr field_hdl, const char * axis_ref, int axis_ref_size) + { + std::string axis_ref_str; + if(!cstr2string(axis_ref, axis_ref_size, axis_ref_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->axis_ref.setValue(axis_ref_str); + field_hdl->sendAttributToServer(field_hdl->axis_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_axis_ref(field_Ptr field_hdl, char * axis_ref, int axis_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->axis_ref.getInheritedValue(),axis_ref , axis_ref_size)) + ERROR("void cxios_get_field_axis_ref(field_Ptr field_hdl, char * axis_ref, int axis_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_axis_ref(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_default_value(field_Ptr field_hdl, double default_value) + { + CTimer::get("XIOS").resume(); + field_hdl->default_value.setValue(default_value); + field_hdl->sendAttributToServer(field_hdl->default_value); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_default_value(field_Ptr field_hdl, double* default_value) + { + *default_value = field_hdl->default_value.getInheritedValue(); + } + + bool cxios_is_defined_field_default_value(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->default_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_detect_missing_value(field_Ptr field_hdl, bool detect_missing_value) + { + CTimer::get("XIOS").resume(); + field_hdl->detect_missing_value.setValue(detect_missing_value); + field_hdl->sendAttributToServer(field_hdl->detect_missing_value); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_detect_missing_value(field_Ptr field_hdl, bool* detect_missing_value) + { + *detect_missing_value = field_hdl->detect_missing_value.getInheritedValue(); + } + + bool cxios_is_defined_field_detect_missing_value(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->detect_missing_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_domain_ref(field_Ptr field_hdl, const char * domain_ref, int domain_ref_size) + { + std::string domain_ref_str; + if(!cstr2string(domain_ref, domain_ref_size, domain_ref_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->domain_ref.setValue(domain_ref_str); + field_hdl->sendAttributToServer(field_hdl->domain_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_domain_ref(field_Ptr field_hdl, char * domain_ref, int domain_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->domain_ref.getInheritedValue(),domain_ref , domain_ref_size)) + ERROR("void cxios_get_field_domain_ref(field_Ptr field_hdl, char * domain_ref, int domain_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_domain_ref(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_enabled(field_Ptr field_hdl, bool enabled) + { + CTimer::get("XIOS").resume(); + field_hdl->enabled.setValue(enabled); + field_hdl->sendAttributToServer(field_hdl->enabled); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_enabled(field_Ptr field_hdl, bool* enabled) + { + *enabled = field_hdl->enabled.getInheritedValue(); + } + + bool cxios_is_defined_field_enabled(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_field_ref(field_Ptr field_hdl, const char * field_ref, int field_ref_size) + { + std::string field_ref_str; + if(!cstr2string(field_ref, field_ref_size, field_ref_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->field_ref.setValue(field_ref_str); + field_hdl->sendAttributToServer(field_hdl->field_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_field_ref(field_Ptr field_hdl, char * field_ref, int field_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->field_ref.getInheritedValue(),field_ref , field_ref_size)) + ERROR("void cxios_get_field_field_ref(field_Ptr field_hdl, char * field_ref, int field_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_field_ref(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->field_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_freq_offset(field_Ptr field_hdl, const char * freq_offset, int freq_offset_size) + { + std::string freq_offset_str; + if(!cstr2string(freq_offset, freq_offset_size, freq_offset_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->freq_offset.setValue(freq_offset_str); + field_hdl->sendAttributToServer(field_hdl->freq_offset); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_freq_offset(field_Ptr field_hdl, char * freq_offset, int freq_offset_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->freq_offset.getInheritedValue(),freq_offset , freq_offset_size)) + ERROR("void cxios_get_field_freq_offset(field_Ptr field_hdl, char * freq_offset, int freq_offset_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_freq_offset(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->freq_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_freq_op(field_Ptr field_hdl, const char * freq_op, int freq_op_size) + { + std::string freq_op_str; + if(!cstr2string(freq_op, freq_op_size, freq_op_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->freq_op.setValue(freq_op_str); + field_hdl->sendAttributToServer(field_hdl->freq_op); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_freq_op(field_Ptr field_hdl, char * freq_op, int freq_op_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->freq_op.getInheritedValue(),freq_op , freq_op_size)) + ERROR("void cxios_get_field_freq_op(field_Ptr field_hdl, char * freq_op, int freq_op_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_freq_op(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->freq_op.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_grid_ref(field_Ptr field_hdl, const char * grid_ref, int grid_ref_size) + { + std::string grid_ref_str; + if(!cstr2string(grid_ref, grid_ref_size, grid_ref_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->grid_ref.setValue(grid_ref_str); + field_hdl->sendAttributToServer(field_hdl->grid_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_grid_ref(field_Ptr field_hdl, char * grid_ref, int grid_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->grid_ref.getInheritedValue(),grid_ref , grid_ref_size)) + ERROR("void cxios_get_field_grid_ref(field_Ptr field_hdl, char * grid_ref, int grid_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_grid_ref(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->grid_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_level(field_Ptr field_hdl, int level) + { + CTimer::get("XIOS").resume(); + field_hdl->level.setValue(level); + field_hdl->sendAttributToServer(field_hdl->level); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_level(field_Ptr field_hdl, int* level) + { + *level = field_hdl->level.getInheritedValue(); + } + + bool cxios_is_defined_field_level(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_long_name(field_Ptr field_hdl, const char * long_name, int long_name_size) + { + std::string long_name_str; + if(!cstr2string(long_name, long_name_size, long_name_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->long_name.setValue(long_name_str); + field_hdl->sendAttributToServer(field_hdl->long_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_long_name(field_Ptr field_hdl, char * long_name, int long_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->long_name.getInheritedValue(),long_name , long_name_size)) + ERROR("void cxios_get_field_long_name(field_Ptr field_hdl, char * long_name, int long_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_long_name(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_name(field_Ptr field_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->name.setValue(name_str); + field_hdl->sendAttributToServer(field_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_name(field_Ptr field_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_field_name(field_Ptr field_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_name(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_operation(field_Ptr field_hdl, const char * operation, int operation_size) + { + std::string operation_str; + if(!cstr2string(operation, operation_size, operation_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->operation.setValue(operation_str); + field_hdl->sendAttributToServer(field_hdl->operation); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_operation(field_Ptr field_hdl, char * operation, int operation_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->operation.getInheritedValue(),operation , operation_size)) + ERROR("void cxios_get_field_operation(field_Ptr field_hdl, char * operation, int operation_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_operation(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->operation.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_prec(field_Ptr field_hdl, int prec) + { + CTimer::get("XIOS").resume(); + field_hdl->prec.setValue(prec); + field_hdl->sendAttributToServer(field_hdl->prec); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_prec(field_Ptr field_hdl, int* prec) + { + *prec = field_hdl->prec.getInheritedValue(); + } + + bool cxios_is_defined_field_prec(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->prec.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_scale_factor(field_Ptr field_hdl, double scale_factor) + { + CTimer::get("XIOS").resume(); + field_hdl->scale_factor.setValue(scale_factor); + field_hdl->sendAttributToServer(field_hdl->scale_factor); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_scale_factor(field_Ptr field_hdl, double* scale_factor) + { + *scale_factor = field_hdl->scale_factor.getInheritedValue(); + } + + bool cxios_is_defined_field_scale_factor(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->scale_factor.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_standard_name(field_Ptr field_hdl, const char * standard_name, int standard_name_size) + { + std::string standard_name_str; + if(!cstr2string(standard_name, standard_name_size, standard_name_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->standard_name.setValue(standard_name_str); + field_hdl->sendAttributToServer(field_hdl->standard_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_standard_name(field_Ptr field_hdl, char * standard_name, int standard_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->standard_name.getInheritedValue(),standard_name , standard_name_size)) + ERROR("void cxios_get_field_standard_name(field_Ptr field_hdl, char * standard_name, int standard_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_standard_name(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_unit(field_Ptr field_hdl, const char * unit, int unit_size) + { + std::string unit_str; + if(!cstr2string(unit, unit_size, unit_str)) return; + CTimer::get("XIOS").resume(); + field_hdl->unit.setValue(unit_str); + field_hdl->sendAttributToServer(field_hdl->unit); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_unit(field_Ptr field_hdl, char * unit, int unit_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(field_hdl->unit.getInheritedValue(),unit , unit_size)) + ERROR("void cxios_get_field_unit(field_Ptr field_hdl, char * unit, int unit_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_field_unit(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_valid_max(field_Ptr field_hdl, double valid_max) + { + CTimer::get("XIOS").resume(); + field_hdl->valid_max.setValue(valid_max); + field_hdl->sendAttributToServer(field_hdl->valid_max); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_valid_max(field_Ptr field_hdl, double* valid_max) + { + *valid_max = field_hdl->valid_max.getInheritedValue(); + } + + bool cxios_is_defined_field_valid_max(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->valid_max.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_field_valid_min(field_Ptr field_hdl, double valid_min) + { + CTimer::get("XIOS").resume(); + field_hdl->valid_min.setValue(valid_min); + field_hdl->sendAttributToServer(field_hdl->valid_min); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_field_valid_min(field_Ptr field_hdl, double* valid_min) + { + *valid_min = field_hdl->valid_min.getInheritedValue(); + } + + bool cxios_is_defined_field_valid_min(field_Ptr field_hdl ) + { + CTimer::get("XIOS").resume(); + return field_hdl->valid_min.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icfieldgroup_attr.cpp b/src/interface/c_attr/icfieldgroup_attr.cpp new file mode 100644 index 0000000..e793c5a --- /dev/null +++ b/src/interface/c_attr/icfieldgroup_attr.cpp @@ -0,0 +1,542 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CFieldGroup* fieldgroup_Ptr; + + void cxios_set_fieldgroup_add_offset(fieldgroup_Ptr fieldgroup_hdl, double add_offset) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->add_offset.setValue(add_offset); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->add_offset); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_add_offset(fieldgroup_Ptr fieldgroup_hdl, double* add_offset) + { + *add_offset = fieldgroup_hdl->add_offset.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_add_offset(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->add_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_axis_ref(fieldgroup_Ptr fieldgroup_hdl, const char * axis_ref, int axis_ref_size) + { + std::string axis_ref_str; + if(!cstr2string(axis_ref, axis_ref_size, axis_ref_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->axis_ref.setValue(axis_ref_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->axis_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_axis_ref(fieldgroup_Ptr fieldgroup_hdl, char * axis_ref, int axis_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->axis_ref.getInheritedValue(),axis_ref , axis_ref_size)) + ERROR("void cxios_get_fieldgroup_axis_ref(fieldgroup_Ptr fieldgroup_hdl, char * axis_ref, int axis_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_axis_ref(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_default_value(fieldgroup_Ptr fieldgroup_hdl, double default_value) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->default_value.setValue(default_value); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->default_value); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_default_value(fieldgroup_Ptr fieldgroup_hdl, double* default_value) + { + *default_value = fieldgroup_hdl->default_value.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_default_value(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->default_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_detect_missing_value(fieldgroup_Ptr fieldgroup_hdl, bool detect_missing_value) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->detect_missing_value.setValue(detect_missing_value); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->detect_missing_value); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_detect_missing_value(fieldgroup_Ptr fieldgroup_hdl, bool* detect_missing_value) + { + *detect_missing_value = fieldgroup_hdl->detect_missing_value.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_detect_missing_value(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->detect_missing_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_domain_ref(fieldgroup_Ptr fieldgroup_hdl, const char * domain_ref, int domain_ref_size) + { + std::string domain_ref_str; + if(!cstr2string(domain_ref, domain_ref_size, domain_ref_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->domain_ref.setValue(domain_ref_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->domain_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_domain_ref(fieldgroup_Ptr fieldgroup_hdl, char * domain_ref, int domain_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->domain_ref.getInheritedValue(),domain_ref , domain_ref_size)) + ERROR("void cxios_get_fieldgroup_domain_ref(fieldgroup_Ptr fieldgroup_hdl, char * domain_ref, int domain_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_domain_ref(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_enabled(fieldgroup_Ptr fieldgroup_hdl, bool enabled) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->enabled.setValue(enabled); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->enabled); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_enabled(fieldgroup_Ptr fieldgroup_hdl, bool* enabled) + { + *enabled = fieldgroup_hdl->enabled.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_enabled(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_field_ref(fieldgroup_Ptr fieldgroup_hdl, const char * field_ref, int field_ref_size) + { + std::string field_ref_str; + if(!cstr2string(field_ref, field_ref_size, field_ref_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->field_ref.setValue(field_ref_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->field_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_field_ref(fieldgroup_Ptr fieldgroup_hdl, char * field_ref, int field_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->field_ref.getInheritedValue(),field_ref , field_ref_size)) + ERROR("void cxios_get_fieldgroup_field_ref(fieldgroup_Ptr fieldgroup_hdl, char * field_ref, int field_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_field_ref(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->field_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_freq_offset(fieldgroup_Ptr fieldgroup_hdl, const char * freq_offset, int freq_offset_size) + { + std::string freq_offset_str; + if(!cstr2string(freq_offset, freq_offset_size, freq_offset_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->freq_offset.setValue(freq_offset_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->freq_offset); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_freq_offset(fieldgroup_Ptr fieldgroup_hdl, char * freq_offset, int freq_offset_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->freq_offset.getInheritedValue(),freq_offset , freq_offset_size)) + ERROR("void cxios_get_fieldgroup_freq_offset(fieldgroup_Ptr fieldgroup_hdl, char * freq_offset, int freq_offset_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_freq_offset(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->freq_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_freq_op(fieldgroup_Ptr fieldgroup_hdl, const char * freq_op, int freq_op_size) + { + std::string freq_op_str; + if(!cstr2string(freq_op, freq_op_size, freq_op_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->freq_op.setValue(freq_op_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->freq_op); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_freq_op(fieldgroup_Ptr fieldgroup_hdl, char * freq_op, int freq_op_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->freq_op.getInheritedValue(),freq_op , freq_op_size)) + ERROR("void cxios_get_fieldgroup_freq_op(fieldgroup_Ptr fieldgroup_hdl, char * freq_op, int freq_op_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_freq_op(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->freq_op.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_grid_ref(fieldgroup_Ptr fieldgroup_hdl, const char * grid_ref, int grid_ref_size) + { + std::string grid_ref_str; + if(!cstr2string(grid_ref, grid_ref_size, grid_ref_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->grid_ref.setValue(grid_ref_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->grid_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_grid_ref(fieldgroup_Ptr fieldgroup_hdl, char * grid_ref, int grid_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->grid_ref.getInheritedValue(),grid_ref , grid_ref_size)) + ERROR("void cxios_get_fieldgroup_grid_ref(fieldgroup_Ptr fieldgroup_hdl, char * grid_ref, int grid_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_grid_ref(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->grid_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_group_ref(fieldgroup_Ptr fieldgroup_hdl, const char * group_ref, int group_ref_size) + { + std::string group_ref_str; + if(!cstr2string(group_ref, group_ref_size, group_ref_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->group_ref.setValue(group_ref_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_group_ref(fieldgroup_Ptr fieldgroup_hdl, char * group_ref, int group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->group_ref.getInheritedValue(),group_ref , group_ref_size)) + ERROR("void cxios_get_fieldgroup_group_ref(fieldgroup_Ptr fieldgroup_hdl, char * group_ref, int group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_group_ref(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_level(fieldgroup_Ptr fieldgroup_hdl, int level) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->level.setValue(level); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->level); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_level(fieldgroup_Ptr fieldgroup_hdl, int* level) + { + *level = fieldgroup_hdl->level.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_level(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_long_name(fieldgroup_Ptr fieldgroup_hdl, const char * long_name, int long_name_size) + { + std::string long_name_str; + if(!cstr2string(long_name, long_name_size, long_name_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->long_name.setValue(long_name_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->long_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_long_name(fieldgroup_Ptr fieldgroup_hdl, char * long_name, int long_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->long_name.getInheritedValue(),long_name , long_name_size)) + ERROR("void cxios_get_fieldgroup_long_name(fieldgroup_Ptr fieldgroup_hdl, char * long_name, int long_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_long_name(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_name(fieldgroup_Ptr fieldgroup_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->name.setValue(name_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_name(fieldgroup_Ptr fieldgroup_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_fieldgroup_name(fieldgroup_Ptr fieldgroup_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_name(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_operation(fieldgroup_Ptr fieldgroup_hdl, const char * operation, int operation_size) + { + std::string operation_str; + if(!cstr2string(operation, operation_size, operation_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->operation.setValue(operation_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->operation); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_operation(fieldgroup_Ptr fieldgroup_hdl, char * operation, int operation_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->operation.getInheritedValue(),operation , operation_size)) + ERROR("void cxios_get_fieldgroup_operation(fieldgroup_Ptr fieldgroup_hdl, char * operation, int operation_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_operation(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->operation.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_prec(fieldgroup_Ptr fieldgroup_hdl, int prec) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->prec.setValue(prec); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->prec); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_prec(fieldgroup_Ptr fieldgroup_hdl, int* prec) + { + *prec = fieldgroup_hdl->prec.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_prec(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->prec.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_scale_factor(fieldgroup_Ptr fieldgroup_hdl, double scale_factor) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->scale_factor.setValue(scale_factor); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->scale_factor); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_scale_factor(fieldgroup_Ptr fieldgroup_hdl, double* scale_factor) + { + *scale_factor = fieldgroup_hdl->scale_factor.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_scale_factor(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->scale_factor.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_standard_name(fieldgroup_Ptr fieldgroup_hdl, const char * standard_name, int standard_name_size) + { + std::string standard_name_str; + if(!cstr2string(standard_name, standard_name_size, standard_name_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->standard_name.setValue(standard_name_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->standard_name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_standard_name(fieldgroup_Ptr fieldgroup_hdl, char * standard_name, int standard_name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->standard_name.getInheritedValue(),standard_name , standard_name_size)) + ERROR("void cxios_get_fieldgroup_standard_name(fieldgroup_Ptr fieldgroup_hdl, char * standard_name, int standard_name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_standard_name(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_unit(fieldgroup_Ptr fieldgroup_hdl, const char * unit, int unit_size) + { + std::string unit_str; + if(!cstr2string(unit, unit_size, unit_str)) return; + CTimer::get("XIOS").resume(); + fieldgroup_hdl->unit.setValue(unit_str); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->unit); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_unit(fieldgroup_Ptr fieldgroup_hdl, char * unit, int unit_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(fieldgroup_hdl->unit.getInheritedValue(),unit , unit_size)) + ERROR("void cxios_get_fieldgroup_unit(fieldgroup_Ptr fieldgroup_hdl, char * unit, int unit_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_fieldgroup_unit(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_valid_max(fieldgroup_Ptr fieldgroup_hdl, double valid_max) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->valid_max.setValue(valid_max); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->valid_max); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_valid_max(fieldgroup_Ptr fieldgroup_hdl, double* valid_max) + { + *valid_max = fieldgroup_hdl->valid_max.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_valid_max(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->valid_max.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_fieldgroup_valid_min(fieldgroup_Ptr fieldgroup_hdl, double valid_min) + { + CTimer::get("XIOS").resume(); + fieldgroup_hdl->valid_min.setValue(valid_min); + fieldgroup_hdl->sendAttributToServer(fieldgroup_hdl->valid_min); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_fieldgroup_valid_min(fieldgroup_Ptr fieldgroup_hdl, double* valid_min) + { + *valid_min = fieldgroup_hdl->valid_min.getInheritedValue(); + } + + bool cxios_is_defined_fieldgroup_valid_min(fieldgroup_Ptr fieldgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return fieldgroup_hdl->valid_min.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icfile_attr.cpp b/src/interface/c_attr/icfile_attr.cpp new file mode 100644 index 0000000..89c91fb --- /dev/null +++ b/src/interface/c_attr/icfile_attr.cpp @@ -0,0 +1,329 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CFile* file_Ptr; + + void cxios_set_file_description(file_Ptr file_hdl, const char * description, int description_size) + { + std::string description_str; + if(!cstr2string(description, description_size, description_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->description.setValue(description_str); + file_hdl->sendAttributToServer(file_hdl->description); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_description(file_Ptr file_hdl, char * description, int description_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->description.getInheritedValue(),description , description_size)) + ERROR("void cxios_get_file_description(file_Ptr file_hdl, char * description, int description_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_description(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_enabled(file_Ptr file_hdl, bool enabled) + { + CTimer::get("XIOS").resume(); + file_hdl->enabled.setValue(enabled); + file_hdl->sendAttributToServer(file_hdl->enabled); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_enabled(file_Ptr file_hdl, bool* enabled) + { + *enabled = file_hdl->enabled.getInheritedValue(); + } + + bool cxios_is_defined_file_enabled(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_min_digits(file_Ptr file_hdl, int min_digits) + { + CTimer::get("XIOS").resume(); + file_hdl->min_digits.setValue(min_digits); + file_hdl->sendAttributToServer(file_hdl->min_digits); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_min_digits(file_Ptr file_hdl, int* min_digits) + { + *min_digits = file_hdl->min_digits.getInheritedValue(); + } + + bool cxios_is_defined_file_min_digits(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->min_digits.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_name(file_Ptr file_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->name.setValue(name_str); + file_hdl->sendAttributToServer(file_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_name(file_Ptr file_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_file_name(file_Ptr file_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_name(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_name_suffix(file_Ptr file_hdl, const char * name_suffix, int name_suffix_size) + { + std::string name_suffix_str; + if(!cstr2string(name_suffix, name_suffix_size, name_suffix_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->name_suffix.setValue(name_suffix_str); + file_hdl->sendAttributToServer(file_hdl->name_suffix); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_name_suffix(file_Ptr file_hdl, char * name_suffix, int name_suffix_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->name_suffix.getInheritedValue(),name_suffix , name_suffix_size)) + ERROR("void cxios_get_file_name_suffix(file_Ptr file_hdl, char * name_suffix, int name_suffix_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_name_suffix(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->name_suffix.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_output_freq(file_Ptr file_hdl, const char * output_freq, int output_freq_size) + { + std::string output_freq_str; + if(!cstr2string(output_freq, output_freq_size, output_freq_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->output_freq.setValue(output_freq_str); + file_hdl->sendAttributToServer(file_hdl->output_freq); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_output_freq(file_Ptr file_hdl, char * output_freq, int output_freq_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->output_freq.getInheritedValue(),output_freq , output_freq_size)) + ERROR("void cxios_get_file_output_freq(file_Ptr file_hdl, char * output_freq, int output_freq_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_output_freq(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->output_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_output_level(file_Ptr file_hdl, int output_level) + { + CTimer::get("XIOS").resume(); + file_hdl->output_level.setValue(output_level); + file_hdl->sendAttributToServer(file_hdl->output_level); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_output_level(file_Ptr file_hdl, int* output_level) + { + *output_level = file_hdl->output_level.getInheritedValue(); + } + + bool cxios_is_defined_file_output_level(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->output_level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_par_access(file_Ptr file_hdl, const char * par_access, int par_access_size) + { + std::string par_access_str; + if(!cstr2string(par_access, par_access_size, par_access_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->par_access.setValue(par_access_str); + file_hdl->sendAttributToServer(file_hdl->par_access); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_par_access(file_Ptr file_hdl, char * par_access, int par_access_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->par_access.getInheritedValue(),par_access , par_access_size)) + ERROR("void cxios_get_file_par_access(file_Ptr file_hdl, char * par_access, int par_access_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_par_access(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->par_access.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_split_freq(file_Ptr file_hdl, const char * split_freq, int split_freq_size) + { + std::string split_freq_str; + if(!cstr2string(split_freq, split_freq_size, split_freq_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->split_freq.setValue(split_freq_str); + file_hdl->sendAttributToServer(file_hdl->split_freq); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_split_freq(file_Ptr file_hdl, char * split_freq, int split_freq_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->split_freq.getInheritedValue(),split_freq , split_freq_size)) + ERROR("void cxios_get_file_split_freq(file_Ptr file_hdl, char * split_freq, int split_freq_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_split_freq(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->split_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_split_freq_format(file_Ptr file_hdl, const char * split_freq_format, int split_freq_format_size) + { + std::string split_freq_format_str; + if(!cstr2string(split_freq_format, split_freq_format_size, split_freq_format_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->split_freq_format.setValue(split_freq_format_str); + file_hdl->sendAttributToServer(file_hdl->split_freq_format); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_split_freq_format(file_Ptr file_hdl, char * split_freq_format, int split_freq_format_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->split_freq_format.getInheritedValue(),split_freq_format , split_freq_format_size)) + ERROR("void cxios_get_file_split_freq_format(file_Ptr file_hdl, char * split_freq_format, int split_freq_format_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_split_freq_format(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->split_freq_format.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_sync_freq(file_Ptr file_hdl, const char * sync_freq, int sync_freq_size) + { + std::string sync_freq_str; + if(!cstr2string(sync_freq, sync_freq_size, sync_freq_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->sync_freq.setValue(sync_freq_str); + file_hdl->sendAttributToServer(file_hdl->sync_freq); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_sync_freq(file_Ptr file_hdl, char * sync_freq, int sync_freq_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->sync_freq.getInheritedValue(),sync_freq , sync_freq_size)) + ERROR("void cxios_get_file_sync_freq(file_Ptr file_hdl, char * sync_freq, int sync_freq_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_sync_freq(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->sync_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_file_type(file_Ptr file_hdl, const char * type, int type_size) + { + std::string type_str; + if(!cstr2string(type, type_size, type_str)) return; + CTimer::get("XIOS").resume(); + file_hdl->type.fromString(type_str); + file_hdl->sendAttributToServer(file_hdl->type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_file_type(file_Ptr file_hdl, char * type, int type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(file_hdl->type.getInheritedStringValue(),type , type_size)) + ERROR("void cxios_get_file_type(file_Ptr file_hdl, char * type, int type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_file_type(file_Ptr file_hdl ) + { + CTimer::get("XIOS").resume(); + return file_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icfilegroup_attr.cpp b/src/interface/c_attr/icfilegroup_attr.cpp new file mode 100644 index 0000000..fe3d98c --- /dev/null +++ b/src/interface/c_attr/icfilegroup_attr.cpp @@ -0,0 +1,356 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CFileGroup* filegroup_Ptr; + + void cxios_set_filegroup_description(filegroup_Ptr filegroup_hdl, const char * description, int description_size) + { + std::string description_str; + if(!cstr2string(description, description_size, description_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->description.setValue(description_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->description); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_description(filegroup_Ptr filegroup_hdl, char * description, int description_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->description.getInheritedValue(),description , description_size)) + ERROR("void cxios_get_filegroup_description(filegroup_Ptr filegroup_hdl, char * description, int description_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_description(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_enabled(filegroup_Ptr filegroup_hdl, bool enabled) + { + CTimer::get("XIOS").resume(); + filegroup_hdl->enabled.setValue(enabled); + filegroup_hdl->sendAttributToServer(filegroup_hdl->enabled); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_enabled(filegroup_Ptr filegroup_hdl, bool* enabled) + { + *enabled = filegroup_hdl->enabled.getInheritedValue(); + } + + bool cxios_is_defined_filegroup_enabled(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_group_ref(filegroup_Ptr filegroup_hdl, const char * group_ref, int group_ref_size) + { + std::string group_ref_str; + if(!cstr2string(group_ref, group_ref_size, group_ref_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->group_ref.setValue(group_ref_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_group_ref(filegroup_Ptr filegroup_hdl, char * group_ref, int group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->group_ref.getInheritedValue(),group_ref , group_ref_size)) + ERROR("void cxios_get_filegroup_group_ref(filegroup_Ptr filegroup_hdl, char * group_ref, int group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_group_ref(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_min_digits(filegroup_Ptr filegroup_hdl, int min_digits) + { + CTimer::get("XIOS").resume(); + filegroup_hdl->min_digits.setValue(min_digits); + filegroup_hdl->sendAttributToServer(filegroup_hdl->min_digits); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_min_digits(filegroup_Ptr filegroup_hdl, int* min_digits) + { + *min_digits = filegroup_hdl->min_digits.getInheritedValue(); + } + + bool cxios_is_defined_filegroup_min_digits(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->min_digits.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_name(filegroup_Ptr filegroup_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->name.setValue(name_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_name(filegroup_Ptr filegroup_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_filegroup_name(filegroup_Ptr filegroup_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_name(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_name_suffix(filegroup_Ptr filegroup_hdl, const char * name_suffix, int name_suffix_size) + { + std::string name_suffix_str; + if(!cstr2string(name_suffix, name_suffix_size, name_suffix_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->name_suffix.setValue(name_suffix_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->name_suffix); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_name_suffix(filegroup_Ptr filegroup_hdl, char * name_suffix, int name_suffix_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->name_suffix.getInheritedValue(),name_suffix , name_suffix_size)) + ERROR("void cxios_get_filegroup_name_suffix(filegroup_Ptr filegroup_hdl, char * name_suffix, int name_suffix_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_name_suffix(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->name_suffix.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_output_freq(filegroup_Ptr filegroup_hdl, const char * output_freq, int output_freq_size) + { + std::string output_freq_str; + if(!cstr2string(output_freq, output_freq_size, output_freq_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->output_freq.setValue(output_freq_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->output_freq); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_output_freq(filegroup_Ptr filegroup_hdl, char * output_freq, int output_freq_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->output_freq.getInheritedValue(),output_freq , output_freq_size)) + ERROR("void cxios_get_filegroup_output_freq(filegroup_Ptr filegroup_hdl, char * output_freq, int output_freq_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_output_freq(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->output_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_output_level(filegroup_Ptr filegroup_hdl, int output_level) + { + CTimer::get("XIOS").resume(); + filegroup_hdl->output_level.setValue(output_level); + filegroup_hdl->sendAttributToServer(filegroup_hdl->output_level); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_output_level(filegroup_Ptr filegroup_hdl, int* output_level) + { + *output_level = filegroup_hdl->output_level.getInheritedValue(); + } + + bool cxios_is_defined_filegroup_output_level(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->output_level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_par_access(filegroup_Ptr filegroup_hdl, const char * par_access, int par_access_size) + { + std::string par_access_str; + if(!cstr2string(par_access, par_access_size, par_access_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->par_access.setValue(par_access_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->par_access); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_par_access(filegroup_Ptr filegroup_hdl, char * par_access, int par_access_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->par_access.getInheritedValue(),par_access , par_access_size)) + ERROR("void cxios_get_filegroup_par_access(filegroup_Ptr filegroup_hdl, char * par_access, int par_access_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_par_access(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->par_access.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_split_freq(filegroup_Ptr filegroup_hdl, const char * split_freq, int split_freq_size) + { + std::string split_freq_str; + if(!cstr2string(split_freq, split_freq_size, split_freq_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->split_freq.setValue(split_freq_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->split_freq); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_split_freq(filegroup_Ptr filegroup_hdl, char * split_freq, int split_freq_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->split_freq.getInheritedValue(),split_freq , split_freq_size)) + ERROR("void cxios_get_filegroup_split_freq(filegroup_Ptr filegroup_hdl, char * split_freq, int split_freq_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_split_freq(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->split_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_split_freq_format(filegroup_Ptr filegroup_hdl, const char * split_freq_format, int split_freq_format_size) + { + std::string split_freq_format_str; + if(!cstr2string(split_freq_format, split_freq_format_size, split_freq_format_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->split_freq_format.setValue(split_freq_format_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->split_freq_format); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_split_freq_format(filegroup_Ptr filegroup_hdl, char * split_freq_format, int split_freq_format_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->split_freq_format.getInheritedValue(),split_freq_format , split_freq_format_size)) + ERROR("void cxios_get_filegroup_split_freq_format(filegroup_Ptr filegroup_hdl, char * split_freq_format, int split_freq_format_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_split_freq_format(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->split_freq_format.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_sync_freq(filegroup_Ptr filegroup_hdl, const char * sync_freq, int sync_freq_size) + { + std::string sync_freq_str; + if(!cstr2string(sync_freq, sync_freq_size, sync_freq_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->sync_freq.setValue(sync_freq_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->sync_freq); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_sync_freq(filegroup_Ptr filegroup_hdl, char * sync_freq, int sync_freq_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->sync_freq.getInheritedValue(),sync_freq , sync_freq_size)) + ERROR("void cxios_get_filegroup_sync_freq(filegroup_Ptr filegroup_hdl, char * sync_freq, int sync_freq_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_sync_freq(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->sync_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_filegroup_type(filegroup_Ptr filegroup_hdl, const char * type, int type_size) + { + std::string type_str; + if(!cstr2string(type, type_size, type_str)) return; + CTimer::get("XIOS").resume(); + filegroup_hdl->type.fromString(type_str); + filegroup_hdl->sendAttributToServer(filegroup_hdl->type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_filegroup_type(filegroup_Ptr filegroup_hdl, char * type, int type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(filegroup_hdl->type.getInheritedStringValue(),type , type_size)) + ERROR("void cxios_get_filegroup_type(filegroup_Ptr filegroup_hdl, char * type, int type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_filegroup_type(filegroup_Ptr filegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return filegroup_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icgrid_attr.cpp b/src/interface/c_attr/icgrid_attr.cpp new file mode 100644 index 0000000..4c54d1c --- /dev/null +++ b/src/interface/c_attr/icgrid_attr.cpp @@ -0,0 +1,154 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CGrid* grid_Ptr; + + void cxios_set_grid_axis_ref(grid_Ptr grid_hdl, const char * axis_ref, int axis_ref_size) + { + std::string axis_ref_str; + if(!cstr2string(axis_ref, axis_ref_size, axis_ref_str)) return; + CTimer::get("XIOS").resume(); + grid_hdl->axis_ref.setValue(axis_ref_str); + grid_hdl->sendAttributToServer(grid_hdl->axis_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_grid_axis_ref(grid_Ptr grid_hdl, char * axis_ref, int axis_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(grid_hdl->axis_ref.getInheritedValue(),axis_ref , axis_ref_size)) + ERROR("void cxios_get_grid_axis_ref(grid_Ptr grid_hdl, char * axis_ref, int axis_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_grid_axis_ref(grid_Ptr grid_hdl ) + { + CTimer::get("XIOS").resume(); + return grid_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_grid_description(grid_Ptr grid_hdl, const char * description, int description_size) + { + std::string description_str; + if(!cstr2string(description, description_size, description_str)) return; + CTimer::get("XIOS").resume(); + grid_hdl->description.setValue(description_str); + grid_hdl->sendAttributToServer(grid_hdl->description); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_grid_description(grid_Ptr grid_hdl, char * description, int description_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(grid_hdl->description.getInheritedValue(),description , description_size)) + ERROR("void cxios_get_grid_description(grid_Ptr grid_hdl, char * description, int description_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_grid_description(grid_Ptr grid_hdl ) + { + CTimer::get("XIOS").resume(); + return grid_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_grid_domain_ref(grid_Ptr grid_hdl, const char * domain_ref, int domain_ref_size) + { + std::string domain_ref_str; + if(!cstr2string(domain_ref, domain_ref_size, domain_ref_str)) return; + CTimer::get("XIOS").resume(); + grid_hdl->domain_ref.setValue(domain_ref_str); + grid_hdl->sendAttributToServer(grid_hdl->domain_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_grid_domain_ref(grid_Ptr grid_hdl, char * domain_ref, int domain_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(grid_hdl->domain_ref.getInheritedValue(),domain_ref , domain_ref_size)) + ERROR("void cxios_get_grid_domain_ref(grid_Ptr grid_hdl, char * domain_ref, int domain_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_grid_domain_ref(grid_Ptr grid_hdl ) + { + CTimer::get("XIOS").resume(); + return grid_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_grid_mask(grid_Ptr grid_hdl, bool* mask, int extent1, int extent2, int extent3) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2,extent3),neverDeleteData) ; + grid_hdl->mask.reference(tmp.copy()); + grid_hdl->sendAttributToServer(grid_hdl->mask); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_grid_mask(grid_Ptr grid_hdl, bool* mask, int extent1, int extent2, int extent3) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2,extent3),neverDeleteData) ; + tmp=grid_hdl->mask.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_grid_mask(grid_Ptr grid_hdl ) + { + CTimer::get("XIOS").resume(); + return grid_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_grid_name(grid_Ptr grid_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + grid_hdl->name.setValue(name_str); + grid_hdl->sendAttributToServer(grid_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_grid_name(grid_Ptr grid_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(grid_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_grid_name(grid_Ptr grid_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_grid_name(grid_Ptr grid_hdl ) + { + CTimer::get("XIOS").resume(); + return grid_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icgridgroup_attr.cpp b/src/interface/c_attr/icgridgroup_attr.cpp new file mode 100644 index 0000000..793b696 --- /dev/null +++ b/src/interface/c_attr/icgridgroup_attr.cpp @@ -0,0 +1,181 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CGridGroup* gridgroup_Ptr; + + void cxios_set_gridgroup_axis_ref(gridgroup_Ptr gridgroup_hdl, const char * axis_ref, int axis_ref_size) + { + std::string axis_ref_str; + if(!cstr2string(axis_ref, axis_ref_size, axis_ref_str)) return; + CTimer::get("XIOS").resume(); + gridgroup_hdl->axis_ref.setValue(axis_ref_str); + gridgroup_hdl->sendAttributToServer(gridgroup_hdl->axis_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_gridgroup_axis_ref(gridgroup_Ptr gridgroup_hdl, char * axis_ref, int axis_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(gridgroup_hdl->axis_ref.getInheritedValue(),axis_ref , axis_ref_size)) + ERROR("void cxios_get_gridgroup_axis_ref(gridgroup_Ptr gridgroup_hdl, char * axis_ref, int axis_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_gridgroup_axis_ref(gridgroup_Ptr gridgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return gridgroup_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_gridgroup_description(gridgroup_Ptr gridgroup_hdl, const char * description, int description_size) + { + std::string description_str; + if(!cstr2string(description, description_size, description_str)) return; + CTimer::get("XIOS").resume(); + gridgroup_hdl->description.setValue(description_str); + gridgroup_hdl->sendAttributToServer(gridgroup_hdl->description); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_gridgroup_description(gridgroup_Ptr gridgroup_hdl, char * description, int description_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(gridgroup_hdl->description.getInheritedValue(),description , description_size)) + ERROR("void cxios_get_gridgroup_description(gridgroup_Ptr gridgroup_hdl, char * description, int description_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_gridgroup_description(gridgroup_Ptr gridgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return gridgroup_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_gridgroup_domain_ref(gridgroup_Ptr gridgroup_hdl, const char * domain_ref, int domain_ref_size) + { + std::string domain_ref_str; + if(!cstr2string(domain_ref, domain_ref_size, domain_ref_str)) return; + CTimer::get("XIOS").resume(); + gridgroup_hdl->domain_ref.setValue(domain_ref_str); + gridgroup_hdl->sendAttributToServer(gridgroup_hdl->domain_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_gridgroup_domain_ref(gridgroup_Ptr gridgroup_hdl, char * domain_ref, int domain_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(gridgroup_hdl->domain_ref.getInheritedValue(),domain_ref , domain_ref_size)) + ERROR("void cxios_get_gridgroup_domain_ref(gridgroup_Ptr gridgroup_hdl, char * domain_ref, int domain_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_gridgroup_domain_ref(gridgroup_Ptr gridgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return gridgroup_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_gridgroup_group_ref(gridgroup_Ptr gridgroup_hdl, const char * group_ref, int group_ref_size) + { + std::string group_ref_str; + if(!cstr2string(group_ref, group_ref_size, group_ref_str)) return; + CTimer::get("XIOS").resume(); + gridgroup_hdl->group_ref.setValue(group_ref_str); + gridgroup_hdl->sendAttributToServer(gridgroup_hdl->group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_gridgroup_group_ref(gridgroup_Ptr gridgroup_hdl, char * group_ref, int group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(gridgroup_hdl->group_ref.getInheritedValue(),group_ref , group_ref_size)) + ERROR("void cxios_get_gridgroup_group_ref(gridgroup_Ptr gridgroup_hdl, char * group_ref, int group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_gridgroup_group_ref(gridgroup_Ptr gridgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return gridgroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_gridgroup_mask(gridgroup_Ptr gridgroup_hdl, bool* mask, int extent1, int extent2, int extent3) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2,extent3),neverDeleteData) ; + gridgroup_hdl->mask.reference(tmp.copy()); + gridgroup_hdl->sendAttributToServer(gridgroup_hdl->mask); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_gridgroup_mask(gridgroup_Ptr gridgroup_hdl, bool* mask, int extent1, int extent2, int extent3) + { + CTimer::get("XIOS").resume(); + CArray tmp(mask,shape(extent1,extent2,extent3),neverDeleteData) ; + tmp=gridgroup_hdl->mask.getInheritedValue() ; + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_gridgroup_mask(gridgroup_Ptr gridgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return gridgroup_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_gridgroup_name(gridgroup_Ptr gridgroup_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + gridgroup_hdl->name.setValue(name_str); + gridgroup_hdl->sendAttributToServer(gridgroup_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_gridgroup_name(gridgroup_Ptr gridgroup_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(gridgroup_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_gridgroup_name(gridgroup_Ptr gridgroup_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_gridgroup_name(gridgroup_Ptr gridgroup_hdl ) + { + CTimer::get("XIOS").resume(); + return gridgroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icvariable_attr.cpp b/src/interface/c_attr/icvariable_attr.cpp new file mode 100644 index 0000000..c982955 --- /dev/null +++ b/src/interface/c_attr/icvariable_attr.cpp @@ -0,0 +1,74 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CVariable* variable_Ptr; + + void cxios_set_variable_name(variable_Ptr variable_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + variable_hdl->name.setValue(name_str); + variable_hdl->sendAttributToServer(variable_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_variable_name(variable_Ptr variable_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(variable_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_variable_name(variable_Ptr variable_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_variable_name(variable_Ptr variable_hdl ) + { + CTimer::get("XIOS").resume(); + return variable_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_variable_type(variable_Ptr variable_hdl, const char * type, int type_size) + { + std::string type_str; + if(!cstr2string(type, type_size, type_str)) return; + CTimer::get("XIOS").resume(); + variable_hdl->type.setValue(type_str); + variable_hdl->sendAttributToServer(variable_hdl->type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_variable_type(variable_Ptr variable_hdl, char * type, int type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(variable_hdl->type.getInheritedValue(),type , type_size)) + ERROR("void cxios_get_variable_type(variable_Ptr variable_hdl, char * type, int type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_variable_type(variable_Ptr variable_hdl ) + { + CTimer::get("XIOS").resume(); + return variable_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/c_attr/icvariablegroup_attr.cpp b/src/interface/c_attr/icvariablegroup_attr.cpp new file mode 100644 index 0000000..70a5c33 --- /dev/null +++ b/src/interface/c_attr/icvariablegroup_attr.cpp @@ -0,0 +1,101 @@ +/* ************************************************************************** * + * Interface auto generated - do not modify * + * ************************************************************************** */ + +#include +#include +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "icutil.hpp" +#include "timer.hpp" +#include "node_type.hpp" + +extern "C" +{ + typedef xios::CVariableGroup* variablegroup_Ptr; + + void cxios_set_variablegroup_group_ref(variablegroup_Ptr variablegroup_hdl, const char * group_ref, int group_ref_size) + { + std::string group_ref_str; + if(!cstr2string(group_ref, group_ref_size, group_ref_str)) return; + CTimer::get("XIOS").resume(); + variablegroup_hdl->group_ref.setValue(group_ref_str); + variablegroup_hdl->sendAttributToServer(variablegroup_hdl->group_ref); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_variablegroup_group_ref(variablegroup_Ptr variablegroup_hdl, char * group_ref, int group_ref_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(variablegroup_hdl->group_ref.getInheritedValue(),group_ref , group_ref_size)) + ERROR("void cxios_get_variablegroup_group_ref(variablegroup_Ptr variablegroup_hdl, char * group_ref, int group_ref_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_variablegroup_group_ref(variablegroup_Ptr variablegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return variablegroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_variablegroup_name(variablegroup_Ptr variablegroup_hdl, const char * name, int name_size) + { + std::string name_str; + if(!cstr2string(name, name_size, name_str)) return; + CTimer::get("XIOS").resume(); + variablegroup_hdl->name.setValue(name_str); + variablegroup_hdl->sendAttributToServer(variablegroup_hdl->name); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_variablegroup_name(variablegroup_Ptr variablegroup_hdl, char * name, int name_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(variablegroup_hdl->name.getInheritedValue(),name , name_size)) + ERROR("void cxios_get_variablegroup_name(variablegroup_Ptr variablegroup_hdl, char * name, int name_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_variablegroup_name(variablegroup_Ptr variablegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return variablegroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + void cxios_set_variablegroup_type(variablegroup_Ptr variablegroup_hdl, const char * type, int type_size) + { + std::string type_str; + if(!cstr2string(type, type_size, type_str)) return; + CTimer::get("XIOS").resume(); + variablegroup_hdl->type.setValue(type_str); + variablegroup_hdl->sendAttributToServer(variablegroup_hdl->type); + CTimer::get("XIOS").suspend(); + } + + void cxios_get_variablegroup_type(variablegroup_Ptr variablegroup_hdl, char * type, int type_size) + { + CTimer::get("XIOS").resume(); + if(!string_copy(variablegroup_hdl->type.getInheritedValue(),type , type_size)) + ERROR("void cxios_get_variablegroup_type(variablegroup_Ptr variablegroup_hdl, char * type, int type_size)", <<"Input string is to short"); + CTimer::get("XIOS").suspend(); + } + + bool cxios_is_defined_variablegroup_type(variablegroup_Ptr variablegroup_hdl ) + { + CTimer::get("XIOS").resume(); + return variablegroup_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + } + + + + +} diff --git a/src/interface/fortran/axis_interface.f90 b/src/interface/fortran/axis_interface.f90 new file mode 100644 index 0000000..614341e --- /dev/null +++ b/src/interface/fortran/axis_interface.f90 @@ -0,0 +1,22 @@ +MODULE AXIS_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_axis_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_axis_handle_create + + SUBROUTINE cxios_axis_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_axis_valid_id + + END INTERFACE + +END MODULE AXIS_INTERFACE diff --git a/src/interface/fortran/axisgroup_interface.f90 b/src/interface/fortran/axisgroup_interface.f90 new file mode 100644 index 0000000..fc0c884 --- /dev/null +++ b/src/interface/fortran/axisgroup_interface.f90 @@ -0,0 +1,23 @@ +MODULE AXISGROUP_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_axisgroup_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_axisgroup_handle_create + + SUBROUTINE cxios_axisgroup_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_axisgroup_valid_id + + END INTERFACE + +END MODULE AXISGROUP_INTERFACE diff --git a/src/interface/fortran/context_interface.f90 b/src/interface/fortran/context_interface.f90 new file mode 100644 index 0000000..7625cc4 --- /dev/null +++ b/src/interface/fortran/context_interface.f90 @@ -0,0 +1,28 @@ +MODULE CONTEXT_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_context_handle_create(ret, idt, idt_size) BIND(C) + import C_CHAR, C_INTPTR_T, C_INT + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_context_handle_create + + SUBROUTINE cxios_context_set_current(context, withswap) BIND(C) + import C_BOOL, C_INT, C_INTPTR_T + INTEGER (kind = C_INTPTR_T), VALUE :: context + LOGICAL (kind = C_BOOL) , VALUE :: withswap + END SUBROUTINE cxios_context_set_current + + SUBROUTINE cxios_context_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_context_valid_id + + END INTERFACE + +END MODULE CONTEXT_INTERFACE diff --git a/src/interface/fortran/domain_interface.f90 b/src/interface/fortran/domain_interface.f90 new file mode 100644 index 0000000..72d7a0f --- /dev/null +++ b/src/interface/fortran/domain_interface.f90 @@ -0,0 +1,22 @@ +MODULE DOMAIN_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_domain_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_domain_handle_create + + SUBROUTINE cxios_domain_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_domain_valid_id + + END INTERFACE + +END MODULE DOMAIN_INTERFACE diff --git a/src/interface/fortran/domaingroup_interface.f90 b/src/interface/fortran/domaingroup_interface.f90 new file mode 100644 index 0000000..7130687 --- /dev/null +++ b/src/interface/fortran/domaingroup_interface.f90 @@ -0,0 +1,22 @@ +MODULE DOMAINGROUP_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_domaingroup_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_domaingroup_handle_create + + SUBROUTINE cxios_domaingroup_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_domaingroup_valid_id + + END INTERFACE + +END MODULE DOMAINGROUP_INTERFACE diff --git a/src/interface/fortran/field_interface.f90 b/src/interface/fortran/field_interface.f90 new file mode 100644 index 0000000..e44c7bb --- /dev/null +++ b/src/interface/fortran/field_interface.f90 @@ -0,0 +1,28 @@ +MODULE FIELD_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_field_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_field_handle_create + + SUBROUTINE cxios_field_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_field_valid_id + + SUBROUTINE cxios_field_is_active(field_hdl, ret) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + LOGICAL (kind = C_BOOL) :: ret + END SUBROUTINE cxios_field_is_active + + END INTERFACE + +END MODULE FIELD_INTERFACE diff --git a/src/interface/fortran/fieldgroup_interface.f90 b/src/interface/fortran/fieldgroup_interface.f90 new file mode 100644 index 0000000..88aa4d8 --- /dev/null +++ b/src/interface/fortran/fieldgroup_interface.f90 @@ -0,0 +1,22 @@ +MODULE FIELDGROUP_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_fieldgroup_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_fieldgroup_handle_create + + SUBROUTINE cxios_fieldgroup_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_fieldgroup_valid_id + + END INTERFACE + +END MODULE FIELDGROUP_INTERFACE diff --git a/src/interface/fortran/file_interface.f90 b/src/interface/fortran/file_interface.f90 new file mode 100644 index 0000000..94e2cd0 --- /dev/null +++ b/src/interface/fortran/file_interface.f90 @@ -0,0 +1,22 @@ +MODULE FILE_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_file_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_file_handle_create + + SUBROUTINE cxios_file_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_file_valid_id + + END INTERFACE + +END MODULE FILE_INTERFACE diff --git a/src/interface/fortran/filegroup_interface.f90 b/src/interface/fortran/filegroup_interface.f90 new file mode 100644 index 0000000..173c70e --- /dev/null +++ b/src/interface/fortran/filegroup_interface.f90 @@ -0,0 +1,22 @@ +MODULE FILEGROUP_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_filegroup_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_filegroup_handle_create + + SUBROUTINE cxios_filegroup_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_filegroup_valid_id + + END INTERFACE + +END MODULE FILEGROUP_INTERFACE diff --git a/src/interface/fortran/grid_interface.f90 b/src/interface/fortran/grid_interface.f90 new file mode 100644 index 0000000..1f1cf95 --- /dev/null +++ b/src/interface/fortran/grid_interface.f90 @@ -0,0 +1,22 @@ +MODULE GRID_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_grid_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_grid_handle_create + + SUBROUTINE cxios_grid_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_grid_valid_id + + END INTERFACE + +END MODULE GRID_INTERFACE diff --git a/src/interface/fortran/gridgroup_interface.f90 b/src/interface/fortran/gridgroup_interface.f90 new file mode 100644 index 0000000..4636a74 --- /dev/null +++ b/src/interface/fortran/gridgroup_interface.f90 @@ -0,0 +1,22 @@ +MODULE GRIDGROUP_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_gridgroup_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_gridgroup_handle_create + + SUBROUTINE cxios_gridgroup_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_gridgroup_valid_id + + END INTERFACE + +END MODULE GRIDGROUP_INTERFACE diff --git a/src/interface/fortran/iaxis.F90 b/src/interface/fortran/iaxis.F90 new file mode 100644 index 0000000..7363bdd --- /dev/null +++ b/src/interface/fortran/iaxis.F90 @@ -0,0 +1,56 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IAXIS + USE, INTRINSIC :: ISO_C_BINDING + USE AXIS_INTERFACE + USE AXISGROUP_INTERFACE + + TYPE txios(axis) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(axis) + + TYPE txios(axisgroup) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(axisgroup) + + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_axis_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *), INTENT(IN) :: idt + TYPE(txios(axis)) , INTENT(OUT):: ret + CALL cxios_axis_handle_create(ret%daddr, idt, len(idt)) + END SUBROUTINE xios(get_axis_handle) + + SUBROUTINE xios(get_axisgroup_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(axisgroup)), INTENT(OUT):: ret + + CALL cxios_axisgroup_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_axisgroup_handle) + + LOGICAL FUNCTION xios(is_valid_axis)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_axis_valid_id(val, idt, len(idt)) + xios(is_valid_axis) = val + + END FUNCTION xios(is_valid_axis) + + LOGICAL FUNCTION xios(is_valid_axisgroup)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_axisgroup_valid_id(val, idt, len(idt)) + xios(is_valid_axisgroup) = val + + END FUNCTION xios(is_valid_axisgroup) + +END MODULE IAXIS diff --git a/src/interface/fortran/icontext.F90 b/src/interface/fortran/icontext.F90 new file mode 100644 index 0000000..33fa7d9 --- /dev/null +++ b/src/interface/fortran/icontext.F90 @@ -0,0 +1,52 @@ +#include "xios_fortran_prefix.hpp" + +MODULE ICONTEXT + USE, INTRINSIC :: ISO_C_BINDING + USE CONTEXT_INTERFACE +! USE icontext_attr + USE IDATE + + + TYPE txios(context) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(context) + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_context_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(context)), INTENT(OUT):: ret + + CALL cxios_context_handle_create(ret%daddr, idt, len(idt)) + END SUBROUTINE xios(get_context_handle) + + SUBROUTINE xios(set_current_context)(context, withswap) + IMPLICIT NONE + + TYPE(txios(context)) , INTENT(IN) :: context + LOGICAL , OPTIONAL, INTENT(IN) :: withswap + LOGICAL (kind = 1) :: wswap + + IF (PRESENT(withswap)) THEN + wswap = withswap + ELSE + wswap = .FALSE. + END IF + CALL cxios_context_set_current(context%daddr, wswap) + + END SUBROUTINE xios(set_current_context) + + LOGICAL FUNCTION xios(is_valid_context)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_context_valid_id(val, idt, len(idt)); + xios(is_valid_context) = val + + END FUNCTION xios(is_valid_context) + + +END MODULE ICONTEXT diff --git a/src/interface/fortran/idata.F90 b/src/interface/fortran/idata.F90 new file mode 100644 index 0000000..60b89b5 --- /dev/null +++ b/src/interface/fortran/idata.F90 @@ -0,0 +1,417 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IDATA + USE, INTRINSIC :: ISO_C_BINDING + USE ICONTEXT + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_init_server() BIND(C) + END SUBROUTINE cxios_init_server + + SUBROUTINE cxios_init_client(client_id, len_client_id, f_local_comm, f_return_comm) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: client_id + INTEGER (kind = C_INT) , VALUE :: len_client_id + INTEGER (kind = C_INT) :: f_local_comm + INTEGER (kind = C_INT) :: f_return_comm + END SUBROUTINE cxios_init_client + + SUBROUTINE cxios_context_initialize(context_id,len_context_id,f_comm) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: context_id + INTEGER (kind = C_INT) , VALUE :: len_context_id + INTEGER (kind = C_INT) :: f_comm + END SUBROUTINE cxios_context_initialize + + SUBROUTINE cxios_context_is_initialized(context_id,len_context_id,initialized) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: context_id + INTEGER (kind = C_INT) , VALUE :: len_context_id + LOGICAL (kind = C_BOOL) :: initialized + END SUBROUTINE cxios_context_is_initialized + + + SUBROUTINE cxios_context_close_definition() BIND(C) + USE ISO_C_BINDING + END SUBROUTINE cxios_context_close_definition + + + SUBROUTINE cxios_context_finalize() BIND(C) + USE ISO_C_BINDING + END SUBROUTINE cxios_context_finalize + + + SUBROUTINE cxios_finalize() BIND(C) + END SUBROUTINE cxios_finalize + + SUBROUTINE cxios_solve_inheritance() BIND(C) + END SUBROUTINE cxios_solve_inheritance + + + SUBROUTINE cxios_write_data_k81(fieldid, fieldid_size, data_k8, data_Xsize) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: fieldid + REAL (kind = C_DOUBLE), DIMENSION(*) :: data_k8 + INTEGER (kind = C_INT) , VALUE :: fieldid_size + INTEGER (kind = C_INT) , VALUE :: data_Xsize + END SUBROUTINE cxios_write_data_k81 + + SUBROUTINE cxios_write_data_k82(fieldid, fieldid_size, data_k8, data_Xsize, data_Ysize) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: fieldid + REAL (kind = C_DOUBLE), DIMENSION(*) :: data_k8 + INTEGER (kind = C_INT) , VALUE :: fieldid_size + INTEGER (kind = C_INT) , VALUE :: data_Xsize, data_Ysize + END SUBROUTINE cxios_write_data_k82 + + SUBROUTINE cxios_write_data_k83(fieldid, fieldid_size, data_k8, data_Xsize, data_Ysize, data_Zsize) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: fieldid + REAL (kind = C_DOUBLE), DIMENSION(*) :: data_k8 + INTEGER (kind = C_INT) , VALUE :: fieldid_size + INTEGER (kind = C_INT) , VALUE :: data_Xsize, data_Ysize, data_Zsize + END SUBROUTINE cxios_write_data_k83 + + SUBROUTINE cxios_write_data_k41(fieldid, fieldid_size, data_k4, data_Xsize) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: fieldid + REAL (kind = C_FLOAT) , DIMENSION(*) :: data_k4 + INTEGER (kind = C_INT) , VALUE :: fieldid_size + INTEGER (kind = C_INT) , VALUE :: data_Xsize + END SUBROUTINE cxios_write_data_k41 + + SUBROUTINE cxios_write_data_k42(fieldid, fieldid_size, data_k4, data_Xsize, data_Ysize) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: fieldid + REAL (kind = C_FLOAT) , DIMENSION(*) :: data_k4 + INTEGER (kind = C_INT) , VALUE :: fieldid_size + INTEGER (kind = C_INT) , VALUE :: data_Xsize, data_Ysize + END SUBROUTINE cxios_write_data_k42 + + SUBROUTINE cxios_write_data_k43(fieldid, fieldid_size, data_k4, data_Xsize, data_Ysize, data_Zsize) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: fieldid + REAL (kind = C_FLOAT) , DIMENSION(*) :: data_k4 + INTEGER (kind = C_INT) , VALUE :: fieldid_size + INTEGER (kind = C_INT) , VALUE :: data_Xsize, data_Ysize, data_Zsize + END SUBROUTINE cxios_write_data_k43 + + ! Binding C and Fortran interface of get_variable (icdata.cpp) + SUBROUTINE cxios_get_variable_data_k8(vardid, varid_size, data_k8, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + REAL (kind = C_DOUBLE) :: data_k8 + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_get_variable_data_k8 + + SUBROUTINE cxios_get_variable_data_k4(vardid, varid_size, data_k4, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + REAL (kind = C_FLOAT) :: data_k4 + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_get_variable_data_k4 + + SUBROUTINE cxios_get_variable_data_int(vardid, varid_size, data_int, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + INTEGER (kind = C_INT) :: data_int + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_get_variable_data_int + + SUBROUTINE cxios_get_variable_data_logic(vardid, varid_size, data_logic, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + LOGICAL (kind = 4) :: data_logic + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_get_variable_data_logic + + SUBROUTINE cxios_get_variable_data_char(vardid, varid_size, data_char, data_size_in, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + INTEGER (kind = C_INT) , VALUE :: data_size_in + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: data_char + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_get_variable_data_char + + ! Binding C and Fortran interface of set_variable (icdata.cpp) + SUBROUTINE cxios_set_variable_data_k8(vardid, varid_size, data_k8, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + REAL (kind = C_DOUBLE), VALUE :: data_k8 + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_set_variable_data_k8 + + SUBROUTINE cxios_set_variable_data_k4(vardid, varid_size, data_k4, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + REAL (kind = C_FLOAT) , VALUE :: data_k4 + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_set_variable_data_k4 + + SUBROUTINE cxios_set_variable_data_int(vardid, varid_size, data_int, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + INTEGER (kind = C_INT) , VALUE :: data_int + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_set_variable_data_int + + SUBROUTINE cxios_set_variable_data_logic(vardid, varid_size, data_logic, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + LOGICAL (kind = 4) , VALUE :: data_logic + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_set_variable_data_logic + + SUBROUTINE cxios_set_variable_data_char(vardid, varid_size, data_char, data_size_in, is_var_existed) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: vardid + INTEGER (kind = C_INT) , VALUE :: varid_size + INTEGER (kind = C_INT) , VALUE :: data_size_in + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: data_char + LOGICAL (kind = C_BOOL) :: is_var_existed + END SUBROUTINE cxios_set_variable_data_char + + END INTERFACE + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(init_server)() + IMPLICIT NONE + CALL cxios_init_server() + END SUBROUTINE xios(init_server) + + SUBROUTINE xios(initialize)(client_id, local_comm, return_comm) + IMPLICIT NONE + INCLUDE 'mpif.h' + CHARACTER(LEN=*),INTENT(IN) :: client_id + INTEGER,INTENT(IN),OPTIONAL :: local_comm + INTEGER,INTENT(OUT),OPTIONAL :: return_comm + INTEGER :: f_local_comm + INTEGER :: f_return_comm + + IF (PRESENT(local_comm)) THEN + f_local_comm=local_comm + ELSE + f_local_comm = MPI_COMM_NULL + ENDIF + + CALL cxios_init_client(client_id,LEN(client_id),f_local_comm,f_return_comm) + + IF (PRESENT(return_comm)) return_comm=f_return_comm + + END SUBROUTINE xios(initialize) + + + SUBROUTINE xios(context_initialize)(context_id,comm) + IMPLICIT NONE + CHARACTER(LEN=*),INTENT(IN) :: context_id + INTEGER, INTENT(IN) :: comm + + CALL cxios_context_initialize(context_id,LEN(context_id),comm) + + END SUBROUTINE xios(context_initialize) + + + LOGICAL FUNCTION xios(context_is_initialized)(context_id) + USE ISO_C_BINDING + IMPLICIT NONE + CHARACTER(LEN=*),INTENT(IN) :: context_id + LOGICAL(KIND=C_BOOL) :: is_init + + CALL cxios_context_is_initialized(context_id, LEN(context_id), is_init) + xios(context_is_initialized) = is_init + + END FUNCTION xios(context_is_initialized) + + + SUBROUTINE xios(finalize) + IMPLICIT NONE + + CALL cxios_finalize + + END SUBROUTINE xios(finalize) + + + SUBROUTINE xios(close_context_definition)() + IMPLICIT NONE + CALL cxios_context_close_definition() + END SUBROUTINE xios(close_context_definition) + + + SUBROUTINE xios(context_finalize)() + IMPLICIT NONE + CALL cxios_context_finalize() + END SUBROUTINE xios(context_finalize) + + SUBROUTINE xios(solve_inheritance)() + IMPLICIT NONE + CALL cxios_solve_inheritance() + END SUBROUTINE xios(solve_inheritance) + + + SUBROUTINE xios(send_field_r8_1d)(fieldid, data1d_k8) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: fieldid + REAL (kind = 8), DIMENSION(*), INTENT(IN) :: data1d_k8(:) + CALL cxios_write_data_k81(fieldid, len(fieldid), data1d_k8, size(data1d_k8, 1)) + END SUBROUTINE xios(send_field_r8_1d) + + SUBROUTINE xios(send_field_r8_2d)(fieldid, data2d_k8) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: fieldid + REAL (kind = 8), DIMENSION(*), INTENT(IN) :: data2d_k8(:,:) + CALL cxios_write_data_k82(fieldid, len(fieldid), data2d_k8, size(data2d_k8, 1), size(data2d_k8, 2)) + END SUBROUTINE xios(send_field_r8_2d) + + SUBROUTINE xios(send_field_r8_3d)(fieldid, data3d_k8) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: fieldid + REAL (kind = 8), DIMENSION(*), INTENT(IN) :: data3d_k8(:,:,:) + CALL cxios_write_data_k83(fieldid, len(fieldid), data3d_k8, size(data3d_k8, 1), size(data3d_k8, 2), size(data3d_k8, 3)) + END SUBROUTINE xios(send_field_r8_3d) + + SUBROUTINE xios(send_field_r4_1d)(fieldid, data1d_k4) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: fieldid + REAL (kind = 4), DIMENSION(*), INTENT(IN) :: data1d_k4(:) + CALL cxios_write_data_k41(fieldid, len(fieldid), data1d_k4, size(data1d_k4, 1)) + END SUBROUTINE xios(send_field_r4_1d) + + SUBROUTINE xios(send_field_r4_2d)(fieldid, data2d_k4) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: fieldid + REAL (kind = 4), DIMENSION(*), INTENT(IN) :: data2d_k4(:,:) + CALL cxios_write_data_k42(fieldid, len(fieldid), data2d_k4, size(data2d_k4, 1), size(data2d_k4, 2)) + END SUBROUTINE xios(send_field_r4_2d) + + SUBROUTINE xios(send_field_r4_3d)(fieldid, data3d_k4) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: fieldid + REAL (kind = 4), DIMENSION(*), INTENT(IN) :: data3d_k4(:,:,:) + CALL cxios_write_data_k43(fieldid, len(fieldid), data3d_k4, size(data3d_k4, 1), size(data3d_k4, 2), size(data3d_k4, 3)) + END SUBROUTINE xios(send_field_r4_3d) + + ! Get variable functions + LOGICAL FUNCTION xios(getVar_k8)(varId, data_k8) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + REAL (kind = 8) , INTENT(OUT):: data_k8 + + CALL cxios_get_variable_data_k8(varId, len(varId), data_k8, val) + + xios(getVar_k8) = val + END FUNCTION xios(getVar_k8) + + LOGICAL FUNCTION xios(getVar_k4)(varId, data_k4) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + REAL (kind = 4) , INTENT(OUT):: data_k4 + + CALL cxios_get_variable_data_k4(varId, len(varId), data_k4, val) + + xios(getVar_k4) = val + END FUNCTION xios(getVar_k4) + + LOGICAL FUNCTION xios(getVar_int)(varId, data_int) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + INTEGER , INTENT(OUT):: data_int + + CALL cxios_get_variable_data_int(varId, len(varId), data_int, val) + + xios(getVar_int) = val + END FUNCTION xios(getVar_int) + + LOGICAL FUNCTION xios(getVar_logic)(varId, data_logic) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + LOGICAL (kind = 4) , INTENT(OUT):: data_logic + + CALL cxios_get_variable_data_logic(varId, len(varId), data_logic, val) + + xios(getVar_logic) = val + END FUNCTION xios(getVar_logic) + + LOGICAL FUNCTION xios(getVar_char)(varId, data_char) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + CHARACTER(len = *) , INTENT(OUT):: data_char + + CALL cxios_get_variable_data_char(varId, len(varId), data_char, len(data_char), val) + + xios(getVar_char) = val + END FUNCTION xios(getVar_char) + + ! Set variable functions + LOGICAL FUNCTION xios(setVar_k8)(varId, data_k8) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + REAL (kind = 8) , INTENT(IN) :: data_k8 + + CALL cxios_set_variable_data_k8(varId, len(varId), data_k8, val) + + xios(setVar_k8) = val + END FUNCTION xios(setVar_k8) + + LOGICAL FUNCTION xios(setVar_k4)(varId, data_k4) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + REAL (kind = 4) , INTENT(IN) :: data_k4 + + CALL cxios_set_variable_data_k4(varId, len(varId), data_k4, val) + + xios(setVar_k4) = val + END FUNCTION xios(setVar_k4) + + LOGICAL FUNCTION xios(setVar_int)(varId, data_int) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + INTEGER , INTENT(IN) :: data_int + + CALL cxios_set_variable_data_int(varId, len(varId), data_int, val) + + xios(setVar_int) = val + END FUNCTION xios(setVar_int) + + LOGICAL FUNCTION xios(setVar_logic)(varId, data_logic) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + LOGICAL (kind = 4) , INTENT(IN) :: data_logic + + CALL cxios_set_variable_data_logic(varId, len(varId), data_logic, val) + + xios(setVar_logic) = val + END FUNCTION xios(setVar_logic) + + LOGICAL FUNCTION xios(setVar_char)(varId, data_char) + IMPLICIT NONE + LOGICAL (kind = 1) :: val + CHARACTER(len = *) , INTENT(IN) :: varId + CHARACTER(len = *) , INTENT(IN) :: data_char + + CALL cxios_set_variable_data_char(varId, len(varId), data_char, len(data_char), val) + + xios(setVar_char) = val + END FUNCTION xios(setVar_char) + +END MODULE IDATA diff --git a/src/interface/fortran/idate.F90 b/src/interface/fortran/idate.F90 new file mode 100644 index 0000000..27d5dc7 --- /dev/null +++ b/src/interface/fortran/idate.F90 @@ -0,0 +1,58 @@ +#include "xios_fortran_prefix.hpp" +MODULE IDATE + USE, INTRINSIC :: ISO_C_BINDING + + ! enum XCalendarType + INTEGER(kind = C_INT), PARAMETER :: D360 = 0 , ALLLEAP = 1 , NOLEAP = 2 , JULIAN = 3 , GREGORIAN = 4 + + TYPE txios(date) + INTEGER :: year, month, day, hour, minute, second + END TYPE txios(date) + + TYPE txios(time) + REAL(kind = 8) :: year=0, month=0, day=0, hour=0, minute=0, second=0 + END TYPE txios(time) + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_set_timestep(ts_year, ts_month, ts_day, ts_hour, ts_minute, ts_second) BIND(C) + IMPORT C_DOUBLE + REAL (kind = C_DOUBLE), VALUE :: ts_year, ts_month , ts_day , & + ts_hour, ts_minute, ts_second + END SUBROUTINE cxios_set_timestep + + SUBROUTINE cxios_update_calendar(step) BIND(C) + IMPORT C_INT + INTEGER (kind = C_INT), VALUE :: step + END SUBROUTINE cxios_update_calendar + + END INTERFACE + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + + SUBROUTINE xios(set_timestep)(timestep) + IMPLICIT NONE + TYPE(txios(time)), INTENT(IN):: timestep + + CALL cxios_set_timestep(timestep%year, timestep%month , timestep%day, & + timestep%hour, timestep%minute, timestep%second) + + END SUBROUTINE xios(set_timestep) + + + + SUBROUTINE xios(update_calendar)(step) + IMPLICIT NONE + INTEGER, INTENT(IN):: step + + IF (step < 0) THEN + PRINT *, "L'argument 'step' ne peut être négatif" + STOP + END IF + CALL cxios_update_calendar(step) + + END SUBROUTINE xios(update_calendar) + + +END MODULE IDATE diff --git a/src/interface/fortran/idomain.F90 b/src/interface/fortran/idomain.F90 new file mode 100644 index 0000000..429f111 --- /dev/null +++ b/src/interface/fortran/idomain.F90 @@ -0,0 +1,55 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IDOMAIN + USE, INTRINSIC :: ISO_C_BINDING + USE DOMAIN_INTERFACE + USE DOMAINGROUP_INTERFACE +! USE IDOMAIN_ATTR +! USE IDOMAINGROUP_ATTR + + TYPE txios(domain) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(domain) + + TYPE txios(domaingroup) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(domaingroup) + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_domain_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(domain)), INTENT(OUT):: ret + + CALL cxios_domain_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_domain_handle) + + SUBROUTINE xios(get_domaingroup_handle)(idt, ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(domaingroup)), INTENT(OUT):: ret + + CALL cxios_domaingroup_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_domaingroup_handle) + + LOGICAL FUNCTION xios(is_valid_domain)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + CALL cxios_domain_valid_id(val, idt, len(idt)); + xios(is_valid_domain) = val + END FUNCTION xios(is_valid_domain) + + LOGICAL FUNCTION xios(is_valid_domaingroup)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + CALL cxios_domaingroup_valid_id(val, idt, len(idt)); + xios(is_valid_domaingroup) = val + END FUNCTION xios(is_valid_domaingroup) + +END MODULE IDOMAIN diff --git a/src/interface/fortran/ifield.F90 b/src/interface/fortran/ifield.F90 new file mode 100644 index 0000000..4a7f454 --- /dev/null +++ b/src/interface/fortran/ifield.F90 @@ -0,0 +1,79 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IFIELD + USE, INTRINSIC :: ISO_C_BINDING + USE FIELD_INTERFACE + USE FIELDGROUP_INTERFACE +! USE IFIELD_ATTR +! USE IFIELDGROUP_ATTR + + TYPE txios(field) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(field) + + TYPE txios(fieldgroup) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(fieldgroup) + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_field_handle)(idt, ret) + IMPLICIT NONE + CHARACTER(len = *), INTENT(IN) :: idt + TYPE(txios(field)), INTENT(OUT) :: ret + CALL cxios_field_handle_create(ret%daddr, idt, len(idt)) + END SUBROUTINE xios(get_field_handle) + + SUBROUTINE xios(get_fieldgroup_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(fieldgroup)), INTENT(OUT):: ret + + CALL cxios_fieldgroup_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_fieldgroup_handle) + + + LOGICAL FUNCTION xios(is_valid_field)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_field_valid_id(val, idt, len(idt)); + xios(is_valid_field) = val + + END FUNCTION xios(is_valid_field) + + LOGICAL FUNCTION xios(is_valid_fieldgroup)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + CALL cxios_fieldgroup_valid_id(val, idt, len(idt)); + xios(is_valid_fieldgroup) = val + + END FUNCTION xios(is_valid_fieldgroup) + + LOGICAL FUNCTION xios(field_is_active_id(field_id)) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: field_id + LOGICAL (kind = 1) :: val + TYPE(txios(field)) :: field_hdl + + CALL xios(get_field_handle)(field_id,field_hdl) + xios(field_is_active_id)=xios(field_is_active_hdl(field_hdl)) + + END FUNCTION xios(field_is_active_id) + + + LOGICAL FUNCTION xios(field_is_active_hdl(field_hdl)) + IMPLICIT NONE + TYPE(txios(field)),INTENT(IN) :: field_hdl + LOGICAL (kind = 1) :: ret + + CALL cxios_field_is_active(field_hdl%daddr, ret); + xios(field_is_active_hdl) = ret + + END FUNCTION xios(field_is_active_hdl) + + +END MODULE IFIELD diff --git a/src/interface/fortran/ifile.F90 b/src/interface/fortran/ifile.F90 new file mode 100644 index 0000000..727a82d --- /dev/null +++ b/src/interface/fortran/ifile.F90 @@ -0,0 +1,59 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IFILE + USE, INTRINSIC :: ISO_C_BINDING + USE FILE_INTERFACE + USE FILEGROUP_INTERFACE +! USE IFILE_ATTR +! USE IFILEGROUP_ATTR + + TYPE txios(file) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(file) + + TYPE txios(filegroup) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(filegroup) + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_file_handle)( idt, ret) + IMPLICIT NONE + CHARACTER(len = *), INTENT(IN) :: idt + TYPE(txios(file)) , INTENT(OUT):: ret + + CALL cxios_file_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_file_handle) + + SUBROUTINE xios(get_filegroup_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(filegroup)), INTENT(OUT):: ret + + CALL cxios_filegroup_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_filegroup_handle) + + LOGICAL FUNCTION xios(is_valid_file)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_file_valid_id(val, idt, len(idt)); + xios(is_valid_file) = val + + END FUNCTION xios(is_valid_file) + + LOGICAL FUNCTION xios(is_valid_filegroup)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_filegroup_valid_id(val, idt, len(idt)); + xios(is_valid_filegroup) = val + + END FUNCTION xios(is_valid_filegroup) + + +END MODULE IFILE diff --git a/src/interface/fortran/igrid.F90 b/src/interface/fortran/igrid.F90 new file mode 100644 index 0000000..a21970e --- /dev/null +++ b/src/interface/fortran/igrid.F90 @@ -0,0 +1,60 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IGRID + USE, INTRINSIC :: ISO_C_BINDING + USE GRID_INTERFACE + USE GRIDGROUP_INTERFACE +! USE IGRID_ATTR +! USE IGRIDGROUP_ATTR + + TYPE txios(grid) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(grid) + + TYPE txios(gridgroup) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(gridgroup) + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_grid_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *), INTENT(IN) :: idt + TYPE(txios(grid)), INTENT(OUT):: ret + + CALL cxios_grid_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_grid_handle) + + SUBROUTINE xios(get_gridgroup_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(gridgroup)) , INTENT(OUT):: ret + + CALL cxios_gridgroup_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_gridgroup_handle) + + LOGICAL FUNCTION xios(is_valid_grid)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_grid_valid_id(val, idt, len(idt)); + xios(is_valid_grid) = val + + END FUNCTION xios(is_valid_grid) + + LOGICAL FUNCTION xios(is_valid_gridgroup)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_gridgroup_valid_id(val, idt, len(idt)); + xios(is_valid_gridgroup) = val + + END FUNCTION xios(is_valid_gridgroup) + + +END MODULE IGRID diff --git a/src/interface/fortran/ivariable.F90 b/src/interface/fortran/ivariable.F90 new file mode 100644 index 0000000..bc529f3 --- /dev/null +++ b/src/interface/fortran/ivariable.F90 @@ -0,0 +1,56 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IVARIABLE + USE, INTRINSIC :: ISO_C_BINDING + USE VARIABLE_INTERFACE + USE VARIABLEGROUP_INTERFACE + + TYPE txios(variable) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(variable) + + TYPE txios(variablegroup) + INTEGER(kind = C_INTPTR_T) :: daddr + END TYPE txios(variablegroup) + + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + SUBROUTINE xios(get_variable_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *), INTENT(IN) :: idt + TYPE(txios(variable)) , INTENT(OUT):: ret + CALL cxios_variable_handle_create(ret%daddr, idt, len(idt)) + END SUBROUTINE xios(get_variable_handle) + + SUBROUTINE xios(get_variablegroup_handle)(idt,ret) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + TYPE(txios(variablegroup)), INTENT(OUT):: ret + + CALL cxios_variablegroup_handle_create(ret%daddr, idt, len(idt)) + + END SUBROUTINE xios(get_variablegroup_handle) + + LOGICAL FUNCTION xios(is_valid_variable)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_variable_valid_id(val, idt, len(idt)) + xios(is_valid_variable) = val + + END FUNCTION xios(is_valid_variable) + + LOGICAL FUNCTION xios(is_valid_variablegroup)(idt) + IMPLICIT NONE + CHARACTER(len = *) , INTENT(IN) :: idt + LOGICAL (kind = 1) :: val + + CALL cxios_variablegroup_valid_id(val, idt, len(idt)) + xios(is_valid_variablegroup) = val + + END FUNCTION xios(is_valid_variablegroup) + +END MODULE IVARIABLE diff --git a/src/interface/fortran/ixios.F90 b/src/interface/fortran/ixios.F90 new file mode 100644 index 0000000..ac5db20 --- /dev/null +++ b/src/interface/fortran/ixios.F90 @@ -0,0 +1,192 @@ +#include "xios_fortran_prefix.hpp" + +MODULE XIOS + + +USE icontext, ONLY : txios(context), xios(get_context_handle), xios(set_current_context), & + xios(is_valid_context) + +USE icontext_attr, ONLY : xios(set_context_attr), xios(set_context_attr_hdl), & + xios(get_context_attr), xios(get_context_attr_hdl), & + xios(is_defined_context_attr), xios(is_defined_context_attr_hdl) + +USE idata, ONLY : xios(initialize),xios(init_server), xios(finalize), xios(context_initialize), & + xios(context_is_initialized), xios(close_context_definition),xios(solve_inheritance), & + xios(context_finalize), xios(send_field_r8_1d), xios(send_field_r8_2d), & + xios(send_field_r8_3d), xios(send_field_r4_1d), xios(send_field_r4_2d), & + xios(send_field_r4_3d), xios(getVar_k8), xios(getVar_k4), xios(getVar_int), & + xios(getVar_logic), xios(getVar_char), xios(setVar_k8), xios(setVar_k4), xios(setVar_int), & + xios(setVar_logic), xios(setVar_char) + +USE idate, ONLY : txios(date),txios(time), xios(set_timestep),xios(update_calendar) + +USE idomain, ONLY : txios(domain), txios(domaingroup), xios(get_domain_handle), & + xios(get_domaingroup_handle),xios(is_valid_domain), & + xios(is_valid_domaingroup) + +USE idomain_attr, ONLY : xios(set_domain_attr), xios(set_domain_attr_hdl), & + xios(get_domain_attr), xios(get_domain_attr_hdl), & + xios(is_defined_domain_attr), xios(is_defined_domain_attr_hdl) + +USE idomaingroup_attr, ONLY : xios(set_domaingroup_attr), xios(set_domaingroup_attr_hdl), & + xios(get_domaingroup_attr), xios(get_domaingroup_attr_hdl), & + xios(is_defined_domaingroup_attr), xios(is_defined_domaingroup_attr_hdl) + +USE ifield, ONLY : txios(field), txios(fieldgroup), xios(get_field_handle), & + xios(get_fieldgroup_handle), xios(is_valid_field), & + xios(is_valid_fieldgroup),xios(field_is_active_id),xios(field_is_active_hdl) + +USE ifield_attr, ONLY : xios(set_field_attr),xios(set_field_attr_hdl), & + xios(get_field_attr),xios(get_field_attr_hdl), & + xios(is_defined_field_attr),xios(is_defined_field_attr_hdl) + +USE ifieldgroup_attr, ONLY : xios(set_fieldgroup_attr), xios(set_fieldgroup_attr_hdl), & + xios(get_fieldgroup_attr), xios(get_fieldgroup_attr_hdl), & + xios(is_defined_fieldgroup_attr), xios(is_defined_fieldgroup_attr_hdl) + +USE ivariable, ONLY : txios(variable), txios(variablegroup), xios(get_variable_handle), & + xios(get_variablegroup_handle), xios(is_valid_variable), & + xios(is_valid_variablegroup) + +USE ivariable_attr, ONLY : xios(set_variable_attr),xios(set_variable_attr_hdl), & + xios(get_variable_attr),xios(get_variable_attr_hdl), & + xios(is_defined_variable_attr),xios(is_defined_variable_attr_hdl) + +USE ivariablegroup_attr, ONLY : xios(set_variablegroup_attr), xios(set_variablegroup_attr_hdl), & + xios(get_variablegroup_attr), xios(get_variablegroup_attr_hdl), & + xios(is_defined_variablegroup_attr), xios(is_defined_variablegroup_attr_hdl) + +USE ifile, ONLY : txios(file), txios(filegroup), xios(get_file_handle), & + xios(get_filegroup_handle), xios(is_valid_file), xios(is_valid_filegroup) + +USE ifile_attr, ONLY : xios(set_file_attr),xios(set_file_attr_hdl), & + xios(get_file_attr),xios(get_file_attr_hdl), & + xios(is_defined_file_attr),xios(is_defined_file_attr_hdl) + +USE ifilegroup_attr, ONLY : xios(set_filegroup_attr), xios(set_filegroup_attr_hdl), & + xios(get_filegroup_attr), xios(get_filegroup_attr_hdl), & + xios(is_defined_filegroup_attr), xios(is_defined_filegroup_attr_hdl) + +USE igrid, ONLY : txios(grid), txios(gridgroup), xios(get_grid_handle), & + xios(get_gridgroup_handle), xios(is_valid_grid), xios(is_valid_gridgroup) + +USE igrid_attr, ONLY : xios(set_grid_attr_hdl), xios(set_grid_attr), & + xios(get_grid_attr_hdl), xios(get_grid_attr), & + xios(is_defined_grid_attr_hdl), xios(is_defined_grid_attr) + +USE igridgroup_attr, ONLY : xios(set_gridgroup_attr), xios(set_gridgroup_attr_hdl), & + xios(get_gridgroup_attr), xios(get_gridgroup_attr_hdl), & + xios(is_defined_gridgroup_attr), xios(is_defined_gridgroup_attr_hdl) + +USE iaxis, ONLY : txios(axis), txios(axisgroup), xios(get_axis_handle), & + xios(get_axisgroup_handle), xios(is_valid_axis), xios(is_valid_axisgroup) + +USE iaxis_attr, ONLY : xios(set_axis_attr), xios(set_axis_attr_hdl), & + xios(get_axis_attr), xios(get_axis_attr_hdl), & + xios(is_defined_axis_attr), xios(is_defined_axis_attr_hdl) + +USE iaxisgroup_attr, ONLY : xios(set_axisgroup_attr), xios(set_axisgroup_attr_hdl), & + xios(get_axisgroup_attr), xios(get_axisgroup_attr_hdl), & + xios(is_defined_axisgroup_attr), xios(is_defined_axisgroup_attr_hdl) + +USE ixml_tree, ONLY : xios(add_axis), xios(add_file), xios(add_grid), xios(add_field), xios(add_domain), & + xios(add_fieldtofile), xios(add_variabletofile), xios(add_variabletofield), & + xios(add_axisgroup), xios(add_filegroup), xios(add_gridgroup), xios(add_fieldgroup), & + xios(add_domaingroup), xios(add_fieldgrouptofile), xios(add_variablegrouptofile), & + xios(add_variablegrouptofield) + +PRIVATE + + +INTERFACE xios(set_attr) + MODULE PROCEDURE xios(set_domaingroup_attr_hdl), xios(set_domain_attr_hdl), xios(set_fieldgroup_attr_hdl), & + xios(set_field_attr_hdl),xios(set_variable_attr_hdl), xios(set_variablegroup_attr_hdl), & + xios(set_file_attr_hdl), xios(set_filegroup_attr_hdl), & + xios(set_grid_attr_hdl), xios(set_gridgroup_attr_hdl), xios(set_axis_attr_hdl) , & + xios(set_axisgroup_attr_hdl), xios(set_context_attr_hdl) +END INTERFACE xios(set_attr) + +INTERFACE xios(get_attr) + MODULE PROCEDURE xios(get_domaingroup_attr_hdl), xios(get_domain_attr_hdl), xios(get_fieldgroup_attr_hdl), & + xios(get_field_attr_hdl), xios(get_variable_attr_hdl), xios(get_variablegroup_attr_hdl), & + xios(get_file_attr_hdl), xios(get_filegroup_attr_hdl), & + xios(get_grid_attr_hdl), xios(get_gridgroup_attr_hdl), xios(get_axis_attr_hdl) , & + xios(get_axisgroup_attr_hdl), xios(get_context_attr_hdl) +END INTERFACE xios(get_attr) + +INTERFACE xios(is_defined_attr) + MODULE PROCEDURE xios(is_defined_domaingroup_attr_hdl), xios(is_defined_domain_attr_hdl), xios(is_defined_fieldgroup_attr_hdl), & + xios(is_defined_field_attr_hdl), xios(is_defined_variable_attr_hdl), xios(is_defined_variablegroup_attr_hdl), & + xios(is_defined_file_attr_hdl), xios(is_defined_filegroup_attr_hdl), & + xios(is_defined_grid_attr_hdl), xios(is_defined_gridgroup_attr_hdl), xios(is_defined_axis_attr_hdl) , & + xios(is_defined_axisgroup_attr_hdl), xios(is_defined_context_attr_hdl) +END INTERFACE xios(is_defined_attr) + +INTERFACE xios(get_handle) + MODULE PROCEDURE xios(get_context_handle), xios(get_domain_handle), xios(get_domaingroup_handle), & + xios(get_file_handle), xios(get_filegroup_handle), xios(get_grid_handle), & + xios(get_gridgroup_handle), xios(get_axis_handle), xios(get_axisgroup_handle), & + xios(get_field_handle), xios(get_fieldgroup_handle),xios(get_variable_handle), & + xios(get_variablegroup_handle) +END INTERFACE xios(get_handle) + +INTERFACE xios(add_child) + MODULE PROCEDURE xios(add_axis), xios(add_file), xios(add_grid), xios(add_field), xios(add_domain), & + xios(add_fieldtofile), xios(add_variabletofile), xios(add_variabletofield), xios(add_axisgroup), & + xios(add_filegroup), xios(add_gridgroup), xios(add_fieldgroup), xios(add_domaingroup), & + xios(add_fieldgrouptofile), xios(add_variablegrouptofile),xios(add_variablegrouptofield) +END INTERFACE xios(add_child) + + +INTERFACE xios(send_field) + MODULE PROCEDURE xios(send_field_r8_1d), xios(send_field_r8_2d), xios(send_field_r8_3d), & + xios(send_field_r4_1d), xios(send_field_r4_2d), xios(send_field_r4_3d) +END INTERFACE xios(send_field) + +INTERFACE xios(field_is_active) + MODULE PROCEDURE xios(field_is_active_id),xios(field_is_active_hdl) +END INTERFACE + +INTERFACE xios(getVar) + MODULE PROCEDURE xios(getVar_k8), xios(getVar_k4), xios(getVar_int), xios(getVar_logic), xios(getVar_char) +END INTERFACE xios(getVar) + +INTERFACE xios(setVar) + MODULE PROCEDURE xios(setVar_k8), xios(setVar_k4), xios(setVar_int), xios(setVar_logic), xios(setVar_char) +END INTERFACE xios(setVar) + + PUBLIC :: txios(domain), txios(domaingroup),txios(field), txios(fieldgroup),txios(file), txios(filegroup), & + txios(grid), txios(gridgroup), txios(axis), txios(axisgroup),txios(context), txios(date),txios(time) + + PUBLIC :: xios(set_attr), xios(set_domain_attr), xios(set_domaingroup_attr), xios(set_fieldgroup_attr), & + xios(set_field_attr), xios(set_file_attr), xios(set_filegroup_attr), & + xios(set_grid_attr), xios(set_gridgroup_attr), xios(set_axis_attr) , & + xios(set_axisgroup_attr), xios(set_context_attr) + + PUBLIC :: xios(get_attr), xios(get_domain_attr), xios(get_domaingroup_attr), xios(get_fieldgroup_attr), & + xios(get_field_attr), xios(get_file_attr), xios(get_filegroup_attr), & + xios(get_grid_attr), xios(get_gridgroup_attr), xios(get_axis_attr) , & + xios(get_axisgroup_attr), xios(get_context_attr) + +PUBLIC :: xios(is_defined_attr), xios(is_defined_domain_attr), xios(is_defined_domaingroup_attr), xios(is_defined_fieldgroup_attr), & + xios(is_defined_field_attr), xios(is_defined_file_attr), xios(is_defined_filegroup_attr), & + xios(is_defined_grid_attr), xios(is_defined_gridgroup_attr), xios(is_defined_axis_attr) , & + xios(is_defined_axisgroup_attr), xios(is_defined_context_attr) + + PUBLIC :: xios(get_handle) + PUBLIC :: xios(add_child) + + PUBLIC :: xios(is_valid_context),xios(is_valid_domain), xios(is_valid_domaingroup),xios(is_valid_field), & + xios(is_valid_fieldgroup), xios(is_valid_file), xios(is_valid_filegroup), xios(is_valid_grid), & + xios(is_valid_gridgroup), xios(is_valid_axis), xios(is_valid_axisgroup) + + PUBLIC :: xios(set_current_context) + PUBLIC :: xios(set_timestep),xios(update_calendar) + PUBLIC :: xios(initialize), xios(init_server), xios(finalize), xios(context_initialize),xios(context_is_initialized), & + xios(solve_inheritance), xios(close_context_definition), xios(context_finalize), xios(send_field), & + xios(field_is_active) + + PUBLIC :: xios(getVar) + PUBLIC :: xios(setVar) + +END MODULE XIOS diff --git a/src/interface/fortran/ixml_tree.F90 b/src/interface/fortran/ixml_tree.F90 new file mode 100644 index 0000000..93728a2 --- /dev/null +++ b/src/interface/fortran/ixml_tree.F90 @@ -0,0 +1,378 @@ +#include "xios_fortran_prefix.hpp" + +MODULE IXML_TREE + USE, INTRINSIC :: ISO_C_BINDING + USE IAXIS + USE IFILE + USE IFIELD + USE IGRID + USE IDOMAIN + USE IVARIABLE + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_xml_tree_add_field(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_field + + SUBROUTINE cxios_xml_tree_add_grid(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_grid + + SUBROUTINE cxios_xml_tree_add_file(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_file + + SUBROUTINE cxios_xml_tree_add_axis(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_axis + + SUBROUTINE cxios_xml_tree_add_domain(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_domain + + SUBROUTINE cxios_xml_tree_add_fieldtofile(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_fieldtofile + + SUBROUTINE cxios_xml_tree_add_variabletofile(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_variabletofile + + + SUBROUTINE cxios_xml_tree_add_variabletofield(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_variabletofield + + + SUBROUTINE cxios_xml_tree_add_fieldgroup(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_fieldgroup + + SUBROUTINE cxios_xml_tree_add_gridgroup(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_gridgroup + + SUBROUTINE cxios_xml_tree_add_filegroup(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_filegroup + + SUBROUTINE cxios_xml_tree_add_axisgroup(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_axisgroup + + SUBROUTINE cxios_xml_tree_add_domaingroup(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_domaingroup + + SUBROUTINE cxios_xml_tree_add_fieldgrouptofile(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_fieldgrouptofile + + SUBROUTINE cxios_xml_tree_add_variablegrouptofile(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_variablegrouptofile + + SUBROUTINE cxios_xml_tree_add_variablegrouptofield(parent_, child_, child_id, child_id_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: parent_ + INTEGER (kind = C_INTPTR_T) :: child_ + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: child_id + INTEGER (kind = C_INT) , VALUE :: child_id_size + END SUBROUTINE cxios_xml_tree_add_variablegrouptofield + + SUBROUTINE cxios_xml_tree_show(filename, filename_size) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR), DIMENSION(*) :: filename + INTEGER (kind = C_INT) , VALUE :: filename_size + END SUBROUTINE cxios_xml_tree_show + + SUBROUTINE cxios_xml_parse_file(filename, filename_size) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR), DIMENSION(*) :: filename + INTEGER (kind = C_INT) , VALUE :: filename_size + END SUBROUTINE cxios_xml_parse_file + + SUBROUTINE cxios_xml_parse_string(xmlcontent, xmlcontent_size) BIND(C) + USE ISO_C_BINDING + CHARACTER(kind = C_CHAR), DIMENSION(*) :: xmlcontent + INTEGER (kind = C_INT) , VALUE :: xmlcontent_size + END SUBROUTINE cxios_xml_parse_string + + END INTERFACE + + + CONTAINS ! Fonctions disponibles pour les utilisateurs. + + + SUBROUTINE xios(add_axis)(parent_hdl, child_hdl, child_id) + TYPE(txios(axisgroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(axis)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_axis(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_axis(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_axis) + + SUBROUTINE xios(add_file)(parent_hdl, child_hdl, child_id) + TYPE(txios(filegroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(file)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_file(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_file(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_file) + + SUBROUTINE xios(add_grid)(parent_hdl, child_hdl, child_id) + TYPE(txios(gridgroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(grid)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_grid(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_grid(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_grid) + + + SUBROUTINE xios(add_field)(parent_hdl, child_hdl, child_id) + TYPE(txios(fieldgroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(field)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_field(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_field(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_field) + + + SUBROUTINE xios(add_domain)(parent_hdl, child_hdl, child_id) + TYPE(txios(domaingroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(domain)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_domain(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_domain(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_domain) + + SUBROUTINE xios(add_fieldtofile)(parent_hdl, child_hdl, child_id) + TYPE(txios(file)) , INTENT(IN) :: parent_hdl + TYPE(txios(field)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_fieldtofile(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_fieldtofile(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_fieldtofile) + + SUBROUTINE xios(add_variabletofile)(parent_hdl, child_hdl, child_id) + TYPE(txios(file)) , INTENT(IN) :: parent_hdl + TYPE(txios(variable)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_variabletofile(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_variabletofile(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_variabletofile) + + SUBROUTINE xios(add_variabletofield)(parent_hdl, child_hdl, child_id) + TYPE(txios(field)) , INTENT(IN) :: parent_hdl + TYPE(txios(variable)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_variabletofield(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_variabletofield(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_variabletofield) + + + SUBROUTINE xios(add_axisgroup)(parent_hdl, child_hdl, child_id) + TYPE(txios(axisgroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(axisgroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_axisgroup(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_axisgroup(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_axisgroup) + + + SUBROUTINE xios(add_filegroup)(parent_hdl, child_hdl, child_id) + TYPE(txios(filegroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(filegroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_filegroup(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_filegroup(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_filegroup) + + SUBROUTINE xios(add_gridgroup)(parent_hdl, child_hdl, child_id) + TYPE(txios(gridgroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(gridgroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_gridgroup(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_gridgroup(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_gridgroup) + + + SUBROUTINE xios(add_fieldgroup)(parent_hdl, child_hdl, child_id) + TYPE(txios(fieldgroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(fieldgroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL, INTENT(IN) :: child_id + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_fieldgroup(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_fieldgroup(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + END SUBROUTINE xios(add_fieldgroup) + + SUBROUTINE xios(add_domaingroup)(parent_hdl, child_hdl, child_id) + TYPE(txios(domaingroup)) , INTENT(IN) :: parent_hdl + TYPE(txios(domaingroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_domaingroup(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_domaingroup(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_domaingroup) + + SUBROUTINE xios(add_fieldgrouptofile)(parent_hdl, child_hdl, child_id) + TYPE(txios(file)) , INTENT(IN) :: parent_hdl + TYPE(txios(fieldgroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_fieldgrouptofile(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_fieldgrouptofile(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_fieldgrouptofile) + + SUBROUTINE xios(add_variablegrouptofile)(parent_hdl, child_hdl, child_id) + TYPE(txios(file)) , INTENT(IN) :: parent_hdl + TYPE(txios(variablegroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_variablegrouptofile(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_variablegrouptofile(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_variablegrouptofile) + + SUBROUTINE xios(add_variablegrouptofield)(parent_hdl, child_hdl, child_id) + TYPE(txios(field)) , INTENT(IN) :: parent_hdl + TYPE(txios(variablegroup)) , INTENT(OUT):: child_hdl + CHARACTER(len = *), OPTIONAL , INTENT(IN) :: child_id + + IF (PRESENT(child_id)) THEN + CALL cxios_xml_tree_add_variablegrouptofield(parent_hdl%daddr, child_hdl%daddr, child_id, len(child_id)) + ELSE + CALL cxios_xml_tree_add_variablegrouptofield(parent_hdl%daddr, child_hdl%daddr, "NONE", -1) + END IF + + END SUBROUTINE xios(add_variablegrouptofield) + +END MODULE IXML_TREE diff --git a/src/interface/fortran/oasis_interface.F90 b/src/interface/fortran/oasis_interface.F90 new file mode 100644 index 0000000..313a973 --- /dev/null +++ b/src/interface/fortran/oasis_interface.F90 @@ -0,0 +1,141 @@ +SUBROUTINE fxios_oasis_init(server_id,str_len) BIND(C,NAME="fxios_oasis_init") + USE, INTRINSIC :: ISO_C_BINDING +#ifdef USE_OASIS + USE mod_prism_proto +#endif +#ifdef USE_OMCT + USE mod_prism +#endif + CHARACTER(kind = C_CHAR),DIMENSION(*) :: server_id + INTEGER(kind = C_INT),VALUE :: str_len + + INTEGER :: comp_id + CHARACTER(len=str_len) :: oasis_server_id + INTEGER :: ierr + INTEGER :: i + + DO i=1,str_len + oasis_server_id(i:i)=server_id(i) + ENDDO + +#if defined USE_OASIS || defined USE_OMCT + CALL prism_init_comp_proto (comp_id, oasis_server_id, ierr) +#endif + PRINT *,"---> prism_init",oasis_server_id,ierr + +END SUBROUTINE fxios_oasis_init + +SUBROUTINE fxios_oasis_enddef() BIND(C,NAME="fxios_oasis_enddef") + USE, INTRINSIC :: ISO_C_BINDING +#ifdef USE_OMCT + USE mod_prism +#endif + IMPLICIT NONE + INTEGER :: ierr +#ifdef USE_OMCT + CALL prism_enddef_proto(ierr) +#endif + +END SUBROUTINE fxios_oasis_enddef + +SUBROUTINE fxios_oasis_finalize() BIND(C,NAME="fxios_oasis_finalize") + USE, INTRINSIC :: ISO_C_BINDING +#ifdef USE_OASIS + USE mod_prism_proto +#endif +#ifdef USE_OMCT + USE mod_prism +#endif + IMPLICIT NONE + INTEGER :: ierr + +#if defined USE_OASIS || defined USE_OMCT + CALL prism_terminate_proto(ierr) +#endif + +END SUBROUTINE fxios_oasis_finalize + + +SUBROUTINE fxios_oasis_get_localcomm(f_comm) BIND(C,NAME="fxios_oasis_get_localcomm") + USE, INTRINSIC :: ISO_C_BINDING +#ifdef USE_OASIS + USE mod_prism_get_localcomm_proto +#endif +#ifdef USE_OMCT + USE mod_prism +#endif + IMPLICIT NONE + INTEGER(kind=C_INT) :: f_comm + + INTEGER :: comm + INTEGER :: ierr + +#if defined USE_OASIS || defined USE_OMCT + CALL prism_get_localcomm_proto(comm,ierr) +#endif + f_comm=comm + +END SUBROUTINE fxios_oasis_get_localcomm + + + + +SUBROUTINE fxios_oasis_get_intracomm(f_comm_client_server,client_id,str_len) BIND(C,NAME="fxios_oasis_get_intracomm") + USE, INTRINSIC :: ISO_C_BINDING +#ifdef USE_OASIS + USE mod_prism_get_comm +#endif +#ifdef USE_OMCT + USE mod_prism +#endif + IMPLICIT NONE + INTEGER(kind=C_INT) :: f_comm_client_server + CHARACTER,DIMENSION(*) :: client_id + INTEGER,VALUE :: str_len + + INTEGER :: comm_client_server + CHARACTER(len=str_len) :: oasis_client_id + INTEGER :: ierr + INTEGER :: i + + DO i=1,str_len + oasis_client_id(i:i)=client_id(i) + ENDDO + +#if defined USE_OASIS || defined USE_OMCT + CALL prism_get_intracomm(comm_client_server,oasis_client_id,ierr) +#endif + + f_comm_client_server=comm_client_server + +END SUBROUTINE fxios_oasis_get_intracomm + +SUBROUTINE fxios_oasis_get_intercomm(f_comm_client_server,client_id,str_len) BIND(C,NAME="fxios_oasis_get_intercomm") + USE, INTRINSIC :: ISO_C_BINDING +#ifdef USE_OASIS + USE mod_prism_get_comm +#endif +#ifdef USE_OMCT + USE mod_prism +#endif + IMPLICIT NONE + INTEGER(kind=C_INT) :: f_comm_client_server + CHARACTER,DIMENSION(*) :: client_id + INTEGER,VALUE :: str_len + + INTEGER :: comm_client_server + CHARACTER(len=str_len) :: oasis_client_id + INTEGER :: ierr + INTEGER :: i + + DO i=1,str_len + oasis_client_id(i:i)=client_id(i) + ENDDO + +#if defined USE_OASIS || defined USE_OMCT + CALL prism_get_intercomm(comm_client_server,oasis_client_id,ierr) +#endif + + f_comm_client_server=comm_client_server + +END SUBROUTINE fxios_oasis_get_intercomm diff --git a/src/interface/fortran/variable_interface.f90 b/src/interface/fortran/variable_interface.f90 new file mode 100644 index 0000000..531d3d8 --- /dev/null +++ b/src/interface/fortran/variable_interface.f90 @@ -0,0 +1,22 @@ +MODULE VARIABLE_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + SUBROUTINE cxios_variable_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_variable_handle_create + + SUBROUTINE cxios_variable_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_variable_valid_id + + END INTERFACE + +END MODULE VARIABLE_INTERFACE diff --git a/src/interface/fortran/variablegroup_interface.f90 b/src/interface/fortran/variablegroup_interface.f90 new file mode 100644 index 0000000..241d660 --- /dev/null +++ b/src/interface/fortran/variablegroup_interface.f90 @@ -0,0 +1,23 @@ +MODULE VARIABLEGROUP_INTERFACE + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Ne pas appeler directement/Interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_variablegroup_handle_create(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_variablegroup_handle_create + + SUBROUTINE cxios_variablegroup_valid_id(ret, idt, idt_size) BIND(C) + USE ISO_C_BINDING + LOGICAL (kind = C_BOOL) :: ret + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: idt + INTEGER (kind = C_INT) , VALUE :: idt_size + END SUBROUTINE cxios_variablegroup_valid_id + + END INTERFACE + +END MODULE VARIABLEGROUP_INTERFACE diff --git a/src/interface/fortran/xios_fortran_prefix.hpp b/src/interface/fortran/xios_fortran_prefix.hpp new file mode 100644 index 0000000..b8c75b4 --- /dev/null +++ b/src/interface/fortran/xios_fortran_prefix.hpp @@ -0,0 +1,7 @@ +#ifndef __XIOS_SUFFIX__ +#define __XIOS_SUFFIX__ + +#define xios(arg) xios_##arg +#define txios(arg) xios_##arg + +#endif diff --git a/src/interface/fortran_attr/axis_interface_attr.f90 b/src/interface/fortran_attr/axis_interface_attr.f90 new file mode 100644 index 0000000..c4b51ab --- /dev/null +++ b/src/interface/fortran_attr/axis_interface_attr.f90 @@ -0,0 +1,215 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE axis_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_axis_long_name(axis_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_set_axis_long_name + + SUBROUTINE cxios_get_axis_long_name(axis_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_get_axis_long_name + + FUNCTION cxios_is_defined_axis_long_name(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_long_name + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_long_name + + + SUBROUTINE cxios_set_axis_name(axis_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_axis_name + + SUBROUTINE cxios_get_axis_name(axis_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_axis_name + + FUNCTION cxios_is_defined_axis_name(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_name + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_name + + + SUBROUTINE cxios_set_axis_positive(axis_hdl, positive, positive_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: positive + INTEGER (kind = C_INT) , VALUE :: positive_size + END SUBROUTINE cxios_set_axis_positive + + SUBROUTINE cxios_get_axis_positive(axis_hdl, positive, positive_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: positive + INTEGER (kind = C_INT) , VALUE :: positive_size + END SUBROUTINE cxios_get_axis_positive + + FUNCTION cxios_is_defined_axis_positive(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_positive + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_positive + + + SUBROUTINE cxios_set_axis_size(axis_hdl, size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) , VALUE :: size + END SUBROUTINE cxios_set_axis_size + + SUBROUTINE cxios_get_axis_size(axis_hdl, size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) :: size + END SUBROUTINE cxios_get_axis_size + + FUNCTION cxios_is_defined_axis_size(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_size + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_size + + + SUBROUTINE cxios_set_axis_standard_name(axis_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_set_axis_standard_name + + SUBROUTINE cxios_get_axis_standard_name(axis_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_get_axis_standard_name + + FUNCTION cxios_is_defined_axis_standard_name(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_standard_name + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_standard_name + + + SUBROUTINE cxios_set_axis_unit(axis_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_set_axis_unit + + SUBROUTINE cxios_get_axis_unit(axis_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_get_axis_unit + + FUNCTION cxios_is_defined_axis_unit(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_unit + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_unit + + + SUBROUTINE cxios_set_axis_value(axis_hdl, value, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: value + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_axis_value + + SUBROUTINE cxios_get_axis_value(axis_hdl, value, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: value + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_axis_value + + FUNCTION cxios_is_defined_axis_value(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_value + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_value + + + SUBROUTINE cxios_set_axis_zoom_begin(axis_hdl, zoom_begin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_begin + END SUBROUTINE cxios_set_axis_zoom_begin + + SUBROUTINE cxios_get_axis_zoom_begin(axis_hdl, zoom_begin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) :: zoom_begin + END SUBROUTINE cxios_get_axis_zoom_begin + + FUNCTION cxios_is_defined_axis_zoom_begin(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_zoom_begin + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_zoom_begin + + + SUBROUTINE cxios_set_axis_zoom_end(axis_hdl, zoom_end) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_end + END SUBROUTINE cxios_set_axis_zoom_end + + SUBROUTINE cxios_get_axis_zoom_end(axis_hdl, zoom_end) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) :: zoom_end + END SUBROUTINE cxios_get_axis_zoom_end + + FUNCTION cxios_is_defined_axis_zoom_end(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_zoom_end + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_zoom_end + + + SUBROUTINE cxios_set_axis_zoom_size(axis_hdl, zoom_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_size + END SUBROUTINE cxios_set_axis_zoom_size + + SUBROUTINE cxios_get_axis_zoom_size(axis_hdl, zoom_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + INTEGER (KIND=C_INT) :: zoom_size + END SUBROUTINE cxios_get_axis_zoom_size + + FUNCTION cxios_is_defined_axis_zoom_size(axis_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_zoom_size + INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl + END FUNCTION cxios_is_defined_axis_zoom_size + + + END INTERFACE + +END MODULE axis_interface_attr diff --git a/src/interface/fortran_attr/axisgroup_interface_attr.f90 b/src/interface/fortran_attr/axisgroup_interface_attr.f90 new file mode 100644 index 0000000..e2c4468 --- /dev/null +++ b/src/interface/fortran_attr/axisgroup_interface_attr.f90 @@ -0,0 +1,236 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE axisgroup_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_axisgroup_group_ref(axisgroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_set_axisgroup_group_ref + + SUBROUTINE cxios_get_axisgroup_group_ref(axisgroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_get_axisgroup_group_ref + + FUNCTION cxios_is_defined_axisgroup_group_ref(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_group_ref + + + SUBROUTINE cxios_set_axisgroup_long_name(axisgroup_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_set_axisgroup_long_name + + SUBROUTINE cxios_get_axisgroup_long_name(axisgroup_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_get_axisgroup_long_name + + FUNCTION cxios_is_defined_axisgroup_long_name(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_long_name + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_long_name + + + SUBROUTINE cxios_set_axisgroup_name(axisgroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_axisgroup_name + + SUBROUTINE cxios_get_axisgroup_name(axisgroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_axisgroup_name + + FUNCTION cxios_is_defined_axisgroup_name(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_name + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_name + + + SUBROUTINE cxios_set_axisgroup_positive(axisgroup_hdl, positive, positive_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: positive + INTEGER (kind = C_INT) , VALUE :: positive_size + END SUBROUTINE cxios_set_axisgroup_positive + + SUBROUTINE cxios_get_axisgroup_positive(axisgroup_hdl, positive, positive_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: positive + INTEGER (kind = C_INT) , VALUE :: positive_size + END SUBROUTINE cxios_get_axisgroup_positive + + FUNCTION cxios_is_defined_axisgroup_positive(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_positive + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_positive + + + SUBROUTINE cxios_set_axisgroup_size(axisgroup_hdl, size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) , VALUE :: size + END SUBROUTINE cxios_set_axisgroup_size + + SUBROUTINE cxios_get_axisgroup_size(axisgroup_hdl, size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) :: size + END SUBROUTINE cxios_get_axisgroup_size + + FUNCTION cxios_is_defined_axisgroup_size(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_size + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_size + + + SUBROUTINE cxios_set_axisgroup_standard_name(axisgroup_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_set_axisgroup_standard_name + + SUBROUTINE cxios_get_axisgroup_standard_name(axisgroup_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_get_axisgroup_standard_name + + FUNCTION cxios_is_defined_axisgroup_standard_name(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_standard_name + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_standard_name + + + SUBROUTINE cxios_set_axisgroup_unit(axisgroup_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_set_axisgroup_unit + + SUBROUTINE cxios_get_axisgroup_unit(axisgroup_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_get_axisgroup_unit + + FUNCTION cxios_is_defined_axisgroup_unit(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_unit + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_unit + + + SUBROUTINE cxios_set_axisgroup_value(axisgroup_hdl, value, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: value + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_axisgroup_value + + SUBROUTINE cxios_get_axisgroup_value(axisgroup_hdl, value, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: value + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_axisgroup_value + + FUNCTION cxios_is_defined_axisgroup_value(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_value + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_value + + + SUBROUTINE cxios_set_axisgroup_zoom_begin(axisgroup_hdl, zoom_begin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_begin + END SUBROUTINE cxios_set_axisgroup_zoom_begin + + SUBROUTINE cxios_get_axisgroup_zoom_begin(axisgroup_hdl, zoom_begin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) :: zoom_begin + END SUBROUTINE cxios_get_axisgroup_zoom_begin + + FUNCTION cxios_is_defined_axisgroup_zoom_begin(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_zoom_begin + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_zoom_begin + + + SUBROUTINE cxios_set_axisgroup_zoom_end(axisgroup_hdl, zoom_end) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_end + END SUBROUTINE cxios_set_axisgroup_zoom_end + + SUBROUTINE cxios_get_axisgroup_zoom_end(axisgroup_hdl, zoom_end) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) :: zoom_end + END SUBROUTINE cxios_get_axisgroup_zoom_end + + FUNCTION cxios_is_defined_axisgroup_zoom_end(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_zoom_end + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_zoom_end + + + SUBROUTINE cxios_set_axisgroup_zoom_size(axisgroup_hdl, zoom_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_size + END SUBROUTINE cxios_set_axisgroup_zoom_size + + SUBROUTINE cxios_get_axisgroup_zoom_size(axisgroup_hdl, zoom_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + INTEGER (KIND=C_INT) :: zoom_size + END SUBROUTINE cxios_get_axisgroup_zoom_size + + FUNCTION cxios_is_defined_axisgroup_zoom_size(axisgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_zoom_size + INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl + END FUNCTION cxios_is_defined_axisgroup_zoom_size + + + END INTERFACE + +END MODULE axisgroup_interface_attr diff --git a/src/interface/fortran_attr/context_interface_attr.f90 b/src/interface/fortran_attr/context_interface_attr.f90 new file mode 100644 index 0000000..5a0c585 --- /dev/null +++ b/src/interface/fortran_attr/context_interface_attr.f90 @@ -0,0 +1,118 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE context_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_context_calendar_type(context_hdl, calendar_type, calendar_type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: calendar_type + INTEGER (kind = C_INT) , VALUE :: calendar_type_size + END SUBROUTINE cxios_set_context_calendar_type + + SUBROUTINE cxios_get_context_calendar_type(context_hdl, calendar_type, calendar_type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: calendar_type + INTEGER (kind = C_INT) , VALUE :: calendar_type_size + END SUBROUTINE cxios_get_context_calendar_type + + FUNCTION cxios_is_defined_context_calendar_type(context_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_context_calendar_type + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + END FUNCTION cxios_is_defined_context_calendar_type + + + SUBROUTINE cxios_set_context_output_dir(context_hdl, output_dir, output_dir_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: output_dir + INTEGER (kind = C_INT) , VALUE :: output_dir_size + END SUBROUTINE cxios_set_context_output_dir + + SUBROUTINE cxios_get_context_output_dir(context_hdl, output_dir, output_dir_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: output_dir + INTEGER (kind = C_INT) , VALUE :: output_dir_size + END SUBROUTINE cxios_get_context_output_dir + + FUNCTION cxios_is_defined_context_output_dir(context_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_context_output_dir + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + END FUNCTION cxios_is_defined_context_output_dir + + + SUBROUTINE cxios_set_context_start_date(context_hdl, start_date, start_date_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: start_date + INTEGER (kind = C_INT) , VALUE :: start_date_size + END SUBROUTINE cxios_set_context_start_date + + SUBROUTINE cxios_get_context_start_date(context_hdl, start_date, start_date_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: start_date + INTEGER (kind = C_INT) , VALUE :: start_date_size + END SUBROUTINE cxios_get_context_start_date + + FUNCTION cxios_is_defined_context_start_date(context_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_context_start_date + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + END FUNCTION cxios_is_defined_context_start_date + + + SUBROUTINE cxios_set_context_time_origin(context_hdl, time_origin, time_origin_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: time_origin + INTEGER (kind = C_INT) , VALUE :: time_origin_size + END SUBROUTINE cxios_set_context_time_origin + + SUBROUTINE cxios_get_context_time_origin(context_hdl, time_origin, time_origin_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: time_origin + INTEGER (kind = C_INT) , VALUE :: time_origin_size + END SUBROUTINE cxios_get_context_time_origin + + FUNCTION cxios_is_defined_context_time_origin(context_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_context_time_origin + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + END FUNCTION cxios_is_defined_context_time_origin + + + SUBROUTINE cxios_set_context_timestep(context_hdl, timestep, timestep_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: timestep + INTEGER (kind = C_INT) , VALUE :: timestep_size + END SUBROUTINE cxios_set_context_timestep + + SUBROUTINE cxios_get_context_timestep(context_hdl, timestep, timestep_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: timestep + INTEGER (kind = C_INT) , VALUE :: timestep_size + END SUBROUTINE cxios_get_context_timestep + + FUNCTION cxios_is_defined_context_timestep(context_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_context_timestep + INTEGER (kind = C_INTPTR_T), VALUE :: context_hdl + END FUNCTION cxios_is_defined_context_timestep + + + END INTERFACE + +END MODULE context_interface_attr diff --git a/src/interface/fortran_attr/domain_interface_attr.f90 b/src/interface/fortran_attr/domain_interface_attr.f90 new file mode 100644 index 0000000..f11f533 --- /dev/null +++ b/src/interface/fortran_attr/domain_interface_attr.f90 @@ -0,0 +1,754 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE domain_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_domain_bounds_lat(domain_hdl, bounds_lat, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lat + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domain_bounds_lat + + SUBROUTINE cxios_get_domain_bounds_lat(domain_hdl, bounds_lat, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lat + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domain_bounds_lat + + FUNCTION cxios_is_defined_domain_bounds_lat(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_bounds_lat + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_bounds_lat + + + SUBROUTINE cxios_set_domain_bounds_lon(domain_hdl, bounds_lon, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lon + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domain_bounds_lon + + SUBROUTINE cxios_get_domain_bounds_lon(domain_hdl, bounds_lon, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lon + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domain_bounds_lon + + FUNCTION cxios_is_defined_domain_bounds_lon(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_bounds_lon + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_bounds_lon + + + SUBROUTINE cxios_set_domain_data_dim(domain_hdl, data_dim) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: data_dim + END SUBROUTINE cxios_set_domain_data_dim + + SUBROUTINE cxios_get_domain_data_dim(domain_hdl, data_dim) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: data_dim + END SUBROUTINE cxios_get_domain_data_dim + + FUNCTION cxios_is_defined_domain_data_dim(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_dim + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_dim + + + SUBROUTINE cxios_set_domain_data_i_index(domain_hdl, data_i_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_i_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domain_data_i_index + + SUBROUTINE cxios_get_domain_data_i_index(domain_hdl, data_i_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_i_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domain_data_i_index + + FUNCTION cxios_is_defined_domain_data_i_index(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_i_index + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_i_index + + + SUBROUTINE cxios_set_domain_data_ibegin(domain_hdl, data_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: data_ibegin + END SUBROUTINE cxios_set_domain_data_ibegin + + SUBROUTINE cxios_get_domain_data_ibegin(domain_hdl, data_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: data_ibegin + END SUBROUTINE cxios_get_domain_data_ibegin + + FUNCTION cxios_is_defined_domain_data_ibegin(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_ibegin + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_ibegin + + + SUBROUTINE cxios_set_domain_data_j_index(domain_hdl, data_j_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_j_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domain_data_j_index + + SUBROUTINE cxios_get_domain_data_j_index(domain_hdl, data_j_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_j_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domain_data_j_index + + FUNCTION cxios_is_defined_domain_data_j_index(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_j_index + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_j_index + + + SUBROUTINE cxios_set_domain_data_jbegin(domain_hdl, data_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: data_jbegin + END SUBROUTINE cxios_set_domain_data_jbegin + + SUBROUTINE cxios_get_domain_data_jbegin(domain_hdl, data_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: data_jbegin + END SUBROUTINE cxios_get_domain_data_jbegin + + FUNCTION cxios_is_defined_domain_data_jbegin(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_jbegin + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_jbegin + + + SUBROUTINE cxios_set_domain_data_n_index(domain_hdl, data_n_index) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: data_n_index + END SUBROUTINE cxios_set_domain_data_n_index + + SUBROUTINE cxios_get_domain_data_n_index(domain_hdl, data_n_index) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: data_n_index + END SUBROUTINE cxios_get_domain_data_n_index + + FUNCTION cxios_is_defined_domain_data_n_index(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_n_index + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_n_index + + + SUBROUTINE cxios_set_domain_data_ni(domain_hdl, data_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: data_ni + END SUBROUTINE cxios_set_domain_data_ni + + SUBROUTINE cxios_get_domain_data_ni(domain_hdl, data_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: data_ni + END SUBROUTINE cxios_get_domain_data_ni + + FUNCTION cxios_is_defined_domain_data_ni(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_ni + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_ni + + + SUBROUTINE cxios_set_domain_data_nj(domain_hdl, data_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: data_nj + END SUBROUTINE cxios_set_domain_data_nj + + SUBROUTINE cxios_get_domain_data_nj(domain_hdl, data_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: data_nj + END SUBROUTINE cxios_get_domain_data_nj + + FUNCTION cxios_is_defined_domain_data_nj(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_data_nj + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_data_nj + + + SUBROUTINE cxios_set_domain_domain_group_ref(domain_hdl, domain_group_ref, domain_group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_group_ref + INTEGER (kind = C_INT) , VALUE :: domain_group_ref_size + END SUBROUTINE cxios_set_domain_domain_group_ref + + SUBROUTINE cxios_get_domain_domain_group_ref(domain_hdl, domain_group_ref, domain_group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_group_ref + INTEGER (kind = C_INT) , VALUE :: domain_group_ref_size + END SUBROUTINE cxios_get_domain_domain_group_ref + + FUNCTION cxios_is_defined_domain_domain_group_ref(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_domain_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_domain_group_ref + + + SUBROUTINE cxios_set_domain_i_index(domain_hdl, i_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: i_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domain_i_index + + SUBROUTINE cxios_get_domain_i_index(domain_hdl, i_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: i_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domain_i_index + + FUNCTION cxios_is_defined_domain_i_index(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_i_index + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_i_index + + + SUBROUTINE cxios_set_domain_ibegin(domain_hdl, ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: ibegin + END SUBROUTINE cxios_set_domain_ibegin + + SUBROUTINE cxios_get_domain_ibegin(domain_hdl, ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: ibegin + END SUBROUTINE cxios_get_domain_ibegin + + FUNCTION cxios_is_defined_domain_ibegin(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_ibegin + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_ibegin + + + SUBROUTINE cxios_set_domain_iend(domain_hdl, iend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: iend + END SUBROUTINE cxios_set_domain_iend + + SUBROUTINE cxios_get_domain_iend(domain_hdl, iend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: iend + END SUBROUTINE cxios_get_domain_iend + + FUNCTION cxios_is_defined_domain_iend(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_iend + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_iend + + + SUBROUTINE cxios_set_domain_j_index(domain_hdl, j_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: j_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domain_j_index + + SUBROUTINE cxios_get_domain_j_index(domain_hdl, j_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: j_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domain_j_index + + FUNCTION cxios_is_defined_domain_j_index(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_j_index + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_j_index + + + SUBROUTINE cxios_set_domain_jbegin(domain_hdl, jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: jbegin + END SUBROUTINE cxios_set_domain_jbegin + + SUBROUTINE cxios_get_domain_jbegin(domain_hdl, jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: jbegin + END SUBROUTINE cxios_get_domain_jbegin + + FUNCTION cxios_is_defined_domain_jbegin(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_jbegin + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_jbegin + + + SUBROUTINE cxios_set_domain_jend(domain_hdl, jend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: jend + END SUBROUTINE cxios_set_domain_jend + + SUBROUTINE cxios_get_domain_jend(domain_hdl, jend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: jend + END SUBROUTINE cxios_get_domain_jend + + FUNCTION cxios_is_defined_domain_jend(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_jend + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_jend + + + SUBROUTINE cxios_set_domain_latvalue(domain_hdl, latvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: latvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domain_latvalue + + SUBROUTINE cxios_get_domain_latvalue(domain_hdl, latvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: latvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domain_latvalue + + FUNCTION cxios_is_defined_domain_latvalue(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_latvalue + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_latvalue + + + SUBROUTINE cxios_set_domain_long_name(domain_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_set_domain_long_name + + SUBROUTINE cxios_get_domain_long_name(domain_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_get_domain_long_name + + FUNCTION cxios_is_defined_domain_long_name(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_long_name + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_long_name + + + SUBROUTINE cxios_set_domain_lonvalue(domain_hdl, lonvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: lonvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domain_lonvalue + + SUBROUTINE cxios_get_domain_lonvalue(domain_hdl, lonvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: lonvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domain_lonvalue + + FUNCTION cxios_is_defined_domain_lonvalue(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_lonvalue + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_lonvalue + + + SUBROUTINE cxios_set_domain_mask(domain_hdl, mask, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domain_mask + + SUBROUTINE cxios_get_domain_mask(domain_hdl, mask, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domain_mask + + FUNCTION cxios_is_defined_domain_mask(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_mask + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_mask + + + SUBROUTINE cxios_set_domain_name(domain_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_domain_name + + SUBROUTINE cxios_get_domain_name(domain_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_domain_name + + FUNCTION cxios_is_defined_domain_name(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_name + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_name + + + SUBROUTINE cxios_set_domain_ni(domain_hdl, ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: ni + END SUBROUTINE cxios_set_domain_ni + + SUBROUTINE cxios_get_domain_ni(domain_hdl, ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: ni + END SUBROUTINE cxios_get_domain_ni + + FUNCTION cxios_is_defined_domain_ni(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_ni + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_ni + + + SUBROUTINE cxios_set_domain_ni_glo(domain_hdl, ni_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: ni_glo + END SUBROUTINE cxios_set_domain_ni_glo + + SUBROUTINE cxios_get_domain_ni_glo(domain_hdl, ni_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: ni_glo + END SUBROUTINE cxios_get_domain_ni_glo + + FUNCTION cxios_is_defined_domain_ni_glo(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_ni_glo + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_ni_glo + + + SUBROUTINE cxios_set_domain_nj(domain_hdl, nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: nj + END SUBROUTINE cxios_set_domain_nj + + SUBROUTINE cxios_get_domain_nj(domain_hdl, nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: nj + END SUBROUTINE cxios_get_domain_nj + + FUNCTION cxios_is_defined_domain_nj(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_nj + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_nj + + + SUBROUTINE cxios_set_domain_nj_glo(domain_hdl, nj_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: nj_glo + END SUBROUTINE cxios_set_domain_nj_glo + + SUBROUTINE cxios_get_domain_nj_glo(domain_hdl, nj_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: nj_glo + END SUBROUTINE cxios_get_domain_nj_glo + + FUNCTION cxios_is_defined_domain_nj_glo(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_nj_glo + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_nj_glo + + + SUBROUTINE cxios_set_domain_nvertex(domain_hdl, nvertex) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: nvertex + END SUBROUTINE cxios_set_domain_nvertex + + SUBROUTINE cxios_get_domain_nvertex(domain_hdl, nvertex) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: nvertex + END SUBROUTINE cxios_get_domain_nvertex + + FUNCTION cxios_is_defined_domain_nvertex(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_nvertex + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_nvertex + + + SUBROUTINE cxios_set_domain_standard_name(domain_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_set_domain_standard_name + + SUBROUTINE cxios_get_domain_standard_name(domain_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_get_domain_standard_name + + FUNCTION cxios_is_defined_domain_standard_name(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_standard_name + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_standard_name + + + SUBROUTINE cxios_set_domain_type(domain_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_set_domain_type + + SUBROUTINE cxios_get_domain_type(domain_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_get_domain_type + + FUNCTION cxios_is_defined_domain_type(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_type + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_type + + + SUBROUTINE cxios_set_domain_zoom_ibegin(domain_hdl, zoom_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ibegin + END SUBROUTINE cxios_set_domain_zoom_ibegin + + SUBROUTINE cxios_get_domain_zoom_ibegin(domain_hdl, zoom_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_ibegin + END SUBROUTINE cxios_get_domain_zoom_ibegin + + FUNCTION cxios_is_defined_domain_zoom_ibegin(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_ibegin + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_ibegin + + + SUBROUTINE cxios_set_domain_zoom_ibegin_loc(domain_hdl, zoom_ibegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ibegin_loc + END SUBROUTINE cxios_set_domain_zoom_ibegin_loc + + SUBROUTINE cxios_get_domain_zoom_ibegin_loc(domain_hdl, zoom_ibegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_ibegin_loc + END SUBROUTINE cxios_get_domain_zoom_ibegin_loc + + FUNCTION cxios_is_defined_domain_zoom_ibegin_loc(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_ibegin_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_ibegin_loc + + + SUBROUTINE cxios_set_domain_zoom_jbegin(domain_hdl, zoom_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_jbegin + END SUBROUTINE cxios_set_domain_zoom_jbegin + + SUBROUTINE cxios_get_domain_zoom_jbegin(domain_hdl, zoom_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_jbegin + END SUBROUTINE cxios_get_domain_zoom_jbegin + + FUNCTION cxios_is_defined_domain_zoom_jbegin(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_jbegin + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_jbegin + + + SUBROUTINE cxios_set_domain_zoom_jbegin_loc(domain_hdl, zoom_jbegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_jbegin_loc + END SUBROUTINE cxios_set_domain_zoom_jbegin_loc + + SUBROUTINE cxios_get_domain_zoom_jbegin_loc(domain_hdl, zoom_jbegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_jbegin_loc + END SUBROUTINE cxios_get_domain_zoom_jbegin_loc + + FUNCTION cxios_is_defined_domain_zoom_jbegin_loc(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_jbegin_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_jbegin_loc + + + SUBROUTINE cxios_set_domain_zoom_ni(domain_hdl, zoom_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ni + END SUBROUTINE cxios_set_domain_zoom_ni + + SUBROUTINE cxios_get_domain_zoom_ni(domain_hdl, zoom_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_ni + END SUBROUTINE cxios_get_domain_zoom_ni + + FUNCTION cxios_is_defined_domain_zoom_ni(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_ni + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_ni + + + SUBROUTINE cxios_set_domain_zoom_ni_loc(domain_hdl, zoom_ni_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ni_loc + END SUBROUTINE cxios_set_domain_zoom_ni_loc + + SUBROUTINE cxios_get_domain_zoom_ni_loc(domain_hdl, zoom_ni_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_ni_loc + END SUBROUTINE cxios_get_domain_zoom_ni_loc + + FUNCTION cxios_is_defined_domain_zoom_ni_loc(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_ni_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_ni_loc + + + SUBROUTINE cxios_set_domain_zoom_nj(domain_hdl, zoom_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_nj + END SUBROUTINE cxios_set_domain_zoom_nj + + SUBROUTINE cxios_get_domain_zoom_nj(domain_hdl, zoom_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_nj + END SUBROUTINE cxios_get_domain_zoom_nj + + FUNCTION cxios_is_defined_domain_zoom_nj(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_nj + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_nj + + + SUBROUTINE cxios_set_domain_zoom_nj_loc(domain_hdl, zoom_nj_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_nj_loc + END SUBROUTINE cxios_set_domain_zoom_nj_loc + + SUBROUTINE cxios_get_domain_zoom_nj_loc(domain_hdl, zoom_nj_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + INTEGER (KIND=C_INT) :: zoom_nj_loc + END SUBROUTINE cxios_get_domain_zoom_nj_loc + + FUNCTION cxios_is_defined_domain_zoom_nj_loc(domain_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_zoom_nj_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl + END FUNCTION cxios_is_defined_domain_zoom_nj_loc + + + END INTERFACE + +END MODULE domain_interface_attr diff --git a/src/interface/fortran_attr/domaingroup_interface_attr.f90 b/src/interface/fortran_attr/domaingroup_interface_attr.f90 new file mode 100644 index 0000000..dc292c6 --- /dev/null +++ b/src/interface/fortran_attr/domaingroup_interface_attr.f90 @@ -0,0 +1,775 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE domaingroup_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_domaingroup_bounds_lat(domaingroup_hdl, bounds_lat, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lat + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domaingroup_bounds_lat + + SUBROUTINE cxios_get_domaingroup_bounds_lat(domaingroup_hdl, bounds_lat, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lat + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domaingroup_bounds_lat + + FUNCTION cxios_is_defined_domaingroup_bounds_lat(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_bounds_lat + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_bounds_lat + + + SUBROUTINE cxios_set_domaingroup_bounds_lon(domaingroup_hdl, bounds_lon, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lon + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domaingroup_bounds_lon + + SUBROUTINE cxios_get_domaingroup_bounds_lon(domaingroup_hdl, bounds_lon, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: bounds_lon + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domaingroup_bounds_lon + + FUNCTION cxios_is_defined_domaingroup_bounds_lon(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_bounds_lon + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_bounds_lon + + + SUBROUTINE cxios_set_domaingroup_data_dim(domaingroup_hdl, data_dim) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: data_dim + END SUBROUTINE cxios_set_domaingroup_data_dim + + SUBROUTINE cxios_get_domaingroup_data_dim(domaingroup_hdl, data_dim) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: data_dim + END SUBROUTINE cxios_get_domaingroup_data_dim + + FUNCTION cxios_is_defined_domaingroup_data_dim(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_dim + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_dim + + + SUBROUTINE cxios_set_domaingroup_data_i_index(domaingroup_hdl, data_i_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_i_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domaingroup_data_i_index + + SUBROUTINE cxios_get_domaingroup_data_i_index(domaingroup_hdl, data_i_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_i_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domaingroup_data_i_index + + FUNCTION cxios_is_defined_domaingroup_data_i_index(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_i_index + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_i_index + + + SUBROUTINE cxios_set_domaingroup_data_ibegin(domaingroup_hdl, data_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: data_ibegin + END SUBROUTINE cxios_set_domaingroup_data_ibegin + + SUBROUTINE cxios_get_domaingroup_data_ibegin(domaingroup_hdl, data_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: data_ibegin + END SUBROUTINE cxios_get_domaingroup_data_ibegin + + FUNCTION cxios_is_defined_domaingroup_data_ibegin(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_ibegin + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_ibegin + + + SUBROUTINE cxios_set_domaingroup_data_j_index(domaingroup_hdl, data_j_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_j_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domaingroup_data_j_index + + SUBROUTINE cxios_get_domaingroup_data_j_index(domaingroup_hdl, data_j_index, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: data_j_index + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domaingroup_data_j_index + + FUNCTION cxios_is_defined_domaingroup_data_j_index(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_j_index + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_j_index + + + SUBROUTINE cxios_set_domaingroup_data_jbegin(domaingroup_hdl, data_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: data_jbegin + END SUBROUTINE cxios_set_domaingroup_data_jbegin + + SUBROUTINE cxios_get_domaingroup_data_jbegin(domaingroup_hdl, data_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: data_jbegin + END SUBROUTINE cxios_get_domaingroup_data_jbegin + + FUNCTION cxios_is_defined_domaingroup_data_jbegin(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_jbegin + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_jbegin + + + SUBROUTINE cxios_set_domaingroup_data_n_index(domaingroup_hdl, data_n_index) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: data_n_index + END SUBROUTINE cxios_set_domaingroup_data_n_index + + SUBROUTINE cxios_get_domaingroup_data_n_index(domaingroup_hdl, data_n_index) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: data_n_index + END SUBROUTINE cxios_get_domaingroup_data_n_index + + FUNCTION cxios_is_defined_domaingroup_data_n_index(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_n_index + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_n_index + + + SUBROUTINE cxios_set_domaingroup_data_ni(domaingroup_hdl, data_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: data_ni + END SUBROUTINE cxios_set_domaingroup_data_ni + + SUBROUTINE cxios_get_domaingroup_data_ni(domaingroup_hdl, data_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: data_ni + END SUBROUTINE cxios_get_domaingroup_data_ni + + FUNCTION cxios_is_defined_domaingroup_data_ni(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_ni + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_ni + + + SUBROUTINE cxios_set_domaingroup_data_nj(domaingroup_hdl, data_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: data_nj + END SUBROUTINE cxios_set_domaingroup_data_nj + + SUBROUTINE cxios_get_domaingroup_data_nj(domaingroup_hdl, data_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: data_nj + END SUBROUTINE cxios_get_domaingroup_data_nj + + FUNCTION cxios_is_defined_domaingroup_data_nj(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_data_nj + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_data_nj + + + SUBROUTINE cxios_set_domaingroup_domain_group_ref(domaingroup_hdl, domain_group_ref, domain_group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_group_ref + INTEGER (kind = C_INT) , VALUE :: domain_group_ref_size + END SUBROUTINE cxios_set_domaingroup_domain_group_ref + + SUBROUTINE cxios_get_domaingroup_domain_group_ref(domaingroup_hdl, domain_group_ref, domain_group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_group_ref + INTEGER (kind = C_INT) , VALUE :: domain_group_ref_size + END SUBROUTINE cxios_get_domaingroup_domain_group_ref + + FUNCTION cxios_is_defined_domaingroup_domain_group_ref(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_domain_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_domain_group_ref + + + SUBROUTINE cxios_set_domaingroup_group_ref(domaingroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_set_domaingroup_group_ref + + SUBROUTINE cxios_get_domaingroup_group_ref(domaingroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_get_domaingroup_group_ref + + FUNCTION cxios_is_defined_domaingroup_group_ref(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_group_ref + + + SUBROUTINE cxios_set_domaingroup_i_index(domaingroup_hdl, i_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: i_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domaingroup_i_index + + SUBROUTINE cxios_get_domaingroup_i_index(domaingroup_hdl, i_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: i_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domaingroup_i_index + + FUNCTION cxios_is_defined_domaingroup_i_index(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_i_index + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_i_index + + + SUBROUTINE cxios_set_domaingroup_ibegin(domaingroup_hdl, ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: ibegin + END SUBROUTINE cxios_set_domaingroup_ibegin + + SUBROUTINE cxios_get_domaingroup_ibegin(domaingroup_hdl, ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: ibegin + END SUBROUTINE cxios_get_domaingroup_ibegin + + FUNCTION cxios_is_defined_domaingroup_ibegin(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_ibegin + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_ibegin + + + SUBROUTINE cxios_set_domaingroup_iend(domaingroup_hdl, iend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: iend + END SUBROUTINE cxios_set_domaingroup_iend + + SUBROUTINE cxios_get_domaingroup_iend(domaingroup_hdl, iend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: iend + END SUBROUTINE cxios_get_domaingroup_iend + + FUNCTION cxios_is_defined_domaingroup_iend(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_iend + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_iend + + + SUBROUTINE cxios_set_domaingroup_j_index(domaingroup_hdl, j_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: j_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domaingroup_j_index + + SUBROUTINE cxios_get_domaingroup_j_index(domaingroup_hdl, j_index, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , DIMENSION(*) :: j_index + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domaingroup_j_index + + FUNCTION cxios_is_defined_domaingroup_j_index(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_j_index + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_j_index + + + SUBROUTINE cxios_set_domaingroup_jbegin(domaingroup_hdl, jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: jbegin + END SUBROUTINE cxios_set_domaingroup_jbegin + + SUBROUTINE cxios_get_domaingroup_jbegin(domaingroup_hdl, jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: jbegin + END SUBROUTINE cxios_get_domaingroup_jbegin + + FUNCTION cxios_is_defined_domaingroup_jbegin(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_jbegin + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_jbegin + + + SUBROUTINE cxios_set_domaingroup_jend(domaingroup_hdl, jend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: jend + END SUBROUTINE cxios_set_domaingroup_jend + + SUBROUTINE cxios_get_domaingroup_jend(domaingroup_hdl, jend) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: jend + END SUBROUTINE cxios_get_domaingroup_jend + + FUNCTION cxios_is_defined_domaingroup_jend(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_jend + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_jend + + + SUBROUTINE cxios_set_domaingroup_latvalue(domaingroup_hdl, latvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: latvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domaingroup_latvalue + + SUBROUTINE cxios_get_domaingroup_latvalue(domaingroup_hdl, latvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: latvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domaingroup_latvalue + + FUNCTION cxios_is_defined_domaingroup_latvalue(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_latvalue + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_latvalue + + + SUBROUTINE cxios_set_domaingroup_long_name(domaingroup_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_set_domaingroup_long_name + + SUBROUTINE cxios_get_domaingroup_long_name(domaingroup_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_get_domaingroup_long_name + + FUNCTION cxios_is_defined_domaingroup_long_name(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_long_name + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_long_name + + + SUBROUTINE cxios_set_domaingroup_lonvalue(domaingroup_hdl, lonvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: lonvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_set_domaingroup_lonvalue + + SUBROUTINE cxios_get_domaingroup_lonvalue(domaingroup_hdl, lonvalue, extent1) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + REAL (KIND=C_DOUBLE) , DIMENSION(*) :: lonvalue + INTEGER (kind = C_INT), VALUE :: extent1 + END SUBROUTINE cxios_get_domaingroup_lonvalue + + FUNCTION cxios_is_defined_domaingroup_lonvalue(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_lonvalue + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_lonvalue + + + SUBROUTINE cxios_set_domaingroup_mask(domaingroup_hdl, mask, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_set_domaingroup_mask + + SUBROUTINE cxios_get_domaingroup_mask(domaingroup_hdl, mask, extent1, extent2) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + END SUBROUTINE cxios_get_domaingroup_mask + + FUNCTION cxios_is_defined_domaingroup_mask(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_mask + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_mask + + + SUBROUTINE cxios_set_domaingroup_name(domaingroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_domaingroup_name + + SUBROUTINE cxios_get_domaingroup_name(domaingroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_domaingroup_name + + FUNCTION cxios_is_defined_domaingroup_name(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_name + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_name + + + SUBROUTINE cxios_set_domaingroup_ni(domaingroup_hdl, ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: ni + END SUBROUTINE cxios_set_domaingroup_ni + + SUBROUTINE cxios_get_domaingroup_ni(domaingroup_hdl, ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: ni + END SUBROUTINE cxios_get_domaingroup_ni + + FUNCTION cxios_is_defined_domaingroup_ni(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_ni + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_ni + + + SUBROUTINE cxios_set_domaingroup_ni_glo(domaingroup_hdl, ni_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: ni_glo + END SUBROUTINE cxios_set_domaingroup_ni_glo + + SUBROUTINE cxios_get_domaingroup_ni_glo(domaingroup_hdl, ni_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: ni_glo + END SUBROUTINE cxios_get_domaingroup_ni_glo + + FUNCTION cxios_is_defined_domaingroup_ni_glo(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_ni_glo + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_ni_glo + + + SUBROUTINE cxios_set_domaingroup_nj(domaingroup_hdl, nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: nj + END SUBROUTINE cxios_set_domaingroup_nj + + SUBROUTINE cxios_get_domaingroup_nj(domaingroup_hdl, nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: nj + END SUBROUTINE cxios_get_domaingroup_nj + + FUNCTION cxios_is_defined_domaingroup_nj(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_nj + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_nj + + + SUBROUTINE cxios_set_domaingroup_nj_glo(domaingroup_hdl, nj_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: nj_glo + END SUBROUTINE cxios_set_domaingroup_nj_glo + + SUBROUTINE cxios_get_domaingroup_nj_glo(domaingroup_hdl, nj_glo) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: nj_glo + END SUBROUTINE cxios_get_domaingroup_nj_glo + + FUNCTION cxios_is_defined_domaingroup_nj_glo(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_nj_glo + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_nj_glo + + + SUBROUTINE cxios_set_domaingroup_nvertex(domaingroup_hdl, nvertex) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: nvertex + END SUBROUTINE cxios_set_domaingroup_nvertex + + SUBROUTINE cxios_get_domaingroup_nvertex(domaingroup_hdl, nvertex) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: nvertex + END SUBROUTINE cxios_get_domaingroup_nvertex + + FUNCTION cxios_is_defined_domaingroup_nvertex(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_nvertex + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_nvertex + + + SUBROUTINE cxios_set_domaingroup_standard_name(domaingroup_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_set_domaingroup_standard_name + + SUBROUTINE cxios_get_domaingroup_standard_name(domaingroup_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_get_domaingroup_standard_name + + FUNCTION cxios_is_defined_domaingroup_standard_name(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_standard_name + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_standard_name + + + SUBROUTINE cxios_set_domaingroup_type(domaingroup_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_set_domaingroup_type + + SUBROUTINE cxios_get_domaingroup_type(domaingroup_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_get_domaingroup_type + + FUNCTION cxios_is_defined_domaingroup_type(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_type + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_type + + + SUBROUTINE cxios_set_domaingroup_zoom_ibegin(domaingroup_hdl, zoom_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ibegin + END SUBROUTINE cxios_set_domaingroup_zoom_ibegin + + SUBROUTINE cxios_get_domaingroup_zoom_ibegin(domaingroup_hdl, zoom_ibegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_ibegin + END SUBROUTINE cxios_get_domaingroup_zoom_ibegin + + FUNCTION cxios_is_defined_domaingroup_zoom_ibegin(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_ibegin + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_ibegin + + + SUBROUTINE cxios_set_domaingroup_zoom_ibegin_loc(domaingroup_hdl, zoom_ibegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ibegin_loc + END SUBROUTINE cxios_set_domaingroup_zoom_ibegin_loc + + SUBROUTINE cxios_get_domaingroup_zoom_ibegin_loc(domaingroup_hdl, zoom_ibegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_ibegin_loc + END SUBROUTINE cxios_get_domaingroup_zoom_ibegin_loc + + FUNCTION cxios_is_defined_domaingroup_zoom_ibegin_loc(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_ibegin_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_ibegin_loc + + + SUBROUTINE cxios_set_domaingroup_zoom_jbegin(domaingroup_hdl, zoom_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_jbegin + END SUBROUTINE cxios_set_domaingroup_zoom_jbegin + + SUBROUTINE cxios_get_domaingroup_zoom_jbegin(domaingroup_hdl, zoom_jbegin) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_jbegin + END SUBROUTINE cxios_get_domaingroup_zoom_jbegin + + FUNCTION cxios_is_defined_domaingroup_zoom_jbegin(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_jbegin + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_jbegin + + + SUBROUTINE cxios_set_domaingroup_zoom_jbegin_loc(domaingroup_hdl, zoom_jbegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_jbegin_loc + END SUBROUTINE cxios_set_domaingroup_zoom_jbegin_loc + + SUBROUTINE cxios_get_domaingroup_zoom_jbegin_loc(domaingroup_hdl, zoom_jbegin_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_jbegin_loc + END SUBROUTINE cxios_get_domaingroup_zoom_jbegin_loc + + FUNCTION cxios_is_defined_domaingroup_zoom_jbegin_loc(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_jbegin_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_jbegin_loc + + + SUBROUTINE cxios_set_domaingroup_zoom_ni(domaingroup_hdl, zoom_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ni + END SUBROUTINE cxios_set_domaingroup_zoom_ni + + SUBROUTINE cxios_get_domaingroup_zoom_ni(domaingroup_hdl, zoom_ni) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_ni + END SUBROUTINE cxios_get_domaingroup_zoom_ni + + FUNCTION cxios_is_defined_domaingroup_zoom_ni(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_ni + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_ni + + + SUBROUTINE cxios_set_domaingroup_zoom_ni_loc(domaingroup_hdl, zoom_ni_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_ni_loc + END SUBROUTINE cxios_set_domaingroup_zoom_ni_loc + + SUBROUTINE cxios_get_domaingroup_zoom_ni_loc(domaingroup_hdl, zoom_ni_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_ni_loc + END SUBROUTINE cxios_get_domaingroup_zoom_ni_loc + + FUNCTION cxios_is_defined_domaingroup_zoom_ni_loc(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_ni_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_ni_loc + + + SUBROUTINE cxios_set_domaingroup_zoom_nj(domaingroup_hdl, zoom_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_nj + END SUBROUTINE cxios_set_domaingroup_zoom_nj + + SUBROUTINE cxios_get_domaingroup_zoom_nj(domaingroup_hdl, zoom_nj) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_nj + END SUBROUTINE cxios_get_domaingroup_zoom_nj + + FUNCTION cxios_is_defined_domaingroup_zoom_nj(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_nj + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_nj + + + SUBROUTINE cxios_set_domaingroup_zoom_nj_loc(domaingroup_hdl, zoom_nj_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) , VALUE :: zoom_nj_loc + END SUBROUTINE cxios_set_domaingroup_zoom_nj_loc + + SUBROUTINE cxios_get_domaingroup_zoom_nj_loc(domaingroup_hdl, zoom_nj_loc) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + INTEGER (KIND=C_INT) :: zoom_nj_loc + END SUBROUTINE cxios_get_domaingroup_zoom_nj_loc + + FUNCTION cxios_is_defined_domaingroup_zoom_nj_loc(domaingroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_zoom_nj_loc + INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl + END FUNCTION cxios_is_defined_domaingroup_zoom_nj_loc + + + END INTERFACE + +END MODULE domaingroup_interface_attr diff --git a/src/interface/fortran_attr/field_interface_attr.f90 b/src/interface/fortran_attr/field_interface_attr.f90 new file mode 100644 index 0000000..981f880 --- /dev/null +++ b/src/interface/fortran_attr/field_interface_attr.f90 @@ -0,0 +1,415 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE field_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_field_add_offset(field_hdl, add_offset) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) , VALUE :: add_offset + END SUBROUTINE cxios_set_field_add_offset + + SUBROUTINE cxios_get_field_add_offset(field_hdl, add_offset) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) :: add_offset + END SUBROUTINE cxios_get_field_add_offset + + FUNCTION cxios_is_defined_field_add_offset(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_add_offset + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_add_offset + + + SUBROUTINE cxios_set_field_axis_ref(field_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_set_field_axis_ref + + SUBROUTINE cxios_get_field_axis_ref(field_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_get_field_axis_ref + + FUNCTION cxios_is_defined_field_axis_ref(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_axis_ref + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_axis_ref + + + SUBROUTINE cxios_set_field_default_value(field_hdl, default_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) , VALUE :: default_value + END SUBROUTINE cxios_set_field_default_value + + SUBROUTINE cxios_get_field_default_value(field_hdl, default_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) :: default_value + END SUBROUTINE cxios_get_field_default_value + + FUNCTION cxios_is_defined_field_default_value(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_default_value + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_default_value + + + SUBROUTINE cxios_set_field_detect_missing_value(field_hdl, detect_missing_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + LOGICAL (KIND=C_BOOL) , VALUE :: detect_missing_value + END SUBROUTINE cxios_set_field_detect_missing_value + + SUBROUTINE cxios_get_field_detect_missing_value(field_hdl, detect_missing_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + LOGICAL (KIND=C_BOOL) :: detect_missing_value + END SUBROUTINE cxios_get_field_detect_missing_value + + FUNCTION cxios_is_defined_field_detect_missing_value(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_detect_missing_value + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_detect_missing_value + + + SUBROUTINE cxios_set_field_domain_ref(field_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_set_field_domain_ref + + SUBROUTINE cxios_get_field_domain_ref(field_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_get_field_domain_ref + + FUNCTION cxios_is_defined_field_domain_ref(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_domain_ref + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_domain_ref + + + SUBROUTINE cxios_set_field_enabled(field_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + LOGICAL (KIND=C_BOOL) , VALUE :: enabled + END SUBROUTINE cxios_set_field_enabled + + SUBROUTINE cxios_get_field_enabled(field_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + LOGICAL (KIND=C_BOOL) :: enabled + END SUBROUTINE cxios_get_field_enabled + + FUNCTION cxios_is_defined_field_enabled(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_enabled + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_enabled + + + SUBROUTINE cxios_set_field_field_ref(field_hdl, field_ref, field_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: field_ref + INTEGER (kind = C_INT) , VALUE :: field_ref_size + END SUBROUTINE cxios_set_field_field_ref + + SUBROUTINE cxios_get_field_field_ref(field_hdl, field_ref, field_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: field_ref + INTEGER (kind = C_INT) , VALUE :: field_ref_size + END SUBROUTINE cxios_get_field_field_ref + + FUNCTION cxios_is_defined_field_field_ref(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_field_ref + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_field_ref + + + SUBROUTINE cxios_set_field_freq_offset(field_hdl, freq_offset, freq_offset_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_offset + INTEGER (kind = C_INT) , VALUE :: freq_offset_size + END SUBROUTINE cxios_set_field_freq_offset + + SUBROUTINE cxios_get_field_freq_offset(field_hdl, freq_offset, freq_offset_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_offset + INTEGER (kind = C_INT) , VALUE :: freq_offset_size + END SUBROUTINE cxios_get_field_freq_offset + + FUNCTION cxios_is_defined_field_freq_offset(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_freq_offset + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_freq_offset + + + SUBROUTINE cxios_set_field_freq_op(field_hdl, freq_op, freq_op_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_op + INTEGER (kind = C_INT) , VALUE :: freq_op_size + END SUBROUTINE cxios_set_field_freq_op + + SUBROUTINE cxios_get_field_freq_op(field_hdl, freq_op, freq_op_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_op + INTEGER (kind = C_INT) , VALUE :: freq_op_size + END SUBROUTINE cxios_get_field_freq_op + + FUNCTION cxios_is_defined_field_freq_op(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_freq_op + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_freq_op + + + SUBROUTINE cxios_set_field_grid_ref(field_hdl, grid_ref, grid_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: grid_ref + INTEGER (kind = C_INT) , VALUE :: grid_ref_size + END SUBROUTINE cxios_set_field_grid_ref + + SUBROUTINE cxios_get_field_grid_ref(field_hdl, grid_ref, grid_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: grid_ref + INTEGER (kind = C_INT) , VALUE :: grid_ref_size + END SUBROUTINE cxios_get_field_grid_ref + + FUNCTION cxios_is_defined_field_grid_ref(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_grid_ref + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_grid_ref + + + SUBROUTINE cxios_set_field_level(field_hdl, level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + INTEGER (KIND=C_INT) , VALUE :: level + END SUBROUTINE cxios_set_field_level + + SUBROUTINE cxios_get_field_level(field_hdl, level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + INTEGER (KIND=C_INT) :: level + END SUBROUTINE cxios_get_field_level + + FUNCTION cxios_is_defined_field_level(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_level + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_level + + + SUBROUTINE cxios_set_field_long_name(field_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_set_field_long_name + + SUBROUTINE cxios_get_field_long_name(field_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_get_field_long_name + + FUNCTION cxios_is_defined_field_long_name(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_long_name + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_long_name + + + SUBROUTINE cxios_set_field_name(field_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_field_name + + SUBROUTINE cxios_get_field_name(field_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_field_name + + FUNCTION cxios_is_defined_field_name(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_name + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_name + + + SUBROUTINE cxios_set_field_operation(field_hdl, operation, operation_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: operation + INTEGER (kind = C_INT) , VALUE :: operation_size + END SUBROUTINE cxios_set_field_operation + + SUBROUTINE cxios_get_field_operation(field_hdl, operation, operation_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: operation + INTEGER (kind = C_INT) , VALUE :: operation_size + END SUBROUTINE cxios_get_field_operation + + FUNCTION cxios_is_defined_field_operation(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_operation + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_operation + + + SUBROUTINE cxios_set_field_prec(field_hdl, prec) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + INTEGER (KIND=C_INT) , VALUE :: prec + END SUBROUTINE cxios_set_field_prec + + SUBROUTINE cxios_get_field_prec(field_hdl, prec) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + INTEGER (KIND=C_INT) :: prec + END SUBROUTINE cxios_get_field_prec + + FUNCTION cxios_is_defined_field_prec(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_prec + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_prec + + + SUBROUTINE cxios_set_field_scale_factor(field_hdl, scale_factor) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) , VALUE :: scale_factor + END SUBROUTINE cxios_set_field_scale_factor + + SUBROUTINE cxios_get_field_scale_factor(field_hdl, scale_factor) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) :: scale_factor + END SUBROUTINE cxios_get_field_scale_factor + + FUNCTION cxios_is_defined_field_scale_factor(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_scale_factor + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_scale_factor + + + SUBROUTINE cxios_set_field_standard_name(field_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_set_field_standard_name + + SUBROUTINE cxios_get_field_standard_name(field_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_get_field_standard_name + + FUNCTION cxios_is_defined_field_standard_name(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_standard_name + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_standard_name + + + SUBROUTINE cxios_set_field_unit(field_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_set_field_unit + + SUBROUTINE cxios_get_field_unit(field_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_get_field_unit + + FUNCTION cxios_is_defined_field_unit(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_unit + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_unit + + + SUBROUTINE cxios_set_field_valid_max(field_hdl, valid_max) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) , VALUE :: valid_max + END SUBROUTINE cxios_set_field_valid_max + + SUBROUTINE cxios_get_field_valid_max(field_hdl, valid_max) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) :: valid_max + END SUBROUTINE cxios_get_field_valid_max + + FUNCTION cxios_is_defined_field_valid_max(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_valid_max + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_valid_max + + + SUBROUTINE cxios_set_field_valid_min(field_hdl, valid_min) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) , VALUE :: valid_min + END SUBROUTINE cxios_set_field_valid_min + + SUBROUTINE cxios_get_field_valid_min(field_hdl, valid_min) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + REAL (KIND=C_DOUBLE) :: valid_min + END SUBROUTINE cxios_get_field_valid_min + + FUNCTION cxios_is_defined_field_valid_min(field_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_valid_min + INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl + END FUNCTION cxios_is_defined_field_valid_min + + + END INTERFACE + +END MODULE field_interface_attr diff --git a/src/interface/fortran_attr/fieldgroup_interface_attr.f90 b/src/interface/fortran_attr/fieldgroup_interface_attr.f90 new file mode 100644 index 0000000..d6eeaff --- /dev/null +++ b/src/interface/fortran_attr/fieldgroup_interface_attr.f90 @@ -0,0 +1,436 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE fieldgroup_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_fieldgroup_add_offset(fieldgroup_hdl, add_offset) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) , VALUE :: add_offset + END SUBROUTINE cxios_set_fieldgroup_add_offset + + SUBROUTINE cxios_get_fieldgroup_add_offset(fieldgroup_hdl, add_offset) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) :: add_offset + END SUBROUTINE cxios_get_fieldgroup_add_offset + + FUNCTION cxios_is_defined_fieldgroup_add_offset(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_add_offset + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_add_offset + + + SUBROUTINE cxios_set_fieldgroup_axis_ref(fieldgroup_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_set_fieldgroup_axis_ref + + SUBROUTINE cxios_get_fieldgroup_axis_ref(fieldgroup_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_get_fieldgroup_axis_ref + + FUNCTION cxios_is_defined_fieldgroup_axis_ref(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_axis_ref + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_axis_ref + + + SUBROUTINE cxios_set_fieldgroup_default_value(fieldgroup_hdl, default_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) , VALUE :: default_value + END SUBROUTINE cxios_set_fieldgroup_default_value + + SUBROUTINE cxios_get_fieldgroup_default_value(fieldgroup_hdl, default_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) :: default_value + END SUBROUTINE cxios_get_fieldgroup_default_value + + FUNCTION cxios_is_defined_fieldgroup_default_value(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_default_value + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_default_value + + + SUBROUTINE cxios_set_fieldgroup_detect_missing_value(fieldgroup_hdl, detect_missing_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + LOGICAL (KIND=C_BOOL) , VALUE :: detect_missing_value + END SUBROUTINE cxios_set_fieldgroup_detect_missing_value + + SUBROUTINE cxios_get_fieldgroup_detect_missing_value(fieldgroup_hdl, detect_missing_value) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + LOGICAL (KIND=C_BOOL) :: detect_missing_value + END SUBROUTINE cxios_get_fieldgroup_detect_missing_value + + FUNCTION cxios_is_defined_fieldgroup_detect_missing_value(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_detect_missing_value + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_detect_missing_value + + + SUBROUTINE cxios_set_fieldgroup_domain_ref(fieldgroup_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_set_fieldgroup_domain_ref + + SUBROUTINE cxios_get_fieldgroup_domain_ref(fieldgroup_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_get_fieldgroup_domain_ref + + FUNCTION cxios_is_defined_fieldgroup_domain_ref(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_domain_ref + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_domain_ref + + + SUBROUTINE cxios_set_fieldgroup_enabled(fieldgroup_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + LOGICAL (KIND=C_BOOL) , VALUE :: enabled + END SUBROUTINE cxios_set_fieldgroup_enabled + + SUBROUTINE cxios_get_fieldgroup_enabled(fieldgroup_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + LOGICAL (KIND=C_BOOL) :: enabled + END SUBROUTINE cxios_get_fieldgroup_enabled + + FUNCTION cxios_is_defined_fieldgroup_enabled(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_enabled + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_enabled + + + SUBROUTINE cxios_set_fieldgroup_field_ref(fieldgroup_hdl, field_ref, field_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: field_ref + INTEGER (kind = C_INT) , VALUE :: field_ref_size + END SUBROUTINE cxios_set_fieldgroup_field_ref + + SUBROUTINE cxios_get_fieldgroup_field_ref(fieldgroup_hdl, field_ref, field_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: field_ref + INTEGER (kind = C_INT) , VALUE :: field_ref_size + END SUBROUTINE cxios_get_fieldgroup_field_ref + + FUNCTION cxios_is_defined_fieldgroup_field_ref(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_field_ref + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_field_ref + + + SUBROUTINE cxios_set_fieldgroup_freq_offset(fieldgroup_hdl, freq_offset, freq_offset_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_offset + INTEGER (kind = C_INT) , VALUE :: freq_offset_size + END SUBROUTINE cxios_set_fieldgroup_freq_offset + + SUBROUTINE cxios_get_fieldgroup_freq_offset(fieldgroup_hdl, freq_offset, freq_offset_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_offset + INTEGER (kind = C_INT) , VALUE :: freq_offset_size + END SUBROUTINE cxios_get_fieldgroup_freq_offset + + FUNCTION cxios_is_defined_fieldgroup_freq_offset(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_freq_offset + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_freq_offset + + + SUBROUTINE cxios_set_fieldgroup_freq_op(fieldgroup_hdl, freq_op, freq_op_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_op + INTEGER (kind = C_INT) , VALUE :: freq_op_size + END SUBROUTINE cxios_set_fieldgroup_freq_op + + SUBROUTINE cxios_get_fieldgroup_freq_op(fieldgroup_hdl, freq_op, freq_op_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: freq_op + INTEGER (kind = C_INT) , VALUE :: freq_op_size + END SUBROUTINE cxios_get_fieldgroup_freq_op + + FUNCTION cxios_is_defined_fieldgroup_freq_op(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_freq_op + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_freq_op + + + SUBROUTINE cxios_set_fieldgroup_grid_ref(fieldgroup_hdl, grid_ref, grid_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: grid_ref + INTEGER (kind = C_INT) , VALUE :: grid_ref_size + END SUBROUTINE cxios_set_fieldgroup_grid_ref + + SUBROUTINE cxios_get_fieldgroup_grid_ref(fieldgroup_hdl, grid_ref, grid_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: grid_ref + INTEGER (kind = C_INT) , VALUE :: grid_ref_size + END SUBROUTINE cxios_get_fieldgroup_grid_ref + + FUNCTION cxios_is_defined_fieldgroup_grid_ref(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_grid_ref + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_grid_ref + + + SUBROUTINE cxios_set_fieldgroup_group_ref(fieldgroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_set_fieldgroup_group_ref + + SUBROUTINE cxios_get_fieldgroup_group_ref(fieldgroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_get_fieldgroup_group_ref + + FUNCTION cxios_is_defined_fieldgroup_group_ref(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_group_ref + + + SUBROUTINE cxios_set_fieldgroup_level(fieldgroup_hdl, level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + INTEGER (KIND=C_INT) , VALUE :: level + END SUBROUTINE cxios_set_fieldgroup_level + + SUBROUTINE cxios_get_fieldgroup_level(fieldgroup_hdl, level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + INTEGER (KIND=C_INT) :: level + END SUBROUTINE cxios_get_fieldgroup_level + + FUNCTION cxios_is_defined_fieldgroup_level(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_level + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_level + + + SUBROUTINE cxios_set_fieldgroup_long_name(fieldgroup_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_set_fieldgroup_long_name + + SUBROUTINE cxios_get_fieldgroup_long_name(fieldgroup_hdl, long_name, long_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: long_name + INTEGER (kind = C_INT) , VALUE :: long_name_size + END SUBROUTINE cxios_get_fieldgroup_long_name + + FUNCTION cxios_is_defined_fieldgroup_long_name(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_long_name + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_long_name + + + SUBROUTINE cxios_set_fieldgroup_name(fieldgroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_fieldgroup_name + + SUBROUTINE cxios_get_fieldgroup_name(fieldgroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_fieldgroup_name + + FUNCTION cxios_is_defined_fieldgroup_name(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_name + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_name + + + SUBROUTINE cxios_set_fieldgroup_operation(fieldgroup_hdl, operation, operation_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: operation + INTEGER (kind = C_INT) , VALUE :: operation_size + END SUBROUTINE cxios_set_fieldgroup_operation + + SUBROUTINE cxios_get_fieldgroup_operation(fieldgroup_hdl, operation, operation_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: operation + INTEGER (kind = C_INT) , VALUE :: operation_size + END SUBROUTINE cxios_get_fieldgroup_operation + + FUNCTION cxios_is_defined_fieldgroup_operation(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_operation + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_operation + + + SUBROUTINE cxios_set_fieldgroup_prec(fieldgroup_hdl, prec) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + INTEGER (KIND=C_INT) , VALUE :: prec + END SUBROUTINE cxios_set_fieldgroup_prec + + SUBROUTINE cxios_get_fieldgroup_prec(fieldgroup_hdl, prec) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + INTEGER (KIND=C_INT) :: prec + END SUBROUTINE cxios_get_fieldgroup_prec + + FUNCTION cxios_is_defined_fieldgroup_prec(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_prec + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_prec + + + SUBROUTINE cxios_set_fieldgroup_scale_factor(fieldgroup_hdl, scale_factor) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) , VALUE :: scale_factor + END SUBROUTINE cxios_set_fieldgroup_scale_factor + + SUBROUTINE cxios_get_fieldgroup_scale_factor(fieldgroup_hdl, scale_factor) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) :: scale_factor + END SUBROUTINE cxios_get_fieldgroup_scale_factor + + FUNCTION cxios_is_defined_fieldgroup_scale_factor(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_scale_factor + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_scale_factor + + + SUBROUTINE cxios_set_fieldgroup_standard_name(fieldgroup_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_set_fieldgroup_standard_name + + SUBROUTINE cxios_get_fieldgroup_standard_name(fieldgroup_hdl, standard_name, standard_name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: standard_name + INTEGER (kind = C_INT) , VALUE :: standard_name_size + END SUBROUTINE cxios_get_fieldgroup_standard_name + + FUNCTION cxios_is_defined_fieldgroup_standard_name(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_standard_name + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_standard_name + + + SUBROUTINE cxios_set_fieldgroup_unit(fieldgroup_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_set_fieldgroup_unit + + SUBROUTINE cxios_get_fieldgroup_unit(fieldgroup_hdl, unit, unit_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: unit + INTEGER (kind = C_INT) , VALUE :: unit_size + END SUBROUTINE cxios_get_fieldgroup_unit + + FUNCTION cxios_is_defined_fieldgroup_unit(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_unit + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_unit + + + SUBROUTINE cxios_set_fieldgroup_valid_max(fieldgroup_hdl, valid_max) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) , VALUE :: valid_max + END SUBROUTINE cxios_set_fieldgroup_valid_max + + SUBROUTINE cxios_get_fieldgroup_valid_max(fieldgroup_hdl, valid_max) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) :: valid_max + END SUBROUTINE cxios_get_fieldgroup_valid_max + + FUNCTION cxios_is_defined_fieldgroup_valid_max(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_valid_max + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_valid_max + + + SUBROUTINE cxios_set_fieldgroup_valid_min(fieldgroup_hdl, valid_min) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) , VALUE :: valid_min + END SUBROUTINE cxios_set_fieldgroup_valid_min + + SUBROUTINE cxios_get_fieldgroup_valid_min(fieldgroup_hdl, valid_min) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + REAL (KIND=C_DOUBLE) :: valid_min + END SUBROUTINE cxios_get_fieldgroup_valid_min + + FUNCTION cxios_is_defined_fieldgroup_valid_min(fieldgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_valid_min + INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl + END FUNCTION cxios_is_defined_fieldgroup_valid_min + + + END INTERFACE + +END MODULE fieldgroup_interface_attr diff --git a/src/interface/fortran_attr/file_interface_attr.f90 b/src/interface/fortran_attr/file_interface_attr.f90 new file mode 100644 index 0000000..e98b71c --- /dev/null +++ b/src/interface/fortran_attr/file_interface_attr.f90 @@ -0,0 +1,259 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE file_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_file_description(file_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_set_file_description + + SUBROUTINE cxios_get_file_description(file_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_get_file_description + + FUNCTION cxios_is_defined_file_description(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_description + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_description + + + SUBROUTINE cxios_set_file_enabled(file_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + LOGICAL (KIND=C_BOOL) , VALUE :: enabled + END SUBROUTINE cxios_set_file_enabled + + SUBROUTINE cxios_get_file_enabled(file_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + LOGICAL (KIND=C_BOOL) :: enabled + END SUBROUTINE cxios_get_file_enabled + + FUNCTION cxios_is_defined_file_enabled(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_enabled + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_enabled + + + SUBROUTINE cxios_set_file_min_digits(file_hdl, min_digits) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + INTEGER (KIND=C_INT) , VALUE :: min_digits + END SUBROUTINE cxios_set_file_min_digits + + SUBROUTINE cxios_get_file_min_digits(file_hdl, min_digits) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + INTEGER (KIND=C_INT) :: min_digits + END SUBROUTINE cxios_get_file_min_digits + + FUNCTION cxios_is_defined_file_min_digits(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_min_digits + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_min_digits + + + SUBROUTINE cxios_set_file_name(file_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_file_name + + SUBROUTINE cxios_get_file_name(file_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_file_name + + FUNCTION cxios_is_defined_file_name(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_name + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_name + + + SUBROUTINE cxios_set_file_name_suffix(file_hdl, name_suffix, name_suffix_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name_suffix + INTEGER (kind = C_INT) , VALUE :: name_suffix_size + END SUBROUTINE cxios_set_file_name_suffix + + SUBROUTINE cxios_get_file_name_suffix(file_hdl, name_suffix, name_suffix_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name_suffix + INTEGER (kind = C_INT) , VALUE :: name_suffix_size + END SUBROUTINE cxios_get_file_name_suffix + + FUNCTION cxios_is_defined_file_name_suffix(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_name_suffix + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_name_suffix + + + SUBROUTINE cxios_set_file_output_freq(file_hdl, output_freq, output_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: output_freq + INTEGER (kind = C_INT) , VALUE :: output_freq_size + END SUBROUTINE cxios_set_file_output_freq + + SUBROUTINE cxios_get_file_output_freq(file_hdl, output_freq, output_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: output_freq + INTEGER (kind = C_INT) , VALUE :: output_freq_size + END SUBROUTINE cxios_get_file_output_freq + + FUNCTION cxios_is_defined_file_output_freq(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_output_freq + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_output_freq + + + SUBROUTINE cxios_set_file_output_level(file_hdl, output_level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + INTEGER (KIND=C_INT) , VALUE :: output_level + END SUBROUTINE cxios_set_file_output_level + + SUBROUTINE cxios_get_file_output_level(file_hdl, output_level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + INTEGER (KIND=C_INT) :: output_level + END SUBROUTINE cxios_get_file_output_level + + FUNCTION cxios_is_defined_file_output_level(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_output_level + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_output_level + + + SUBROUTINE cxios_set_file_par_access(file_hdl, par_access, par_access_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: par_access + INTEGER (kind = C_INT) , VALUE :: par_access_size + END SUBROUTINE cxios_set_file_par_access + + SUBROUTINE cxios_get_file_par_access(file_hdl, par_access, par_access_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: par_access + INTEGER (kind = C_INT) , VALUE :: par_access_size + END SUBROUTINE cxios_get_file_par_access + + FUNCTION cxios_is_defined_file_par_access(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_par_access + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_par_access + + + SUBROUTINE cxios_set_file_split_freq(file_hdl, split_freq, split_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq + INTEGER (kind = C_INT) , VALUE :: split_freq_size + END SUBROUTINE cxios_set_file_split_freq + + SUBROUTINE cxios_get_file_split_freq(file_hdl, split_freq, split_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq + INTEGER (kind = C_INT) , VALUE :: split_freq_size + END SUBROUTINE cxios_get_file_split_freq + + FUNCTION cxios_is_defined_file_split_freq(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_split_freq + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_split_freq + + + SUBROUTINE cxios_set_file_split_freq_format(file_hdl, split_freq_format, split_freq_format_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq_format + INTEGER (kind = C_INT) , VALUE :: split_freq_format_size + END SUBROUTINE cxios_set_file_split_freq_format + + SUBROUTINE cxios_get_file_split_freq_format(file_hdl, split_freq_format, split_freq_format_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq_format + INTEGER (kind = C_INT) , VALUE :: split_freq_format_size + END SUBROUTINE cxios_get_file_split_freq_format + + FUNCTION cxios_is_defined_file_split_freq_format(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_split_freq_format + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_split_freq_format + + + SUBROUTINE cxios_set_file_sync_freq(file_hdl, sync_freq, sync_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: sync_freq + INTEGER (kind = C_INT) , VALUE :: sync_freq_size + END SUBROUTINE cxios_set_file_sync_freq + + SUBROUTINE cxios_get_file_sync_freq(file_hdl, sync_freq, sync_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: sync_freq + INTEGER (kind = C_INT) , VALUE :: sync_freq_size + END SUBROUTINE cxios_get_file_sync_freq + + FUNCTION cxios_is_defined_file_sync_freq(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_sync_freq + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_sync_freq + + + SUBROUTINE cxios_set_file_type(file_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_set_file_type + + SUBROUTINE cxios_get_file_type(file_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_get_file_type + + FUNCTION cxios_is_defined_file_type(file_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_type + INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl + END FUNCTION cxios_is_defined_file_type + + + END INTERFACE + +END MODULE file_interface_attr diff --git a/src/interface/fortran_attr/filegroup_interface_attr.f90 b/src/interface/fortran_attr/filegroup_interface_attr.f90 new file mode 100644 index 0000000..b0aeada --- /dev/null +++ b/src/interface/fortran_attr/filegroup_interface_attr.f90 @@ -0,0 +1,280 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE filegroup_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_filegroup_description(filegroup_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_set_filegroup_description + + SUBROUTINE cxios_get_filegroup_description(filegroup_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_get_filegroup_description + + FUNCTION cxios_is_defined_filegroup_description(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_description + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_description + + + SUBROUTINE cxios_set_filegroup_enabled(filegroup_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + LOGICAL (KIND=C_BOOL) , VALUE :: enabled + END SUBROUTINE cxios_set_filegroup_enabled + + SUBROUTINE cxios_get_filegroup_enabled(filegroup_hdl, enabled) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + LOGICAL (KIND=C_BOOL) :: enabled + END SUBROUTINE cxios_get_filegroup_enabled + + FUNCTION cxios_is_defined_filegroup_enabled(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_enabled + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_enabled + + + SUBROUTINE cxios_set_filegroup_group_ref(filegroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_set_filegroup_group_ref + + SUBROUTINE cxios_get_filegroup_group_ref(filegroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_get_filegroup_group_ref + + FUNCTION cxios_is_defined_filegroup_group_ref(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_group_ref + + + SUBROUTINE cxios_set_filegroup_min_digits(filegroup_hdl, min_digits) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + INTEGER (KIND=C_INT) , VALUE :: min_digits + END SUBROUTINE cxios_set_filegroup_min_digits + + SUBROUTINE cxios_get_filegroup_min_digits(filegroup_hdl, min_digits) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + INTEGER (KIND=C_INT) :: min_digits + END SUBROUTINE cxios_get_filegroup_min_digits + + FUNCTION cxios_is_defined_filegroup_min_digits(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_min_digits + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_min_digits + + + SUBROUTINE cxios_set_filegroup_name(filegroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_filegroup_name + + SUBROUTINE cxios_get_filegroup_name(filegroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_filegroup_name + + FUNCTION cxios_is_defined_filegroup_name(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_name + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_name + + + SUBROUTINE cxios_set_filegroup_name_suffix(filegroup_hdl, name_suffix, name_suffix_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name_suffix + INTEGER (kind = C_INT) , VALUE :: name_suffix_size + END SUBROUTINE cxios_set_filegroup_name_suffix + + SUBROUTINE cxios_get_filegroup_name_suffix(filegroup_hdl, name_suffix, name_suffix_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name_suffix + INTEGER (kind = C_INT) , VALUE :: name_suffix_size + END SUBROUTINE cxios_get_filegroup_name_suffix + + FUNCTION cxios_is_defined_filegroup_name_suffix(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_name_suffix + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_name_suffix + + + SUBROUTINE cxios_set_filegroup_output_freq(filegroup_hdl, output_freq, output_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: output_freq + INTEGER (kind = C_INT) , VALUE :: output_freq_size + END SUBROUTINE cxios_set_filegroup_output_freq + + SUBROUTINE cxios_get_filegroup_output_freq(filegroup_hdl, output_freq, output_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: output_freq + INTEGER (kind = C_INT) , VALUE :: output_freq_size + END SUBROUTINE cxios_get_filegroup_output_freq + + FUNCTION cxios_is_defined_filegroup_output_freq(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_output_freq + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_output_freq + + + SUBROUTINE cxios_set_filegroup_output_level(filegroup_hdl, output_level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + INTEGER (KIND=C_INT) , VALUE :: output_level + END SUBROUTINE cxios_set_filegroup_output_level + + SUBROUTINE cxios_get_filegroup_output_level(filegroup_hdl, output_level) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + INTEGER (KIND=C_INT) :: output_level + END SUBROUTINE cxios_get_filegroup_output_level + + FUNCTION cxios_is_defined_filegroup_output_level(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_output_level + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_output_level + + + SUBROUTINE cxios_set_filegroup_par_access(filegroup_hdl, par_access, par_access_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: par_access + INTEGER (kind = C_INT) , VALUE :: par_access_size + END SUBROUTINE cxios_set_filegroup_par_access + + SUBROUTINE cxios_get_filegroup_par_access(filegroup_hdl, par_access, par_access_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: par_access + INTEGER (kind = C_INT) , VALUE :: par_access_size + END SUBROUTINE cxios_get_filegroup_par_access + + FUNCTION cxios_is_defined_filegroup_par_access(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_par_access + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_par_access + + + SUBROUTINE cxios_set_filegroup_split_freq(filegroup_hdl, split_freq, split_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq + INTEGER (kind = C_INT) , VALUE :: split_freq_size + END SUBROUTINE cxios_set_filegroup_split_freq + + SUBROUTINE cxios_get_filegroup_split_freq(filegroup_hdl, split_freq, split_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq + INTEGER (kind = C_INT) , VALUE :: split_freq_size + END SUBROUTINE cxios_get_filegroup_split_freq + + FUNCTION cxios_is_defined_filegroup_split_freq(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_split_freq + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_split_freq + + + SUBROUTINE cxios_set_filegroup_split_freq_format(filegroup_hdl, split_freq_format, split_freq_format_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq_format + INTEGER (kind = C_INT) , VALUE :: split_freq_format_size + END SUBROUTINE cxios_set_filegroup_split_freq_format + + SUBROUTINE cxios_get_filegroup_split_freq_format(filegroup_hdl, split_freq_format, split_freq_format_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: split_freq_format + INTEGER (kind = C_INT) , VALUE :: split_freq_format_size + END SUBROUTINE cxios_get_filegroup_split_freq_format + + FUNCTION cxios_is_defined_filegroup_split_freq_format(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_split_freq_format + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_split_freq_format + + + SUBROUTINE cxios_set_filegroup_sync_freq(filegroup_hdl, sync_freq, sync_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: sync_freq + INTEGER (kind = C_INT) , VALUE :: sync_freq_size + END SUBROUTINE cxios_set_filegroup_sync_freq + + SUBROUTINE cxios_get_filegroup_sync_freq(filegroup_hdl, sync_freq, sync_freq_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: sync_freq + INTEGER (kind = C_INT) , VALUE :: sync_freq_size + END SUBROUTINE cxios_get_filegroup_sync_freq + + FUNCTION cxios_is_defined_filegroup_sync_freq(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_sync_freq + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_sync_freq + + + SUBROUTINE cxios_set_filegroup_type(filegroup_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_set_filegroup_type + + SUBROUTINE cxios_get_filegroup_type(filegroup_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_get_filegroup_type + + FUNCTION cxios_is_defined_filegroup_type(filegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_type + INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl + END FUNCTION cxios_is_defined_filegroup_type + + + END INTERFACE + +END MODULE filegroup_interface_attr diff --git a/src/interface/fortran_attr/grid_interface_attr.f90 b/src/interface/fortran_attr/grid_interface_attr.f90 new file mode 100644 index 0000000..8189185 --- /dev/null +++ b/src/interface/fortran_attr/grid_interface_attr.f90 @@ -0,0 +1,122 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE grid_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_grid_axis_ref(grid_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_set_grid_axis_ref + + SUBROUTINE cxios_get_grid_axis_ref(grid_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_get_grid_axis_ref + + FUNCTION cxios_is_defined_grid_axis_ref(grid_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_grid_axis_ref + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + END FUNCTION cxios_is_defined_grid_axis_ref + + + SUBROUTINE cxios_set_grid_description(grid_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_set_grid_description + + SUBROUTINE cxios_get_grid_description(grid_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_get_grid_description + + FUNCTION cxios_is_defined_grid_description(grid_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_grid_description + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + END FUNCTION cxios_is_defined_grid_description + + + SUBROUTINE cxios_set_grid_domain_ref(grid_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_set_grid_domain_ref + + SUBROUTINE cxios_get_grid_domain_ref(grid_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_get_grid_domain_ref + + FUNCTION cxios_is_defined_grid_domain_ref(grid_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_grid_domain_ref + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + END FUNCTION cxios_is_defined_grid_domain_ref + + + SUBROUTINE cxios_set_grid_mask(grid_hdl, mask, extent1, extent2, extent3) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + INTEGER (kind = C_INT), VALUE :: extent3 + END SUBROUTINE cxios_set_grid_mask + + SUBROUTINE cxios_get_grid_mask(grid_hdl, mask, extent1, extent2, extent3) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + INTEGER (kind = C_INT), VALUE :: extent3 + END SUBROUTINE cxios_get_grid_mask + + FUNCTION cxios_is_defined_grid_mask(grid_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_grid_mask + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + END FUNCTION cxios_is_defined_grid_mask + + + SUBROUTINE cxios_set_grid_name(grid_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_grid_name + + SUBROUTINE cxios_get_grid_name(grid_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_grid_name + + FUNCTION cxios_is_defined_grid_name(grid_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_grid_name + INTEGER (kind = C_INTPTR_T), VALUE :: grid_hdl + END FUNCTION cxios_is_defined_grid_name + + + END INTERFACE + +END MODULE grid_interface_attr diff --git a/src/interface/fortran_attr/gridgroup_interface_attr.f90 b/src/interface/fortran_attr/gridgroup_interface_attr.f90 new file mode 100644 index 0000000..d914f6b --- /dev/null +++ b/src/interface/fortran_attr/gridgroup_interface_attr.f90 @@ -0,0 +1,143 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE gridgroup_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_gridgroup_axis_ref(gridgroup_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_set_gridgroup_axis_ref + + SUBROUTINE cxios_get_gridgroup_axis_ref(gridgroup_hdl, axis_ref, axis_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: axis_ref + INTEGER (kind = C_INT) , VALUE :: axis_ref_size + END SUBROUTINE cxios_get_gridgroup_axis_ref + + FUNCTION cxios_is_defined_gridgroup_axis_ref(gridgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_gridgroup_axis_ref + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + END FUNCTION cxios_is_defined_gridgroup_axis_ref + + + SUBROUTINE cxios_set_gridgroup_description(gridgroup_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_set_gridgroup_description + + SUBROUTINE cxios_get_gridgroup_description(gridgroup_hdl, description, description_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: description + INTEGER (kind = C_INT) , VALUE :: description_size + END SUBROUTINE cxios_get_gridgroup_description + + FUNCTION cxios_is_defined_gridgroup_description(gridgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_gridgroup_description + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + END FUNCTION cxios_is_defined_gridgroup_description + + + SUBROUTINE cxios_set_gridgroup_domain_ref(gridgroup_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_set_gridgroup_domain_ref + + SUBROUTINE cxios_get_gridgroup_domain_ref(gridgroup_hdl, domain_ref, domain_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: domain_ref + INTEGER (kind = C_INT) , VALUE :: domain_ref_size + END SUBROUTINE cxios_get_gridgroup_domain_ref + + FUNCTION cxios_is_defined_gridgroup_domain_ref(gridgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_gridgroup_domain_ref + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + END FUNCTION cxios_is_defined_gridgroup_domain_ref + + + SUBROUTINE cxios_set_gridgroup_group_ref(gridgroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_set_gridgroup_group_ref + + SUBROUTINE cxios_get_gridgroup_group_ref(gridgroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_get_gridgroup_group_ref + + FUNCTION cxios_is_defined_gridgroup_group_ref(gridgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_gridgroup_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + END FUNCTION cxios_is_defined_gridgroup_group_ref + + + SUBROUTINE cxios_set_gridgroup_mask(gridgroup_hdl, mask, extent1, extent2, extent3) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + INTEGER (kind = C_INT), VALUE :: extent3 + END SUBROUTINE cxios_set_gridgroup_mask + + SUBROUTINE cxios_get_gridgroup_mask(gridgroup_hdl, mask, extent1, extent2, extent3) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + LOGICAL (KIND=C_BOOL) , DIMENSION(*) :: mask + INTEGER (kind = C_INT), VALUE :: extent1 + INTEGER (kind = C_INT), VALUE :: extent2 + INTEGER (kind = C_INT), VALUE :: extent3 + END SUBROUTINE cxios_get_gridgroup_mask + + FUNCTION cxios_is_defined_gridgroup_mask(gridgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_gridgroup_mask + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + END FUNCTION cxios_is_defined_gridgroup_mask + + + SUBROUTINE cxios_set_gridgroup_name(gridgroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_gridgroup_name + + SUBROUTINE cxios_get_gridgroup_name(gridgroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_gridgroup_name + + FUNCTION cxios_is_defined_gridgroup_name(gridgroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_gridgroup_name + INTEGER (kind = C_INTPTR_T), VALUE :: gridgroup_hdl + END FUNCTION cxios_is_defined_gridgroup_name + + + END INTERFACE + +END MODULE gridgroup_interface_attr diff --git a/src/interface/fortran_attr/iaxis_attr.F90 b/src/interface/fortran_attr/iaxis_attr.F90 new file mode 100644 index 0000000..4264e9a --- /dev/null +++ b/src/interface/fortran_attr/iaxis_attr.F90 @@ -0,0 +1,380 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE iaxis_attr + USE, INTRINSIC :: ISO_C_BINDING + USE iaxis + USE axis_interface_attr + +CONTAINS + + SUBROUTINE xios(set_axis_attr) & + ( axis_id, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + IMPLICIT NONE + TYPE(txios(axis)) :: axis_hdl + CHARACTER(LEN=*), INTENT(IN) ::axis_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive + INTEGER , OPTIONAL, INTENT(IN) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: value(:) + INTEGER , OPTIONAL, INTENT(IN) :: zoom_begin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_end + INTEGER , OPTIONAL, INTENT(IN) :: zoom_size + + CALL xios(get_axis_handle)(axis_id,axis_hdl) + CALL xios(set_axis_attr_hdl_) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + END SUBROUTINE xios(set_axis_attr) + + SUBROUTINE xios(set_axis_attr_hdl) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + IMPLICIT NONE + TYPE(txios(axis)) , INTENT(IN) :: axis_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive + INTEGER , OPTIONAL, INTENT(IN) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: value(:) + INTEGER , OPTIONAL, INTENT(IN) :: zoom_begin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_end + INTEGER , OPTIONAL, INTENT(IN) :: zoom_size + + CALL xios(set_axis_attr_hdl_) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + END SUBROUTINE xios(set_axis_attr_hdl) + + SUBROUTINE xios(set_axis_attr_hdl_) & + ( axis_hdl, long_name_, name_, positive_, size_, standard_name_, unit_, value_, zoom_begin_ & + , zoom_end_, zoom_size_ ) + + IMPLICIT NONE + TYPE(txios(axis)) , INTENT(IN) :: axis_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive_ + INTEGER , OPTIONAL, INTENT(IN) :: size_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: value_(:) + INTEGER , OPTIONAL, INTENT(IN) :: zoom_begin_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_end_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_size_ + + IF (PRESENT(long_name_)) THEN + CALL cxios_set_axis_long_name(axis_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_axis_name(axis_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(positive_)) THEN + CALL cxios_set_axis_positive(axis_hdl%daddr, positive_, len(positive_)) + ENDIF + + IF (PRESENT(size_)) THEN + CALL cxios_set_axis_size(axis_hdl%daddr, size_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_set_axis_standard_name(axis_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_set_axis_unit(axis_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(value_)) THEN + CALL cxios_set_axis_value(axis_hdl%daddr, value_,size(value_,1)) + ENDIF + + IF (PRESENT(zoom_begin_)) THEN + CALL cxios_set_axis_zoom_begin(axis_hdl%daddr, zoom_begin_) + ENDIF + + IF (PRESENT(zoom_end_)) THEN + CALL cxios_set_axis_zoom_end(axis_hdl%daddr, zoom_end_) + ENDIF + + IF (PRESENT(zoom_size_)) THEN + CALL cxios_set_axis_zoom_size(axis_hdl%daddr, zoom_size_) + ENDIF + + + + END SUBROUTINE xios(set_axis_attr_hdl_) + + SUBROUTINE xios(get_axis_attr) & + ( axis_id, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + IMPLICIT NONE + TYPE(txios(axis)) :: axis_hdl + CHARACTER(LEN=*), INTENT(IN) ::axis_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive + INTEGER , OPTIONAL, INTENT(OUT) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: value(:) + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_begin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_end + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_size + + CALL xios(get_axis_handle)(axis_id,axis_hdl) + CALL xios(get_axis_attr_hdl_) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + END SUBROUTINE xios(get_axis_attr) + + SUBROUTINE xios(get_axis_attr_hdl) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + IMPLICIT NONE + TYPE(txios(axis)) , INTENT(IN) :: axis_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive + INTEGER , OPTIONAL, INTENT(OUT) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: value(:) + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_begin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_end + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_size + + CALL xios(get_axis_attr_hdl_) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + END SUBROUTINE xios(get_axis_attr_hdl) + + SUBROUTINE xios(get_axis_attr_hdl_) & + ( axis_hdl, long_name_, name_, positive_, size_, standard_name_, unit_, value_, zoom_begin_ & + , zoom_end_, zoom_size_ ) + + IMPLICIT NONE + TYPE(txios(axis)) , INTENT(IN) :: axis_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive_ + INTEGER , OPTIONAL, INTENT(OUT) :: size_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: value_(:) + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_begin_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_end_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_size_ + + IF (PRESENT(long_name_)) THEN + CALL cxios_get_axis_long_name(axis_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_axis_name(axis_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(positive_)) THEN + CALL cxios_get_axis_positive(axis_hdl%daddr, positive_, len(positive_)) + ENDIF + + IF (PRESENT(size_)) THEN + CALL cxios_get_axis_size(axis_hdl%daddr, size_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_get_axis_standard_name(axis_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_get_axis_unit(axis_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(value_)) THEN + CALL cxios_get_axis_value(axis_hdl%daddr, value_,size(value_,1)) + ENDIF + + IF (PRESENT(zoom_begin_)) THEN + CALL cxios_get_axis_zoom_begin(axis_hdl%daddr, zoom_begin_) + ENDIF + + IF (PRESENT(zoom_end_)) THEN + CALL cxios_get_axis_zoom_end(axis_hdl%daddr, zoom_end_) + ENDIF + + IF (PRESENT(zoom_size_)) THEN + CALL cxios_get_axis_zoom_size(axis_hdl%daddr, zoom_size_) + ENDIF + + + + END SUBROUTINE xios(get_axis_attr_hdl_) + + SUBROUTINE xios(is_defined_axis_attr) & + ( axis_id, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + IMPLICIT NONE + TYPE(txios(axis)) :: axis_hdl + CHARACTER(LEN=*), INTENT(IN) ::axis_id + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: positive + LOGICAL(KIND=C_BOOL) :: positive_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: size + LOGICAL(KIND=C_BOOL) :: size_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: value + LOGICAL(KIND=C_BOOL) :: value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_begin + LOGICAL(KIND=C_BOOL) :: zoom_begin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_end + LOGICAL(KIND=C_BOOL) :: zoom_end_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_size + LOGICAL(KIND=C_BOOL) :: zoom_size_tmp + + CALL xios(get_axis_handle)(axis_id,axis_hdl) + CALL xios(is_defined_axis_attr_hdl_) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + END SUBROUTINE xios(is_defined_axis_attr) + + SUBROUTINE xios(is_defined_axis_attr_hdl) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + IMPLICIT NONE + TYPE(txios(axis)) , INTENT(IN) :: axis_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: positive + LOGICAL(KIND=C_BOOL) :: positive_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: size + LOGICAL(KIND=C_BOOL) :: size_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: value + LOGICAL(KIND=C_BOOL) :: value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_begin + LOGICAL(KIND=C_BOOL) :: zoom_begin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_end + LOGICAL(KIND=C_BOOL) :: zoom_end_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_size + LOGICAL(KIND=C_BOOL) :: zoom_size_tmp + + CALL xios(is_defined_axis_attr_hdl_) & + ( axis_hdl, long_name, name, positive, size, standard_name, unit, value, zoom_begin, zoom_end & + , zoom_size ) + + END SUBROUTINE xios(is_defined_axis_attr_hdl) + + SUBROUTINE xios(is_defined_axis_attr_hdl_) & + ( axis_hdl, long_name_, name_, positive_, size_, standard_name_, unit_, value_, zoom_begin_ & + , zoom_end_, zoom_size_ ) + + IMPLICIT NONE + TYPE(txios(axis)) , INTENT(IN) :: axis_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_ + LOGICAL(KIND=C_BOOL) :: long_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: positive_ + LOGICAL(KIND=C_BOOL) :: positive__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: size_ + LOGICAL(KIND=C_BOOL) :: size__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_ + LOGICAL(KIND=C_BOOL) :: standard_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit_ + LOGICAL(KIND=C_BOOL) :: unit__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: value_ + LOGICAL(KIND=C_BOOL) :: value__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_begin_ + LOGICAL(KIND=C_BOOL) :: zoom_begin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_end_ + LOGICAL(KIND=C_BOOL) :: zoom_end__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_size_ + LOGICAL(KIND=C_BOOL) :: zoom_size__tmp + + IF (PRESENT(long_name_)) THEN + long_name__tmp=cxios_is_defined_axis_long_name(axis_hdl%daddr) + long_name_=long_name__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_axis_name(axis_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(positive_)) THEN + positive__tmp=cxios_is_defined_axis_positive(axis_hdl%daddr) + positive_=positive__tmp + ENDIF + + IF (PRESENT(size_)) THEN + size__tmp=cxios_is_defined_axis_size(axis_hdl%daddr) + size_=size__tmp + ENDIF + + IF (PRESENT(standard_name_)) THEN + standard_name__tmp=cxios_is_defined_axis_standard_name(axis_hdl%daddr) + standard_name_=standard_name__tmp + ENDIF + + IF (PRESENT(unit_)) THEN + unit__tmp=cxios_is_defined_axis_unit(axis_hdl%daddr) + unit_=unit__tmp + ENDIF + + IF (PRESENT(value_)) THEN + value__tmp=cxios_is_defined_axis_value(axis_hdl%daddr) + value_=value__tmp + ENDIF + + IF (PRESENT(zoom_begin_)) THEN + zoom_begin__tmp=cxios_is_defined_axis_zoom_begin(axis_hdl%daddr) + zoom_begin_=zoom_begin__tmp + ENDIF + + IF (PRESENT(zoom_end_)) THEN + zoom_end__tmp=cxios_is_defined_axis_zoom_end(axis_hdl%daddr) + zoom_end_=zoom_end__tmp + ENDIF + + IF (PRESENT(zoom_size_)) THEN + zoom_size__tmp=cxios_is_defined_axis_zoom_size(axis_hdl%daddr) + zoom_size_=zoom_size__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_axis_attr_hdl_) + +END MODULE iaxis_attr diff --git a/src/interface/fortran_attr/iaxisgroup_attr.F90 b/src/interface/fortran_attr/iaxisgroup_attr.F90 new file mode 100644 index 0000000..9366078 --- /dev/null +++ b/src/interface/fortran_attr/iaxisgroup_attr.F90 @@ -0,0 +1,405 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE iaxisgroup_attr + USE, INTRINSIC :: ISO_C_BINDING + USE iaxis + USE axisgroup_interface_attr + +CONTAINS + + SUBROUTINE xios(set_axisgroup_attr) & + ( axisgroup_id, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) :: axisgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::axisgroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive + INTEGER , OPTIONAL, INTENT(IN) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: value(:) + INTEGER , OPTIONAL, INTENT(IN) :: zoom_begin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_end + INTEGER , OPTIONAL, INTENT(IN) :: zoom_size + + CALL xios(get_axisgroup_handle)(axisgroup_id,axisgroup_hdl) + CALL xios(set_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + END SUBROUTINE xios(set_axisgroup_attr) + + SUBROUTINE xios(set_axisgroup_attr_hdl) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) , INTENT(IN) :: axisgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive + INTEGER , OPTIONAL, INTENT(IN) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: value(:) + INTEGER , OPTIONAL, INTENT(IN) :: zoom_begin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_end + INTEGER , OPTIONAL, INTENT(IN) :: zoom_size + + CALL xios(set_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + END SUBROUTINE xios(set_axisgroup_attr_hdl) + + SUBROUTINE xios(set_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref_, long_name_, name_, positive_, size_, standard_name_, unit_, value_ & + , zoom_begin_, zoom_end_, zoom_size_ ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) , INTENT(IN) :: axisgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive_ + INTEGER , OPTIONAL, INTENT(IN) :: size_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: value_(:) + INTEGER , OPTIONAL, INTENT(IN) :: zoom_begin_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_end_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_size_ + + IF (PRESENT(group_ref_)) THEN + CALL cxios_set_axisgroup_group_ref(axisgroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_set_axisgroup_long_name(axisgroup_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_axisgroup_name(axisgroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(positive_)) THEN + CALL cxios_set_axisgroup_positive(axisgroup_hdl%daddr, positive_, len(positive_)) + ENDIF + + IF (PRESENT(size_)) THEN + CALL cxios_set_axisgroup_size(axisgroup_hdl%daddr, size_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_set_axisgroup_standard_name(axisgroup_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_set_axisgroup_unit(axisgroup_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(value_)) THEN + CALL cxios_set_axisgroup_value(axisgroup_hdl%daddr, value_,size(value_,1)) + ENDIF + + IF (PRESENT(zoom_begin_)) THEN + CALL cxios_set_axisgroup_zoom_begin(axisgroup_hdl%daddr, zoom_begin_) + ENDIF + + IF (PRESENT(zoom_end_)) THEN + CALL cxios_set_axisgroup_zoom_end(axisgroup_hdl%daddr, zoom_end_) + ENDIF + + IF (PRESENT(zoom_size_)) THEN + CALL cxios_set_axisgroup_zoom_size(axisgroup_hdl%daddr, zoom_size_) + ENDIF + + + + END SUBROUTINE xios(set_axisgroup_attr_hdl_) + + SUBROUTINE xios(get_axisgroup_attr) & + ( axisgroup_id, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) :: axisgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::axisgroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive + INTEGER , OPTIONAL, INTENT(OUT) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: value(:) + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_begin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_end + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_size + + CALL xios(get_axisgroup_handle)(axisgroup_id,axisgroup_hdl) + CALL xios(get_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + END SUBROUTINE xios(get_axisgroup_attr) + + SUBROUTINE xios(get_axisgroup_attr_hdl) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) , INTENT(IN) :: axisgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive + INTEGER , OPTIONAL, INTENT(OUT) :: size + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: value(:) + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_begin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_end + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_size + + CALL xios(get_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + END SUBROUTINE xios(get_axisgroup_attr_hdl) + + SUBROUTINE xios(get_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref_, long_name_, name_, positive_, size_, standard_name_, unit_, value_ & + , zoom_begin_, zoom_end_, zoom_size_ ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) , INTENT(IN) :: axisgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive_ + INTEGER , OPTIONAL, INTENT(OUT) :: size_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: value_(:) + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_begin_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_end_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_size_ + + IF (PRESENT(group_ref_)) THEN + CALL cxios_get_axisgroup_group_ref(axisgroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_get_axisgroup_long_name(axisgroup_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_axisgroup_name(axisgroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(positive_)) THEN + CALL cxios_get_axisgroup_positive(axisgroup_hdl%daddr, positive_, len(positive_)) + ENDIF + + IF (PRESENT(size_)) THEN + CALL cxios_get_axisgroup_size(axisgroup_hdl%daddr, size_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_get_axisgroup_standard_name(axisgroup_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_get_axisgroup_unit(axisgroup_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(value_)) THEN + CALL cxios_get_axisgroup_value(axisgroup_hdl%daddr, value_,size(value_,1)) + ENDIF + + IF (PRESENT(zoom_begin_)) THEN + CALL cxios_get_axisgroup_zoom_begin(axisgroup_hdl%daddr, zoom_begin_) + ENDIF + + IF (PRESENT(zoom_end_)) THEN + CALL cxios_get_axisgroup_zoom_end(axisgroup_hdl%daddr, zoom_end_) + ENDIF + + IF (PRESENT(zoom_size_)) THEN + CALL cxios_get_axisgroup_zoom_size(axisgroup_hdl%daddr, zoom_size_) + ENDIF + + + + END SUBROUTINE xios(get_axisgroup_attr_hdl_) + + SUBROUTINE xios(is_defined_axisgroup_attr) & + ( axisgroup_id, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) :: axisgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::axisgroup_id + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: positive + LOGICAL(KIND=C_BOOL) :: positive_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: size + LOGICAL(KIND=C_BOOL) :: size_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: value + LOGICAL(KIND=C_BOOL) :: value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_begin + LOGICAL(KIND=C_BOOL) :: zoom_begin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_end + LOGICAL(KIND=C_BOOL) :: zoom_end_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_size + LOGICAL(KIND=C_BOOL) :: zoom_size_tmp + + CALL xios(get_axisgroup_handle)(axisgroup_id,axisgroup_hdl) + CALL xios(is_defined_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + END SUBROUTINE xios(is_defined_axisgroup_attr) + + SUBROUTINE xios(is_defined_axisgroup_attr_hdl) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) , INTENT(IN) :: axisgroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: positive + LOGICAL(KIND=C_BOOL) :: positive_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: size + LOGICAL(KIND=C_BOOL) :: size_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: value + LOGICAL(KIND=C_BOOL) :: value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_begin + LOGICAL(KIND=C_BOOL) :: zoom_begin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_end + LOGICAL(KIND=C_BOOL) :: zoom_end_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_size + LOGICAL(KIND=C_BOOL) :: zoom_size_tmp + + CALL xios(is_defined_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref, long_name, name, positive, size, standard_name, unit, value, zoom_begin & + , zoom_end, zoom_size ) + + END SUBROUTINE xios(is_defined_axisgroup_attr_hdl) + + SUBROUTINE xios(is_defined_axisgroup_attr_hdl_) & + ( axisgroup_hdl, group_ref_, long_name_, name_, positive_, size_, standard_name_, unit_, value_ & + , zoom_begin_, zoom_end_, zoom_size_ ) + + IMPLICIT NONE + TYPE(txios(axisgroup)) , INTENT(IN) :: axisgroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL(KIND=C_BOOL) :: group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_ + LOGICAL(KIND=C_BOOL) :: long_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: positive_ + LOGICAL(KIND=C_BOOL) :: positive__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: size_ + LOGICAL(KIND=C_BOOL) :: size__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_ + LOGICAL(KIND=C_BOOL) :: standard_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit_ + LOGICAL(KIND=C_BOOL) :: unit__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: value_ + LOGICAL(KIND=C_BOOL) :: value__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_begin_ + LOGICAL(KIND=C_BOOL) :: zoom_begin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_end_ + LOGICAL(KIND=C_BOOL) :: zoom_end__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_size_ + LOGICAL(KIND=C_BOOL) :: zoom_size__tmp + + IF (PRESENT(group_ref_)) THEN + group_ref__tmp=cxios_is_defined_axisgroup_group_ref(axisgroup_hdl%daddr) + group_ref_=group_ref__tmp + ENDIF + + IF (PRESENT(long_name_)) THEN + long_name__tmp=cxios_is_defined_axisgroup_long_name(axisgroup_hdl%daddr) + long_name_=long_name__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_axisgroup_name(axisgroup_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(positive_)) THEN + positive__tmp=cxios_is_defined_axisgroup_positive(axisgroup_hdl%daddr) + positive_=positive__tmp + ENDIF + + IF (PRESENT(size_)) THEN + size__tmp=cxios_is_defined_axisgroup_size(axisgroup_hdl%daddr) + size_=size__tmp + ENDIF + + IF (PRESENT(standard_name_)) THEN + standard_name__tmp=cxios_is_defined_axisgroup_standard_name(axisgroup_hdl%daddr) + standard_name_=standard_name__tmp + ENDIF + + IF (PRESENT(unit_)) THEN + unit__tmp=cxios_is_defined_axisgroup_unit(axisgroup_hdl%daddr) + unit_=unit__tmp + ENDIF + + IF (PRESENT(value_)) THEN + value__tmp=cxios_is_defined_axisgroup_value(axisgroup_hdl%daddr) + value_=value__tmp + ENDIF + + IF (PRESENT(zoom_begin_)) THEN + zoom_begin__tmp=cxios_is_defined_axisgroup_zoom_begin(axisgroup_hdl%daddr) + zoom_begin_=zoom_begin__tmp + ENDIF + + IF (PRESENT(zoom_end_)) THEN + zoom_end__tmp=cxios_is_defined_axisgroup_zoom_end(axisgroup_hdl%daddr) + zoom_end_=zoom_end__tmp + ENDIF + + IF (PRESENT(zoom_size_)) THEN + zoom_size__tmp=cxios_is_defined_axisgroup_zoom_size(axisgroup_hdl%daddr) + zoom_size_=zoom_size__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_axisgroup_attr_hdl_) + +END MODULE iaxisgroup_attr diff --git a/src/interface/fortran_attr/icontext_attr.F90 b/src/interface/fortran_attr/icontext_attr.F90 new file mode 100644 index 0000000..6d6d4f0 --- /dev/null +++ b/src/interface/fortran_attr/icontext_attr.F90 @@ -0,0 +1,240 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE icontext_attr + USE, INTRINSIC :: ISO_C_BINDING + USE icontext + USE context_interface_attr + +CONTAINS + + SUBROUTINE xios(set_context_attr) & + ( context_id, calendar_type, output_dir, start_date, time_origin, timestep ) + + IMPLICIT NONE + TYPE(txios(context)) :: context_hdl + CHARACTER(LEN=*), INTENT(IN) ::context_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: calendar_type + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_dir + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: start_date + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_origin + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timestep + + CALL xios(get_context_handle)(context_id,context_hdl) + CALL xios(set_context_attr_hdl_) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + END SUBROUTINE xios(set_context_attr) + + SUBROUTINE xios(set_context_attr_hdl) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + IMPLICIT NONE + TYPE(txios(context)) , INTENT(IN) :: context_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: calendar_type + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_dir + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: start_date + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_origin + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timestep + + CALL xios(set_context_attr_hdl_) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + END SUBROUTINE xios(set_context_attr_hdl) + + SUBROUTINE xios(set_context_attr_hdl_) & + ( context_hdl, calendar_type_, output_dir_, start_date_, time_origin_, timestep_ ) + + IMPLICIT NONE + TYPE(txios(context)) , INTENT(IN) :: context_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: calendar_type_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_dir_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: start_date_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_origin_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timestep_ + + IF (PRESENT(calendar_type_)) THEN + CALL cxios_set_context_calendar_type(context_hdl%daddr, calendar_type_, len(calendar_type_)) + ENDIF + + IF (PRESENT(output_dir_)) THEN + CALL cxios_set_context_output_dir(context_hdl%daddr, output_dir_, len(output_dir_)) + ENDIF + + IF (PRESENT(start_date_)) THEN + CALL cxios_set_context_start_date(context_hdl%daddr, start_date_, len(start_date_)) + ENDIF + + IF (PRESENT(time_origin_)) THEN + CALL cxios_set_context_time_origin(context_hdl%daddr, time_origin_, len(time_origin_)) + ENDIF + + IF (PRESENT(timestep_)) THEN + CALL cxios_set_context_timestep(context_hdl%daddr, timestep_, len(timestep_)) + ENDIF + + + + END SUBROUTINE xios(set_context_attr_hdl_) + + SUBROUTINE xios(get_context_attr) & + ( context_id, calendar_type, output_dir, start_date, time_origin, timestep ) + + IMPLICIT NONE + TYPE(txios(context)) :: context_hdl + CHARACTER(LEN=*), INTENT(IN) ::context_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: calendar_type + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_dir + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: start_date + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_origin + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timestep + + CALL xios(get_context_handle)(context_id,context_hdl) + CALL xios(get_context_attr_hdl_) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + END SUBROUTINE xios(get_context_attr) + + SUBROUTINE xios(get_context_attr_hdl) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + IMPLICIT NONE + TYPE(txios(context)) , INTENT(IN) :: context_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: calendar_type + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_dir + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: start_date + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_origin + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timestep + + CALL xios(get_context_attr_hdl_) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + END SUBROUTINE xios(get_context_attr_hdl) + + SUBROUTINE xios(get_context_attr_hdl_) & + ( context_hdl, calendar_type_, output_dir_, start_date_, time_origin_, timestep_ ) + + IMPLICIT NONE + TYPE(txios(context)) , INTENT(IN) :: context_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: calendar_type_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_dir_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: start_date_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_origin_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timestep_ + + IF (PRESENT(calendar_type_)) THEN + CALL cxios_get_context_calendar_type(context_hdl%daddr, calendar_type_, len(calendar_type_)) + ENDIF + + IF (PRESENT(output_dir_)) THEN + CALL cxios_get_context_output_dir(context_hdl%daddr, output_dir_, len(output_dir_)) + ENDIF + + IF (PRESENT(start_date_)) THEN + CALL cxios_get_context_start_date(context_hdl%daddr, start_date_, len(start_date_)) + ENDIF + + IF (PRESENT(time_origin_)) THEN + CALL cxios_get_context_time_origin(context_hdl%daddr, time_origin_, len(time_origin_)) + ENDIF + + IF (PRESENT(timestep_)) THEN + CALL cxios_get_context_timestep(context_hdl%daddr, timestep_, len(timestep_)) + ENDIF + + + + END SUBROUTINE xios(get_context_attr_hdl_) + + SUBROUTINE xios(is_defined_context_attr) & + ( context_id, calendar_type, output_dir, start_date, time_origin, timestep ) + + IMPLICIT NONE + TYPE(txios(context)) :: context_hdl + CHARACTER(LEN=*), INTENT(IN) ::context_id + LOGICAL, OPTIONAL, INTENT(OUT) :: calendar_type + LOGICAL(KIND=C_BOOL) :: calendar_type_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_dir + LOGICAL(KIND=C_BOOL) :: output_dir_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: start_date + LOGICAL(KIND=C_BOOL) :: start_date_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: time_origin + LOGICAL(KIND=C_BOOL) :: time_origin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: timestep + LOGICAL(KIND=C_BOOL) :: timestep_tmp + + CALL xios(get_context_handle)(context_id,context_hdl) + CALL xios(is_defined_context_attr_hdl_) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + END SUBROUTINE xios(is_defined_context_attr) + + SUBROUTINE xios(is_defined_context_attr_hdl) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + IMPLICIT NONE + TYPE(txios(context)) , INTENT(IN) :: context_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: calendar_type + LOGICAL(KIND=C_BOOL) :: calendar_type_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_dir + LOGICAL(KIND=C_BOOL) :: output_dir_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: start_date + LOGICAL(KIND=C_BOOL) :: start_date_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: time_origin + LOGICAL(KIND=C_BOOL) :: time_origin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: timestep + LOGICAL(KIND=C_BOOL) :: timestep_tmp + + CALL xios(is_defined_context_attr_hdl_) & + ( context_hdl, calendar_type, output_dir, start_date, time_origin, timestep ) + + END SUBROUTINE xios(is_defined_context_attr_hdl) + + SUBROUTINE xios(is_defined_context_attr_hdl_) & + ( context_hdl, calendar_type_, output_dir_, start_date_, time_origin_, timestep_ ) + + IMPLICIT NONE + TYPE(txios(context)) , INTENT(IN) :: context_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: calendar_type_ + LOGICAL(KIND=C_BOOL) :: calendar_type__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_dir_ + LOGICAL(KIND=C_BOOL) :: output_dir__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: start_date_ + LOGICAL(KIND=C_BOOL) :: start_date__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: time_origin_ + LOGICAL(KIND=C_BOOL) :: time_origin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: timestep_ + LOGICAL(KIND=C_BOOL) :: timestep__tmp + + IF (PRESENT(calendar_type_)) THEN + calendar_type__tmp=cxios_is_defined_context_calendar_type(context_hdl%daddr) + calendar_type_=calendar_type__tmp + ENDIF + + IF (PRESENT(output_dir_)) THEN + output_dir__tmp=cxios_is_defined_context_output_dir(context_hdl%daddr) + output_dir_=output_dir__tmp + ENDIF + + IF (PRESENT(start_date_)) THEN + start_date__tmp=cxios_is_defined_context_start_date(context_hdl%daddr) + start_date_=start_date__tmp + ENDIF + + IF (PRESENT(time_origin_)) THEN + time_origin__tmp=cxios_is_defined_context_time_origin(context_hdl%daddr) + time_origin_=time_origin__tmp + ENDIF + + IF (PRESENT(timestep_)) THEN + timestep__tmp=cxios_is_defined_context_timestep(context_hdl%daddr) + timestep_=timestep__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_context_attr_hdl_) + +END MODULE icontext_attr diff --git a/src/interface/fortran_attr/idomain_attr.F90 b/src/interface/fortran_attr/idomain_attr.F90 new file mode 100644 index 0000000..9a4ca3c --- /dev/null +++ b/src/interface/fortran_attr/idomain_attr.F90 @@ -0,0 +1,1110 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE idomain_attr + USE, INTRINSIC :: ISO_C_BINDING + USE idomain + USE domain_interface_attr + +CONTAINS + + SUBROUTINE xios(set_domain_attr) & + ( domain_id, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domain)) :: domain_hdl + CHARACTER(LEN=*), INTENT(IN) ::domain_id + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: data_dim + INTEGER , OPTIONAL, INTENT(IN) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: data_n_index + INTEGER , OPTIONAL, INTENT(IN) :: data_ni + INTEGER , OPTIONAL, INTENT(IN) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_group_ref + INTEGER , OPTIONAL, INTENT(IN) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: ibegin + INTEGER , OPTIONAL, INTENT(IN) :: iend + INTEGER , OPTIONAL, INTENT(IN) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: jbegin + INTEGER , OPTIONAL, INTENT(IN) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + INTEGER , OPTIONAL, INTENT(IN) :: ni + INTEGER , OPTIONAL, INTENT(IN) :: ni_glo + INTEGER , OPTIONAL, INTENT(IN) :: nj + INTEGER , OPTIONAL, INTENT(IN) :: nj_glo + INTEGER , OPTIONAL, INTENT(IN) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_loc + + CALL xios(get_domain_handle)(domain_id,domain_hdl) + CALL xios(set_domain_attr_hdl_) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + END SUBROUTINE xios(set_domain_attr) + + SUBROUTINE xios(set_domain_attr_hdl) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domain)) , INTENT(IN) :: domain_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: data_dim + INTEGER , OPTIONAL, INTENT(IN) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: data_n_index + INTEGER , OPTIONAL, INTENT(IN) :: data_ni + INTEGER , OPTIONAL, INTENT(IN) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_group_ref + INTEGER , OPTIONAL, INTENT(IN) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: ibegin + INTEGER , OPTIONAL, INTENT(IN) :: iend + INTEGER , OPTIONAL, INTENT(IN) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: jbegin + INTEGER , OPTIONAL, INTENT(IN) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + INTEGER , OPTIONAL, INTENT(IN) :: ni + INTEGER , OPTIONAL, INTENT(IN) :: ni_glo + INTEGER , OPTIONAL, INTENT(IN) :: nj + INTEGER , OPTIONAL, INTENT(IN) :: nj_glo + INTEGER , OPTIONAL, INTENT(IN) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_loc + + CALL xios(set_domain_attr_hdl_) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + END SUBROUTINE xios(set_domain_attr_hdl) + + SUBROUTINE xios(set_domain_attr_hdl_) & + ( domain_hdl, bounds_lat_, bounds_lon_, data_dim_, data_i_index_, data_ibegin_, data_j_index_ & + , data_jbegin_, data_n_index_, data_ni_, data_nj_, domain_group_ref_, i_index_, ibegin_, iend_ & + , j_index_, jbegin_, jend_, latvalue_, long_name_, lonvalue_, mask_, name_, ni_, ni_glo_, nj_ & + , nj_glo_, nvertex_, standard_name_, type_, zoom_ibegin_, zoom_ibegin_loc_, zoom_jbegin_, zoom_jbegin_loc_ & + , zoom_ni_, zoom_ni_loc_, zoom_nj_, zoom_nj_loc_ ) + + IMPLICIT NONE + TYPE(txios(domain)) , INTENT(IN) :: domain_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat_(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon_(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: data_dim_ + INTEGER , OPTIONAL, INTENT(IN) :: data_i_index_(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_ibegin_ + INTEGER , OPTIONAL, INTENT(IN) :: data_j_index_(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_jbegin_ + INTEGER , OPTIONAL, INTENT(IN) :: data_n_index_ + INTEGER , OPTIONAL, INTENT(IN) :: data_ni_ + INTEGER , OPTIONAL, INTENT(IN) :: data_nj_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_group_ref_ + INTEGER , OPTIONAL, INTENT(IN) :: i_index_(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: ibegin_ + INTEGER , OPTIONAL, INTENT(IN) :: iend_ + INTEGER , OPTIONAL, INTENT(IN) :: j_index_(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: jbegin_ + INTEGER , OPTIONAL, INTENT(IN) :: jend_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue_(:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue_(:) + LOGICAL , OPTIONAL, INTENT(IN) :: mask_(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + INTEGER , OPTIONAL, INTENT(IN) :: ni_ + INTEGER , OPTIONAL, INTENT(IN) :: ni_glo_ + INTEGER , OPTIONAL, INTENT(IN) :: nj_ + INTEGER , OPTIONAL, INTENT(IN) :: nj_glo_ + INTEGER , OPTIONAL, INTENT(IN) :: nvertex_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_loc_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_loc_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_loc_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_loc_ + + IF (PRESENT(bounds_lat_)) THEN + CALL cxios_set_domain_bounds_lat(domain_hdl%daddr, bounds_lat_,size(bounds_lat_,1),size(bounds_lat_,2)) + ENDIF + + IF (PRESENT(bounds_lon_)) THEN + CALL cxios_set_domain_bounds_lon(domain_hdl%daddr, bounds_lon_,size(bounds_lon_,1),size(bounds_lon_,2)) + ENDIF + + IF (PRESENT(data_dim_)) THEN + CALL cxios_set_domain_data_dim(domain_hdl%daddr, data_dim_) + ENDIF + + IF (PRESENT(data_i_index_)) THEN + CALL cxios_set_domain_data_i_index(domain_hdl%daddr, data_i_index_,size(data_i_index_,1)) + ENDIF + + IF (PRESENT(data_ibegin_)) THEN + CALL cxios_set_domain_data_ibegin(domain_hdl%daddr, data_ibegin_) + ENDIF + + IF (PRESENT(data_j_index_)) THEN + CALL cxios_set_domain_data_j_index(domain_hdl%daddr, data_j_index_,size(data_j_index_,1)) + ENDIF + + IF (PRESENT(data_jbegin_)) THEN + CALL cxios_set_domain_data_jbegin(domain_hdl%daddr, data_jbegin_) + ENDIF + + IF (PRESENT(data_n_index_)) THEN + CALL cxios_set_domain_data_n_index(domain_hdl%daddr, data_n_index_) + ENDIF + + IF (PRESENT(data_ni_)) THEN + CALL cxios_set_domain_data_ni(domain_hdl%daddr, data_ni_) + ENDIF + + IF (PRESENT(data_nj_)) THEN + CALL cxios_set_domain_data_nj(domain_hdl%daddr, data_nj_) + ENDIF + + IF (PRESENT(domain_group_ref_)) THEN + CALL cxios_set_domain_domain_group_ref(domain_hdl%daddr, domain_group_ref_, len(domain_group_ref_)) + ENDIF + + IF (PRESENT(i_index_)) THEN + CALL cxios_set_domain_i_index(domain_hdl%daddr, i_index_,size(i_index_,1),size(i_index_,2)) + ENDIF + + IF (PRESENT(ibegin_)) THEN + CALL cxios_set_domain_ibegin(domain_hdl%daddr, ibegin_) + ENDIF + + IF (PRESENT(iend_)) THEN + CALL cxios_set_domain_iend(domain_hdl%daddr, iend_) + ENDIF + + IF (PRESENT(j_index_)) THEN + CALL cxios_set_domain_j_index(domain_hdl%daddr, j_index_,size(j_index_,1),size(j_index_,2)) + ENDIF + + IF (PRESENT(jbegin_)) THEN + CALL cxios_set_domain_jbegin(domain_hdl%daddr, jbegin_) + ENDIF + + IF (PRESENT(jend_)) THEN + CALL cxios_set_domain_jend(domain_hdl%daddr, jend_) + ENDIF + + IF (PRESENT(latvalue_)) THEN + CALL cxios_set_domain_latvalue(domain_hdl%daddr, latvalue_,size(latvalue_,1)) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_set_domain_long_name(domain_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(lonvalue_)) THEN + CALL cxios_set_domain_lonvalue(domain_hdl%daddr, lonvalue_,size(lonvalue_,1)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2))) + mask__tmp=mask_ + CALL cxios_set_domain_mask(domain_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_domain_name(domain_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(ni_)) THEN + CALL cxios_set_domain_ni(domain_hdl%daddr, ni_) + ENDIF + + IF (PRESENT(ni_glo_)) THEN + CALL cxios_set_domain_ni_glo(domain_hdl%daddr, ni_glo_) + ENDIF + + IF (PRESENT(nj_)) THEN + CALL cxios_set_domain_nj(domain_hdl%daddr, nj_) + ENDIF + + IF (PRESENT(nj_glo_)) THEN + CALL cxios_set_domain_nj_glo(domain_hdl%daddr, nj_glo_) + ENDIF + + IF (PRESENT(nvertex_)) THEN + CALL cxios_set_domain_nvertex(domain_hdl%daddr, nvertex_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_set_domain_standard_name(domain_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_set_domain_type(domain_hdl%daddr, type_, len(type_)) + ENDIF + + IF (PRESENT(zoom_ibegin_)) THEN + CALL cxios_set_domain_zoom_ibegin(domain_hdl%daddr, zoom_ibegin_) + ENDIF + + IF (PRESENT(zoom_ibegin_loc_)) THEN + CALL cxios_set_domain_zoom_ibegin_loc(domain_hdl%daddr, zoom_ibegin_loc_) + ENDIF + + IF (PRESENT(zoom_jbegin_)) THEN + CALL cxios_set_domain_zoom_jbegin(domain_hdl%daddr, zoom_jbegin_) + ENDIF + + IF (PRESENT(zoom_jbegin_loc_)) THEN + CALL cxios_set_domain_zoom_jbegin_loc(domain_hdl%daddr, zoom_jbegin_loc_) + ENDIF + + IF (PRESENT(zoom_ni_)) THEN + CALL cxios_set_domain_zoom_ni(domain_hdl%daddr, zoom_ni_) + ENDIF + + IF (PRESENT(zoom_ni_loc_)) THEN + CALL cxios_set_domain_zoom_ni_loc(domain_hdl%daddr, zoom_ni_loc_) + ENDIF + + IF (PRESENT(zoom_nj_)) THEN + CALL cxios_set_domain_zoom_nj(domain_hdl%daddr, zoom_nj_) + ENDIF + + IF (PRESENT(zoom_nj_loc_)) THEN + CALL cxios_set_domain_zoom_nj_loc(domain_hdl%daddr, zoom_nj_loc_) + ENDIF + + + + END SUBROUTINE xios(set_domain_attr_hdl_) + + SUBROUTINE xios(get_domain_attr) & + ( domain_id, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domain)) :: domain_hdl + CHARACTER(LEN=*), INTENT(IN) ::domain_id + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_dim + INTEGER , OPTIONAL, INTENT(OUT) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_n_index + INTEGER , OPTIONAL, INTENT(OUT) :: data_ni + INTEGER , OPTIONAL, INTENT(OUT) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: iend + INTEGER , OPTIONAL, INTENT(OUT) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + INTEGER , OPTIONAL, INTENT(OUT) :: ni + INTEGER , OPTIONAL, INTENT(OUT) :: ni_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nj + INTEGER , OPTIONAL, INTENT(OUT) :: nj_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_loc + + CALL xios(get_domain_handle)(domain_id,domain_hdl) + CALL xios(get_domain_attr_hdl_) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + END SUBROUTINE xios(get_domain_attr) + + SUBROUTINE xios(get_domain_attr_hdl) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domain)) , INTENT(IN) :: domain_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_dim + INTEGER , OPTIONAL, INTENT(OUT) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_n_index + INTEGER , OPTIONAL, INTENT(OUT) :: data_ni + INTEGER , OPTIONAL, INTENT(OUT) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: iend + INTEGER , OPTIONAL, INTENT(OUT) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + INTEGER , OPTIONAL, INTENT(OUT) :: ni + INTEGER , OPTIONAL, INTENT(OUT) :: ni_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nj + INTEGER , OPTIONAL, INTENT(OUT) :: nj_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_loc + + CALL xios(get_domain_attr_hdl_) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + END SUBROUTINE xios(get_domain_attr_hdl) + + SUBROUTINE xios(get_domain_attr_hdl_) & + ( domain_hdl, bounds_lat_, bounds_lon_, data_dim_, data_i_index_, data_ibegin_, data_j_index_ & + , data_jbegin_, data_n_index_, data_ni_, data_nj_, domain_group_ref_, i_index_, ibegin_, iend_ & + , j_index_, jbegin_, jend_, latvalue_, long_name_, lonvalue_, mask_, name_, ni_, ni_glo_, nj_ & + , nj_glo_, nvertex_, standard_name_, type_, zoom_ibegin_, zoom_ibegin_loc_, zoom_jbegin_, zoom_jbegin_loc_ & + , zoom_ni_, zoom_ni_loc_, zoom_nj_, zoom_nj_loc_ ) + + IMPLICIT NONE + TYPE(txios(domain)) , INTENT(IN) :: domain_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lat_(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lon_(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_dim_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_i_index_(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_ibegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_j_index_(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_jbegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_n_index_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_ni_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_nj_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_group_ref_ + INTEGER , OPTIONAL, INTENT(OUT) :: i_index_(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: ibegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: iend_ + INTEGER , OPTIONAL, INTENT(OUT) :: j_index_(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: jbegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: jend_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: latvalue_(:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: lonvalue_(:) + LOGICAL , OPTIONAL, INTENT(OUT) :: mask_(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + INTEGER , OPTIONAL, INTENT(OUT) :: ni_ + INTEGER , OPTIONAL, INTENT(OUT) :: ni_glo_ + INTEGER , OPTIONAL, INTENT(OUT) :: nj_ + INTEGER , OPTIONAL, INTENT(OUT) :: nj_glo_ + INTEGER , OPTIONAL, INTENT(OUT) :: nvertex_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_loc_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_loc_ + + IF (PRESENT(bounds_lat_)) THEN + CALL cxios_get_domain_bounds_lat(domain_hdl%daddr, bounds_lat_,size(bounds_lat_,1),size(bounds_lat_,2)) + ENDIF + + IF (PRESENT(bounds_lon_)) THEN + CALL cxios_get_domain_bounds_lon(domain_hdl%daddr, bounds_lon_,size(bounds_lon_,1),size(bounds_lon_,2)) + ENDIF + + IF (PRESENT(data_dim_)) THEN + CALL cxios_get_domain_data_dim(domain_hdl%daddr, data_dim_) + ENDIF + + IF (PRESENT(data_i_index_)) THEN + CALL cxios_get_domain_data_i_index(domain_hdl%daddr, data_i_index_,size(data_i_index_,1)) + ENDIF + + IF (PRESENT(data_ibegin_)) THEN + CALL cxios_get_domain_data_ibegin(domain_hdl%daddr, data_ibegin_) + ENDIF + + IF (PRESENT(data_j_index_)) THEN + CALL cxios_get_domain_data_j_index(domain_hdl%daddr, data_j_index_,size(data_j_index_,1)) + ENDIF + + IF (PRESENT(data_jbegin_)) THEN + CALL cxios_get_domain_data_jbegin(domain_hdl%daddr, data_jbegin_) + ENDIF + + IF (PRESENT(data_n_index_)) THEN + CALL cxios_get_domain_data_n_index(domain_hdl%daddr, data_n_index_) + ENDIF + + IF (PRESENT(data_ni_)) THEN + CALL cxios_get_domain_data_ni(domain_hdl%daddr, data_ni_) + ENDIF + + IF (PRESENT(data_nj_)) THEN + CALL cxios_get_domain_data_nj(domain_hdl%daddr, data_nj_) + ENDIF + + IF (PRESENT(domain_group_ref_)) THEN + CALL cxios_get_domain_domain_group_ref(domain_hdl%daddr, domain_group_ref_, len(domain_group_ref_)) + ENDIF + + IF (PRESENT(i_index_)) THEN + CALL cxios_get_domain_i_index(domain_hdl%daddr, i_index_,size(i_index_,1),size(i_index_,2)) + ENDIF + + IF (PRESENT(ibegin_)) THEN + CALL cxios_get_domain_ibegin(domain_hdl%daddr, ibegin_) + ENDIF + + IF (PRESENT(iend_)) THEN + CALL cxios_get_domain_iend(domain_hdl%daddr, iend_) + ENDIF + + IF (PRESENT(j_index_)) THEN + CALL cxios_get_domain_j_index(domain_hdl%daddr, j_index_,size(j_index_,1),size(j_index_,2)) + ENDIF + + IF (PRESENT(jbegin_)) THEN + CALL cxios_get_domain_jbegin(domain_hdl%daddr, jbegin_) + ENDIF + + IF (PRESENT(jend_)) THEN + CALL cxios_get_domain_jend(domain_hdl%daddr, jend_) + ENDIF + + IF (PRESENT(latvalue_)) THEN + CALL cxios_get_domain_latvalue(domain_hdl%daddr, latvalue_,size(latvalue_,1)) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_get_domain_long_name(domain_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(lonvalue_)) THEN + CALL cxios_get_domain_lonvalue(domain_hdl%daddr, lonvalue_,size(lonvalue_,1)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2))) + CALL cxios_get_domain_mask(domain_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2)) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_domain_name(domain_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(ni_)) THEN + CALL cxios_get_domain_ni(domain_hdl%daddr, ni_) + ENDIF + + IF (PRESENT(ni_glo_)) THEN + CALL cxios_get_domain_ni_glo(domain_hdl%daddr, ni_glo_) + ENDIF + + IF (PRESENT(nj_)) THEN + CALL cxios_get_domain_nj(domain_hdl%daddr, nj_) + ENDIF + + IF (PRESENT(nj_glo_)) THEN + CALL cxios_get_domain_nj_glo(domain_hdl%daddr, nj_glo_) + ENDIF + + IF (PRESENT(nvertex_)) THEN + CALL cxios_get_domain_nvertex(domain_hdl%daddr, nvertex_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_get_domain_standard_name(domain_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_get_domain_type(domain_hdl%daddr, type_, len(type_)) + ENDIF + + IF (PRESENT(zoom_ibegin_)) THEN + CALL cxios_get_domain_zoom_ibegin(domain_hdl%daddr, zoom_ibegin_) + ENDIF + + IF (PRESENT(zoom_ibegin_loc_)) THEN + CALL cxios_get_domain_zoom_ibegin_loc(domain_hdl%daddr, zoom_ibegin_loc_) + ENDIF + + IF (PRESENT(zoom_jbegin_)) THEN + CALL cxios_get_domain_zoom_jbegin(domain_hdl%daddr, zoom_jbegin_) + ENDIF + + IF (PRESENT(zoom_jbegin_loc_)) THEN + CALL cxios_get_domain_zoom_jbegin_loc(domain_hdl%daddr, zoom_jbegin_loc_) + ENDIF + + IF (PRESENT(zoom_ni_)) THEN + CALL cxios_get_domain_zoom_ni(domain_hdl%daddr, zoom_ni_) + ENDIF + + IF (PRESENT(zoom_ni_loc_)) THEN + CALL cxios_get_domain_zoom_ni_loc(domain_hdl%daddr, zoom_ni_loc_) + ENDIF + + IF (PRESENT(zoom_nj_)) THEN + CALL cxios_get_domain_zoom_nj(domain_hdl%daddr, zoom_nj_) + ENDIF + + IF (PRESENT(zoom_nj_loc_)) THEN + CALL cxios_get_domain_zoom_nj_loc(domain_hdl%daddr, zoom_nj_loc_) + ENDIF + + + + END SUBROUTINE xios(get_domain_attr_hdl_) + + SUBROUTINE xios(is_defined_domain_attr) & + ( domain_id, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domain)) :: domain_hdl + CHARACTER(LEN=*), INTENT(IN) ::domain_id + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat + LOGICAL(KIND=C_BOOL) :: bounds_lat_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon + LOGICAL(KIND=C_BOOL) :: bounds_lon_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim + LOGICAL(KIND=C_BOOL) :: data_dim_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index + LOGICAL(KIND=C_BOOL) :: data_i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin + LOGICAL(KIND=C_BOOL) :: data_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index + LOGICAL(KIND=C_BOOL) :: data_j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin + LOGICAL(KIND=C_BOOL) :: data_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_n_index + LOGICAL(KIND=C_BOOL) :: data_n_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni + LOGICAL(KIND=C_BOOL) :: data_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj + LOGICAL(KIND=C_BOOL) :: data_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_group_ref + LOGICAL(KIND=C_BOOL) :: domain_group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: i_index + LOGICAL(KIND=C_BOOL) :: i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin + LOGICAL(KIND=C_BOOL) :: ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: iend + LOGICAL(KIND=C_BOOL) :: iend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: j_index + LOGICAL(KIND=C_BOOL) :: j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin + LOGICAL(KIND=C_BOOL) :: jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jend + LOGICAL(KIND=C_BOOL) :: jend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue + LOGICAL(KIND=C_BOOL) :: latvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue + LOGICAL(KIND=C_BOOL) :: lonvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni + LOGICAL(KIND=C_BOOL) :: ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo + LOGICAL(KIND=C_BOOL) :: ni_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj + LOGICAL(KIND=C_BOOL) :: nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo + LOGICAL(KIND=C_BOOL) :: nj_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex + LOGICAL(KIND=C_BOOL) :: nvertex_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni + LOGICAL(KIND=C_BOOL) :: zoom_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_loc + LOGICAL(KIND=C_BOOL) :: zoom_ni_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj + LOGICAL(KIND=C_BOOL) :: zoom_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_loc + LOGICAL(KIND=C_BOOL) :: zoom_nj_loc_tmp + + CALL xios(get_domain_handle)(domain_id,domain_hdl) + CALL xios(is_defined_domain_attr_hdl_) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + END SUBROUTINE xios(is_defined_domain_attr) + + SUBROUTINE xios(is_defined_domain_attr_hdl) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domain)) , INTENT(IN) :: domain_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat + LOGICAL(KIND=C_BOOL) :: bounds_lat_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon + LOGICAL(KIND=C_BOOL) :: bounds_lon_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim + LOGICAL(KIND=C_BOOL) :: data_dim_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index + LOGICAL(KIND=C_BOOL) :: data_i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin + LOGICAL(KIND=C_BOOL) :: data_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index + LOGICAL(KIND=C_BOOL) :: data_j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin + LOGICAL(KIND=C_BOOL) :: data_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_n_index + LOGICAL(KIND=C_BOOL) :: data_n_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni + LOGICAL(KIND=C_BOOL) :: data_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj + LOGICAL(KIND=C_BOOL) :: data_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_group_ref + LOGICAL(KIND=C_BOOL) :: domain_group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: i_index + LOGICAL(KIND=C_BOOL) :: i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin + LOGICAL(KIND=C_BOOL) :: ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: iend + LOGICAL(KIND=C_BOOL) :: iend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: j_index + LOGICAL(KIND=C_BOOL) :: j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin + LOGICAL(KIND=C_BOOL) :: jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jend + LOGICAL(KIND=C_BOOL) :: jend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue + LOGICAL(KIND=C_BOOL) :: latvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue + LOGICAL(KIND=C_BOOL) :: lonvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni + LOGICAL(KIND=C_BOOL) :: ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo + LOGICAL(KIND=C_BOOL) :: ni_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj + LOGICAL(KIND=C_BOOL) :: nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo + LOGICAL(KIND=C_BOOL) :: nj_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex + LOGICAL(KIND=C_BOOL) :: nvertex_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni + LOGICAL(KIND=C_BOOL) :: zoom_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_loc + LOGICAL(KIND=C_BOOL) :: zoom_ni_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj + LOGICAL(KIND=C_BOOL) :: zoom_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_loc + LOGICAL(KIND=C_BOOL) :: zoom_nj_loc_tmp + + CALL xios(is_defined_domain_attr_hdl_) & + ( domain_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index, data_jbegin & + , data_n_index, data_ni, data_nj, domain_group_ref, i_index, ibegin, iend, j_index, jbegin, jend & + , latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name & + , type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni, zoom_ni_loc, zoom_nj & + , zoom_nj_loc ) + + END SUBROUTINE xios(is_defined_domain_attr_hdl) + + SUBROUTINE xios(is_defined_domain_attr_hdl_) & + ( domain_hdl, bounds_lat_, bounds_lon_, data_dim_, data_i_index_, data_ibegin_, data_j_index_ & + , data_jbegin_, data_n_index_, data_ni_, data_nj_, domain_group_ref_, i_index_, ibegin_, iend_ & + , j_index_, jbegin_, jend_, latvalue_, long_name_, lonvalue_, mask_, name_, ni_, ni_glo_, nj_ & + , nj_glo_, nvertex_, standard_name_, type_, zoom_ibegin_, zoom_ibegin_loc_, zoom_jbegin_, zoom_jbegin_loc_ & + , zoom_ni_, zoom_ni_loc_, zoom_nj_, zoom_nj_loc_ ) + + IMPLICIT NONE + TYPE(txios(domain)) , INTENT(IN) :: domain_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_ + LOGICAL(KIND=C_BOOL) :: bounds_lat__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_ + LOGICAL(KIND=C_BOOL) :: bounds_lon__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim_ + LOGICAL(KIND=C_BOOL) :: data_dim__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index_ + LOGICAL(KIND=C_BOOL) :: data_i_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin_ + LOGICAL(KIND=C_BOOL) :: data_ibegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index_ + LOGICAL(KIND=C_BOOL) :: data_j_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin_ + LOGICAL(KIND=C_BOOL) :: data_jbegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_n_index_ + LOGICAL(KIND=C_BOOL) :: data_n_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni_ + LOGICAL(KIND=C_BOOL) :: data_ni__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj_ + LOGICAL(KIND=C_BOOL) :: data_nj__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_group_ref_ + LOGICAL(KIND=C_BOOL) :: domain_group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: i_index_ + LOGICAL(KIND=C_BOOL) :: i_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin_ + LOGICAL(KIND=C_BOOL) :: ibegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: iend_ + LOGICAL(KIND=C_BOOL) :: iend__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: j_index_ + LOGICAL(KIND=C_BOOL) :: j_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin_ + LOGICAL(KIND=C_BOOL) :: jbegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jend_ + LOGICAL(KIND=C_BOOL) :: jend__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue_ + LOGICAL(KIND=C_BOOL) :: latvalue__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_ + LOGICAL(KIND=C_BOOL) :: long_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue_ + LOGICAL(KIND=C_BOOL) :: lonvalue__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask_ + LOGICAL(KIND=C_BOOL) :: mask__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_ + LOGICAL(KIND=C_BOOL) :: ni__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo_ + LOGICAL(KIND=C_BOOL) :: ni_glo__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_ + LOGICAL(KIND=C_BOOL) :: nj__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo_ + LOGICAL(KIND=C_BOOL) :: nj_glo__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex_ + LOGICAL(KIND=C_BOOL) :: nvertex__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_ + LOGICAL(KIND=C_BOOL) :: standard_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type_ + LOGICAL(KIND=C_BOOL) :: type__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_ + LOGICAL(KIND=C_BOOL) :: zoom_ibegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_loc__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_ + LOGICAL(KIND=C_BOOL) :: zoom_jbegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_loc__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_ + LOGICAL(KIND=C_BOOL) :: zoom_ni__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_ni_loc__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_ + LOGICAL(KIND=C_BOOL) :: zoom_nj__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_nj_loc__tmp + + IF (PRESENT(bounds_lat_)) THEN + bounds_lat__tmp=cxios_is_defined_domain_bounds_lat(domain_hdl%daddr) + bounds_lat_=bounds_lat__tmp + ENDIF + + IF (PRESENT(bounds_lon_)) THEN + bounds_lon__tmp=cxios_is_defined_domain_bounds_lon(domain_hdl%daddr) + bounds_lon_=bounds_lon__tmp + ENDIF + + IF (PRESENT(data_dim_)) THEN + data_dim__tmp=cxios_is_defined_domain_data_dim(domain_hdl%daddr) + data_dim_=data_dim__tmp + ENDIF + + IF (PRESENT(data_i_index_)) THEN + data_i_index__tmp=cxios_is_defined_domain_data_i_index(domain_hdl%daddr) + data_i_index_=data_i_index__tmp + ENDIF + + IF (PRESENT(data_ibegin_)) THEN + data_ibegin__tmp=cxios_is_defined_domain_data_ibegin(domain_hdl%daddr) + data_ibegin_=data_ibegin__tmp + ENDIF + + IF (PRESENT(data_j_index_)) THEN + data_j_index__tmp=cxios_is_defined_domain_data_j_index(domain_hdl%daddr) + data_j_index_=data_j_index__tmp + ENDIF + + IF (PRESENT(data_jbegin_)) THEN + data_jbegin__tmp=cxios_is_defined_domain_data_jbegin(domain_hdl%daddr) + data_jbegin_=data_jbegin__tmp + ENDIF + + IF (PRESENT(data_n_index_)) THEN + data_n_index__tmp=cxios_is_defined_domain_data_n_index(domain_hdl%daddr) + data_n_index_=data_n_index__tmp + ENDIF + + IF (PRESENT(data_ni_)) THEN + data_ni__tmp=cxios_is_defined_domain_data_ni(domain_hdl%daddr) + data_ni_=data_ni__tmp + ENDIF + + IF (PRESENT(data_nj_)) THEN + data_nj__tmp=cxios_is_defined_domain_data_nj(domain_hdl%daddr) + data_nj_=data_nj__tmp + ENDIF + + IF (PRESENT(domain_group_ref_)) THEN + domain_group_ref__tmp=cxios_is_defined_domain_domain_group_ref(domain_hdl%daddr) + domain_group_ref_=domain_group_ref__tmp + ENDIF + + IF (PRESENT(i_index_)) THEN + i_index__tmp=cxios_is_defined_domain_i_index(domain_hdl%daddr) + i_index_=i_index__tmp + ENDIF + + IF (PRESENT(ibegin_)) THEN + ibegin__tmp=cxios_is_defined_domain_ibegin(domain_hdl%daddr) + ibegin_=ibegin__tmp + ENDIF + + IF (PRESENT(iend_)) THEN + iend__tmp=cxios_is_defined_domain_iend(domain_hdl%daddr) + iend_=iend__tmp + ENDIF + + IF (PRESENT(j_index_)) THEN + j_index__tmp=cxios_is_defined_domain_j_index(domain_hdl%daddr) + j_index_=j_index__tmp + ENDIF + + IF (PRESENT(jbegin_)) THEN + jbegin__tmp=cxios_is_defined_domain_jbegin(domain_hdl%daddr) + jbegin_=jbegin__tmp + ENDIF + + IF (PRESENT(jend_)) THEN + jend__tmp=cxios_is_defined_domain_jend(domain_hdl%daddr) + jend_=jend__tmp + ENDIF + + IF (PRESENT(latvalue_)) THEN + latvalue__tmp=cxios_is_defined_domain_latvalue(domain_hdl%daddr) + latvalue_=latvalue__tmp + ENDIF + + IF (PRESENT(long_name_)) THEN + long_name__tmp=cxios_is_defined_domain_long_name(domain_hdl%daddr) + long_name_=long_name__tmp + ENDIF + + IF (PRESENT(lonvalue_)) THEN + lonvalue__tmp=cxios_is_defined_domain_lonvalue(domain_hdl%daddr) + lonvalue_=lonvalue__tmp + ENDIF + + IF (PRESENT(mask_)) THEN + mask__tmp=cxios_is_defined_domain_mask(domain_hdl%daddr) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_domain_name(domain_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(ni_)) THEN + ni__tmp=cxios_is_defined_domain_ni(domain_hdl%daddr) + ni_=ni__tmp + ENDIF + + IF (PRESENT(ni_glo_)) THEN + ni_glo__tmp=cxios_is_defined_domain_ni_glo(domain_hdl%daddr) + ni_glo_=ni_glo__tmp + ENDIF + + IF (PRESENT(nj_)) THEN + nj__tmp=cxios_is_defined_domain_nj(domain_hdl%daddr) + nj_=nj__tmp + ENDIF + + IF (PRESENT(nj_glo_)) THEN + nj_glo__tmp=cxios_is_defined_domain_nj_glo(domain_hdl%daddr) + nj_glo_=nj_glo__tmp + ENDIF + + IF (PRESENT(nvertex_)) THEN + nvertex__tmp=cxios_is_defined_domain_nvertex(domain_hdl%daddr) + nvertex_=nvertex__tmp + ENDIF + + IF (PRESENT(standard_name_)) THEN + standard_name__tmp=cxios_is_defined_domain_standard_name(domain_hdl%daddr) + standard_name_=standard_name__tmp + ENDIF + + IF (PRESENT(type_)) THEN + type__tmp=cxios_is_defined_domain_type(domain_hdl%daddr) + type_=type__tmp + ENDIF + + IF (PRESENT(zoom_ibegin_)) THEN + zoom_ibegin__tmp=cxios_is_defined_domain_zoom_ibegin(domain_hdl%daddr) + zoom_ibegin_=zoom_ibegin__tmp + ENDIF + + IF (PRESENT(zoom_ibegin_loc_)) THEN + zoom_ibegin_loc__tmp=cxios_is_defined_domain_zoom_ibegin_loc(domain_hdl%daddr) + zoom_ibegin_loc_=zoom_ibegin_loc__tmp + ENDIF + + IF (PRESENT(zoom_jbegin_)) THEN + zoom_jbegin__tmp=cxios_is_defined_domain_zoom_jbegin(domain_hdl%daddr) + zoom_jbegin_=zoom_jbegin__tmp + ENDIF + + IF (PRESENT(zoom_jbegin_loc_)) THEN + zoom_jbegin_loc__tmp=cxios_is_defined_domain_zoom_jbegin_loc(domain_hdl%daddr) + zoom_jbegin_loc_=zoom_jbegin_loc__tmp + ENDIF + + IF (PRESENT(zoom_ni_)) THEN + zoom_ni__tmp=cxios_is_defined_domain_zoom_ni(domain_hdl%daddr) + zoom_ni_=zoom_ni__tmp + ENDIF + + IF (PRESENT(zoom_ni_loc_)) THEN + zoom_ni_loc__tmp=cxios_is_defined_domain_zoom_ni_loc(domain_hdl%daddr) + zoom_ni_loc_=zoom_ni_loc__tmp + ENDIF + + IF (PRESENT(zoom_nj_)) THEN + zoom_nj__tmp=cxios_is_defined_domain_zoom_nj(domain_hdl%daddr) + zoom_nj_=zoom_nj__tmp + ENDIF + + IF (PRESENT(zoom_nj_loc_)) THEN + zoom_nj_loc__tmp=cxios_is_defined_domain_zoom_nj_loc(domain_hdl%daddr) + zoom_nj_loc_=zoom_nj_loc__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_domain_attr_hdl_) + +END MODULE idomain_attr diff --git a/src/interface/fortran_attr/idomaingroup_attr.F90 b/src/interface/fortran_attr/idomaingroup_attr.F90 new file mode 100644 index 0000000..a95f197 --- /dev/null +++ b/src/interface/fortran_attr/idomaingroup_attr.F90 @@ -0,0 +1,1135 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE idomaingroup_attr + USE, INTRINSIC :: ISO_C_BINDING + USE idomain + USE domaingroup_interface_attr + +CONTAINS + + SUBROUTINE xios(set_domaingroup_attr) & + ( domaingroup_id, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) :: domaingroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::domaingroup_id + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: data_dim + INTEGER , OPTIONAL, INTENT(IN) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: data_n_index + INTEGER , OPTIONAL, INTENT(IN) :: data_ni + INTEGER , OPTIONAL, INTENT(IN) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + INTEGER , OPTIONAL, INTENT(IN) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: ibegin + INTEGER , OPTIONAL, INTENT(IN) :: iend + INTEGER , OPTIONAL, INTENT(IN) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: jbegin + INTEGER , OPTIONAL, INTENT(IN) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + INTEGER , OPTIONAL, INTENT(IN) :: ni + INTEGER , OPTIONAL, INTENT(IN) :: ni_glo + INTEGER , OPTIONAL, INTENT(IN) :: nj + INTEGER , OPTIONAL, INTENT(IN) :: nj_glo + INTEGER , OPTIONAL, INTENT(IN) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_loc + + CALL xios(get_domaingroup_handle)(domaingroup_id,domaingroup_hdl) + CALL xios(set_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + END SUBROUTINE xios(set_domaingroup_attr) + + SUBROUTINE xios(set_domaingroup_attr_hdl) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) , INTENT(IN) :: domaingroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: data_dim + INTEGER , OPTIONAL, INTENT(IN) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: data_n_index + INTEGER , OPTIONAL, INTENT(IN) :: data_ni + INTEGER , OPTIONAL, INTENT(IN) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + INTEGER , OPTIONAL, INTENT(IN) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: ibegin + INTEGER , OPTIONAL, INTENT(IN) :: iend + INTEGER , OPTIONAL, INTENT(IN) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: jbegin + INTEGER , OPTIONAL, INTENT(IN) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + INTEGER , OPTIONAL, INTENT(IN) :: ni + INTEGER , OPTIONAL, INTENT(IN) :: ni_glo + INTEGER , OPTIONAL, INTENT(IN) :: nj + INTEGER , OPTIONAL, INTENT(IN) :: nj_glo + INTEGER , OPTIONAL, INTENT(IN) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_loc + + CALL xios(set_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + END SUBROUTINE xios(set_domaingroup_attr_hdl) + + SUBROUTINE xios(set_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat_, bounds_lon_, data_dim_, data_i_index_, data_ibegin_, data_j_index_ & + , data_jbegin_, data_n_index_, data_ni_, data_nj_, domain_group_ref_, group_ref_, i_index_, ibegin_ & + , iend_, j_index_, jbegin_, jend_, latvalue_, long_name_, lonvalue_, mask_, name_, ni_, ni_glo_ & + , nj_, nj_glo_, nvertex_, standard_name_, type_, zoom_ibegin_, zoom_ibegin_loc_, zoom_jbegin_ & + , zoom_jbegin_loc_, zoom_ni_, zoom_ni_loc_, zoom_nj_, zoom_nj_loc_ ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) , INTENT(IN) :: domaingroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lat_(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: bounds_lon_(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: data_dim_ + INTEGER , OPTIONAL, INTENT(IN) :: data_i_index_(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_ibegin_ + INTEGER , OPTIONAL, INTENT(IN) :: data_j_index_(:) + INTEGER , OPTIONAL, INTENT(IN) :: data_jbegin_ + INTEGER , OPTIONAL, INTENT(IN) :: data_n_index_ + INTEGER , OPTIONAL, INTENT(IN) :: data_ni_ + INTEGER , OPTIONAL, INTENT(IN) :: data_nj_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_group_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_ + INTEGER , OPTIONAL, INTENT(IN) :: i_index_(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: ibegin_ + INTEGER , OPTIONAL, INTENT(IN) :: iend_ + INTEGER , OPTIONAL, INTENT(IN) :: j_index_(:,:) + INTEGER , OPTIONAL, INTENT(IN) :: jbegin_ + INTEGER , OPTIONAL, INTENT(IN) :: jend_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: latvalue_(:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: lonvalue_(:) + LOGICAL , OPTIONAL, INTENT(IN) :: mask_(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + INTEGER , OPTIONAL, INTENT(IN) :: ni_ + INTEGER , OPTIONAL, INTENT(IN) :: ni_glo_ + INTEGER , OPTIONAL, INTENT(IN) :: nj_ + INTEGER , OPTIONAL, INTENT(IN) :: nj_glo_ + INTEGER , OPTIONAL, INTENT(IN) :: nvertex_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ibegin_loc_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_jbegin_loc_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_ni_loc_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_ + INTEGER , OPTIONAL, INTENT(IN) :: zoom_nj_loc_ + + IF (PRESENT(bounds_lat_)) THEN + CALL cxios_set_domaingroup_bounds_lat(domaingroup_hdl%daddr, bounds_lat_,size(bounds_lat_,1),size(bounds_lat_,2)) + ENDIF + + IF (PRESENT(bounds_lon_)) THEN + CALL cxios_set_domaingroup_bounds_lon(domaingroup_hdl%daddr, bounds_lon_,size(bounds_lon_,1),size(bounds_lon_,2)) + ENDIF + + IF (PRESENT(data_dim_)) THEN + CALL cxios_set_domaingroup_data_dim(domaingroup_hdl%daddr, data_dim_) + ENDIF + + IF (PRESENT(data_i_index_)) THEN + CALL cxios_set_domaingroup_data_i_index(domaingroup_hdl%daddr, data_i_index_,size(data_i_index_,1)) + ENDIF + + IF (PRESENT(data_ibegin_)) THEN + CALL cxios_set_domaingroup_data_ibegin(domaingroup_hdl%daddr, data_ibegin_) + ENDIF + + IF (PRESENT(data_j_index_)) THEN + CALL cxios_set_domaingroup_data_j_index(domaingroup_hdl%daddr, data_j_index_,size(data_j_index_,1)) + ENDIF + + IF (PRESENT(data_jbegin_)) THEN + CALL cxios_set_domaingroup_data_jbegin(domaingroup_hdl%daddr, data_jbegin_) + ENDIF + + IF (PRESENT(data_n_index_)) THEN + CALL cxios_set_domaingroup_data_n_index(domaingroup_hdl%daddr, data_n_index_) + ENDIF + + IF (PRESENT(data_ni_)) THEN + CALL cxios_set_domaingroup_data_ni(domaingroup_hdl%daddr, data_ni_) + ENDIF + + IF (PRESENT(data_nj_)) THEN + CALL cxios_set_domaingroup_data_nj(domaingroup_hdl%daddr, data_nj_) + ENDIF + + IF (PRESENT(domain_group_ref_)) THEN + CALL cxios_set_domaingroup_domain_group_ref(domaingroup_hdl%daddr, domain_group_ref_, len(domain_group_ref_)) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_set_domaingroup_group_ref(domaingroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(i_index_)) THEN + CALL cxios_set_domaingroup_i_index(domaingroup_hdl%daddr, i_index_,size(i_index_,1),size(i_index_,2)) + ENDIF + + IF (PRESENT(ibegin_)) THEN + CALL cxios_set_domaingroup_ibegin(domaingroup_hdl%daddr, ibegin_) + ENDIF + + IF (PRESENT(iend_)) THEN + CALL cxios_set_domaingroup_iend(domaingroup_hdl%daddr, iend_) + ENDIF + + IF (PRESENT(j_index_)) THEN + CALL cxios_set_domaingroup_j_index(domaingroup_hdl%daddr, j_index_,size(j_index_,1),size(j_index_,2)) + ENDIF + + IF (PRESENT(jbegin_)) THEN + CALL cxios_set_domaingroup_jbegin(domaingroup_hdl%daddr, jbegin_) + ENDIF + + IF (PRESENT(jend_)) THEN + CALL cxios_set_domaingroup_jend(domaingroup_hdl%daddr, jend_) + ENDIF + + IF (PRESENT(latvalue_)) THEN + CALL cxios_set_domaingroup_latvalue(domaingroup_hdl%daddr, latvalue_,size(latvalue_,1)) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_set_domaingroup_long_name(domaingroup_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(lonvalue_)) THEN + CALL cxios_set_domaingroup_lonvalue(domaingroup_hdl%daddr, lonvalue_,size(lonvalue_,1)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2))) + mask__tmp=mask_ + CALL cxios_set_domaingroup_mask(domaingroup_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_domaingroup_name(domaingroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(ni_)) THEN + CALL cxios_set_domaingroup_ni(domaingroup_hdl%daddr, ni_) + ENDIF + + IF (PRESENT(ni_glo_)) THEN + CALL cxios_set_domaingroup_ni_glo(domaingroup_hdl%daddr, ni_glo_) + ENDIF + + IF (PRESENT(nj_)) THEN + CALL cxios_set_domaingroup_nj(domaingroup_hdl%daddr, nj_) + ENDIF + + IF (PRESENT(nj_glo_)) THEN + CALL cxios_set_domaingroup_nj_glo(domaingroup_hdl%daddr, nj_glo_) + ENDIF + + IF (PRESENT(nvertex_)) THEN + CALL cxios_set_domaingroup_nvertex(domaingroup_hdl%daddr, nvertex_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_set_domaingroup_standard_name(domaingroup_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_set_domaingroup_type(domaingroup_hdl%daddr, type_, len(type_)) + ENDIF + + IF (PRESENT(zoom_ibegin_)) THEN + CALL cxios_set_domaingroup_zoom_ibegin(domaingroup_hdl%daddr, zoom_ibegin_) + ENDIF + + IF (PRESENT(zoom_ibegin_loc_)) THEN + CALL cxios_set_domaingroup_zoom_ibegin_loc(domaingroup_hdl%daddr, zoom_ibegin_loc_) + ENDIF + + IF (PRESENT(zoom_jbegin_)) THEN + CALL cxios_set_domaingroup_zoom_jbegin(domaingroup_hdl%daddr, zoom_jbegin_) + ENDIF + + IF (PRESENT(zoom_jbegin_loc_)) THEN + CALL cxios_set_domaingroup_zoom_jbegin_loc(domaingroup_hdl%daddr, zoom_jbegin_loc_) + ENDIF + + IF (PRESENT(zoom_ni_)) THEN + CALL cxios_set_domaingroup_zoom_ni(domaingroup_hdl%daddr, zoom_ni_) + ENDIF + + IF (PRESENT(zoom_ni_loc_)) THEN + CALL cxios_set_domaingroup_zoom_ni_loc(domaingroup_hdl%daddr, zoom_ni_loc_) + ENDIF + + IF (PRESENT(zoom_nj_)) THEN + CALL cxios_set_domaingroup_zoom_nj(domaingroup_hdl%daddr, zoom_nj_) + ENDIF + + IF (PRESENT(zoom_nj_loc_)) THEN + CALL cxios_set_domaingroup_zoom_nj_loc(domaingroup_hdl%daddr, zoom_nj_loc_) + ENDIF + + + + END SUBROUTINE xios(set_domaingroup_attr_hdl_) + + SUBROUTINE xios(get_domaingroup_attr) & + ( domaingroup_id, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) :: domaingroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::domaingroup_id + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_dim + INTEGER , OPTIONAL, INTENT(OUT) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_n_index + INTEGER , OPTIONAL, INTENT(OUT) :: data_ni + INTEGER , OPTIONAL, INTENT(OUT) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: iend + INTEGER , OPTIONAL, INTENT(OUT) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + INTEGER , OPTIONAL, INTENT(OUT) :: ni + INTEGER , OPTIONAL, INTENT(OUT) :: ni_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nj + INTEGER , OPTIONAL, INTENT(OUT) :: nj_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_loc + + CALL xios(get_domaingroup_handle)(domaingroup_id,domaingroup_hdl) + CALL xios(get_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + END SUBROUTINE xios(get_domaingroup_attr) + + SUBROUTINE xios(get_domaingroup_attr_hdl) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) , INTENT(IN) :: domaingroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lat(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lon(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_dim + INTEGER , OPTIONAL, INTENT(OUT) :: data_i_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_j_index(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: data_n_index + INTEGER , OPTIONAL, INTENT(OUT) :: data_ni + INTEGER , OPTIONAL, INTENT(OUT) :: data_nj + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: i_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: iend + INTEGER , OPTIONAL, INTENT(OUT) :: j_index(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: jend + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: latvalue(:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: lonvalue(:) + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + INTEGER , OPTIONAL, INTENT(OUT) :: ni + INTEGER , OPTIONAL, INTENT(OUT) :: ni_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nj + INTEGER , OPTIONAL, INTENT(OUT) :: nj_glo + INTEGER , OPTIONAL, INTENT(OUT) :: nvertex + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_loc + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_loc + + CALL xios(get_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + END SUBROUTINE xios(get_domaingroup_attr_hdl) + + SUBROUTINE xios(get_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat_, bounds_lon_, data_dim_, data_i_index_, data_ibegin_, data_j_index_ & + , data_jbegin_, data_n_index_, data_ni_, data_nj_, domain_group_ref_, group_ref_, i_index_, ibegin_ & + , iend_, j_index_, jbegin_, jend_, latvalue_, long_name_, lonvalue_, mask_, name_, ni_, ni_glo_ & + , nj_, nj_glo_, nvertex_, standard_name_, type_, zoom_ibegin_, zoom_ibegin_loc_, zoom_jbegin_ & + , zoom_jbegin_loc_, zoom_ni_, zoom_ni_loc_, zoom_nj_, zoom_nj_loc_ ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) , INTENT(IN) :: domaingroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lat_(:,:) + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: bounds_lon_(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_dim_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_i_index_(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_ibegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_j_index_(:) + INTEGER , OPTIONAL, INTENT(OUT) :: data_jbegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_n_index_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_ni_ + INTEGER , OPTIONAL, INTENT(OUT) :: data_nj_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_group_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_ + INTEGER , OPTIONAL, INTENT(OUT) :: i_index_(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: ibegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: iend_ + INTEGER , OPTIONAL, INTENT(OUT) :: j_index_(:,:) + INTEGER , OPTIONAL, INTENT(OUT) :: jbegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: jend_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: latvalue_(:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: lonvalue_(:) + LOGICAL , OPTIONAL, INTENT(OUT) :: mask_(:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + INTEGER , OPTIONAL, INTENT(OUT) :: ni_ + INTEGER , OPTIONAL, INTENT(OUT) :: ni_glo_ + INTEGER , OPTIONAL, INTENT(OUT) :: nj_ + INTEGER , OPTIONAL, INTENT(OUT) :: nj_glo_ + INTEGER , OPTIONAL, INTENT(OUT) :: nvertex_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_ni_loc_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_ + INTEGER , OPTIONAL, INTENT(OUT) :: zoom_nj_loc_ + + IF (PRESENT(bounds_lat_)) THEN + CALL cxios_get_domaingroup_bounds_lat(domaingroup_hdl%daddr, bounds_lat_,size(bounds_lat_,1),size(bounds_lat_,2)) + ENDIF + + IF (PRESENT(bounds_lon_)) THEN + CALL cxios_get_domaingroup_bounds_lon(domaingroup_hdl%daddr, bounds_lon_,size(bounds_lon_,1),size(bounds_lon_,2)) + ENDIF + + IF (PRESENT(data_dim_)) THEN + CALL cxios_get_domaingroup_data_dim(domaingroup_hdl%daddr, data_dim_) + ENDIF + + IF (PRESENT(data_i_index_)) THEN + CALL cxios_get_domaingroup_data_i_index(domaingroup_hdl%daddr, data_i_index_,size(data_i_index_,1)) + ENDIF + + IF (PRESENT(data_ibegin_)) THEN + CALL cxios_get_domaingroup_data_ibegin(domaingroup_hdl%daddr, data_ibegin_) + ENDIF + + IF (PRESENT(data_j_index_)) THEN + CALL cxios_get_domaingroup_data_j_index(domaingroup_hdl%daddr, data_j_index_,size(data_j_index_,1)) + ENDIF + + IF (PRESENT(data_jbegin_)) THEN + CALL cxios_get_domaingroup_data_jbegin(domaingroup_hdl%daddr, data_jbegin_) + ENDIF + + IF (PRESENT(data_n_index_)) THEN + CALL cxios_get_domaingroup_data_n_index(domaingroup_hdl%daddr, data_n_index_) + ENDIF + + IF (PRESENT(data_ni_)) THEN + CALL cxios_get_domaingroup_data_ni(domaingroup_hdl%daddr, data_ni_) + ENDIF + + IF (PRESENT(data_nj_)) THEN + CALL cxios_get_domaingroup_data_nj(domaingroup_hdl%daddr, data_nj_) + ENDIF + + IF (PRESENT(domain_group_ref_)) THEN + CALL cxios_get_domaingroup_domain_group_ref(domaingroup_hdl%daddr, domain_group_ref_, len(domain_group_ref_)) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_get_domaingroup_group_ref(domaingroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(i_index_)) THEN + CALL cxios_get_domaingroup_i_index(domaingroup_hdl%daddr, i_index_,size(i_index_,1),size(i_index_,2)) + ENDIF + + IF (PRESENT(ibegin_)) THEN + CALL cxios_get_domaingroup_ibegin(domaingroup_hdl%daddr, ibegin_) + ENDIF + + IF (PRESENT(iend_)) THEN + CALL cxios_get_domaingroup_iend(domaingroup_hdl%daddr, iend_) + ENDIF + + IF (PRESENT(j_index_)) THEN + CALL cxios_get_domaingroup_j_index(domaingroup_hdl%daddr, j_index_,size(j_index_,1),size(j_index_,2)) + ENDIF + + IF (PRESENT(jbegin_)) THEN + CALL cxios_get_domaingroup_jbegin(domaingroup_hdl%daddr, jbegin_) + ENDIF + + IF (PRESENT(jend_)) THEN + CALL cxios_get_domaingroup_jend(domaingroup_hdl%daddr, jend_) + ENDIF + + IF (PRESENT(latvalue_)) THEN + CALL cxios_get_domaingroup_latvalue(domaingroup_hdl%daddr, latvalue_,size(latvalue_,1)) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_get_domaingroup_long_name(domaingroup_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(lonvalue_)) THEN + CALL cxios_get_domaingroup_lonvalue(domaingroup_hdl%daddr, lonvalue_,size(lonvalue_,1)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2))) + CALL cxios_get_domaingroup_mask(domaingroup_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2)) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_domaingroup_name(domaingroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(ni_)) THEN + CALL cxios_get_domaingroup_ni(domaingroup_hdl%daddr, ni_) + ENDIF + + IF (PRESENT(ni_glo_)) THEN + CALL cxios_get_domaingroup_ni_glo(domaingroup_hdl%daddr, ni_glo_) + ENDIF + + IF (PRESENT(nj_)) THEN + CALL cxios_get_domaingroup_nj(domaingroup_hdl%daddr, nj_) + ENDIF + + IF (PRESENT(nj_glo_)) THEN + CALL cxios_get_domaingroup_nj_glo(domaingroup_hdl%daddr, nj_glo_) + ENDIF + + IF (PRESENT(nvertex_)) THEN + CALL cxios_get_domaingroup_nvertex(domaingroup_hdl%daddr, nvertex_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_get_domaingroup_standard_name(domaingroup_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_get_domaingroup_type(domaingroup_hdl%daddr, type_, len(type_)) + ENDIF + + IF (PRESENT(zoom_ibegin_)) THEN + CALL cxios_get_domaingroup_zoom_ibegin(domaingroup_hdl%daddr, zoom_ibegin_) + ENDIF + + IF (PRESENT(zoom_ibegin_loc_)) THEN + CALL cxios_get_domaingroup_zoom_ibegin_loc(domaingroup_hdl%daddr, zoom_ibegin_loc_) + ENDIF + + IF (PRESENT(zoom_jbegin_)) THEN + CALL cxios_get_domaingroup_zoom_jbegin(domaingroup_hdl%daddr, zoom_jbegin_) + ENDIF + + IF (PRESENT(zoom_jbegin_loc_)) THEN + CALL cxios_get_domaingroup_zoom_jbegin_loc(domaingroup_hdl%daddr, zoom_jbegin_loc_) + ENDIF + + IF (PRESENT(zoom_ni_)) THEN + CALL cxios_get_domaingroup_zoom_ni(domaingroup_hdl%daddr, zoom_ni_) + ENDIF + + IF (PRESENT(zoom_ni_loc_)) THEN + CALL cxios_get_domaingroup_zoom_ni_loc(domaingroup_hdl%daddr, zoom_ni_loc_) + ENDIF + + IF (PRESENT(zoom_nj_)) THEN + CALL cxios_get_domaingroup_zoom_nj(domaingroup_hdl%daddr, zoom_nj_) + ENDIF + + IF (PRESENT(zoom_nj_loc_)) THEN + CALL cxios_get_domaingroup_zoom_nj_loc(domaingroup_hdl%daddr, zoom_nj_loc_) + ENDIF + + + + END SUBROUTINE xios(get_domaingroup_attr_hdl_) + + SUBROUTINE xios(is_defined_domaingroup_attr) & + ( domaingroup_id, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) :: domaingroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::domaingroup_id + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat + LOGICAL(KIND=C_BOOL) :: bounds_lat_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon + LOGICAL(KIND=C_BOOL) :: bounds_lon_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim + LOGICAL(KIND=C_BOOL) :: data_dim_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index + LOGICAL(KIND=C_BOOL) :: data_i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin + LOGICAL(KIND=C_BOOL) :: data_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index + LOGICAL(KIND=C_BOOL) :: data_j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin + LOGICAL(KIND=C_BOOL) :: data_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_n_index + LOGICAL(KIND=C_BOOL) :: data_n_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni + LOGICAL(KIND=C_BOOL) :: data_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj + LOGICAL(KIND=C_BOOL) :: data_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_group_ref + LOGICAL(KIND=C_BOOL) :: domain_group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: i_index + LOGICAL(KIND=C_BOOL) :: i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin + LOGICAL(KIND=C_BOOL) :: ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: iend + LOGICAL(KIND=C_BOOL) :: iend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: j_index + LOGICAL(KIND=C_BOOL) :: j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin + LOGICAL(KIND=C_BOOL) :: jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jend + LOGICAL(KIND=C_BOOL) :: jend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue + LOGICAL(KIND=C_BOOL) :: latvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue + LOGICAL(KIND=C_BOOL) :: lonvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni + LOGICAL(KIND=C_BOOL) :: ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo + LOGICAL(KIND=C_BOOL) :: ni_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj + LOGICAL(KIND=C_BOOL) :: nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo + LOGICAL(KIND=C_BOOL) :: nj_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex + LOGICAL(KIND=C_BOOL) :: nvertex_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni + LOGICAL(KIND=C_BOOL) :: zoom_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_loc + LOGICAL(KIND=C_BOOL) :: zoom_ni_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj + LOGICAL(KIND=C_BOOL) :: zoom_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_loc + LOGICAL(KIND=C_BOOL) :: zoom_nj_loc_tmp + + CALL xios(get_domaingroup_handle)(domaingroup_id,domaingroup_hdl) + CALL xios(is_defined_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + END SUBROUTINE xios(is_defined_domaingroup_attr) + + SUBROUTINE xios(is_defined_domaingroup_attr_hdl) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) , INTENT(IN) :: domaingroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat + LOGICAL(KIND=C_BOOL) :: bounds_lat_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon + LOGICAL(KIND=C_BOOL) :: bounds_lon_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim + LOGICAL(KIND=C_BOOL) :: data_dim_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index + LOGICAL(KIND=C_BOOL) :: data_i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin + LOGICAL(KIND=C_BOOL) :: data_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index + LOGICAL(KIND=C_BOOL) :: data_j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin + LOGICAL(KIND=C_BOOL) :: data_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_n_index + LOGICAL(KIND=C_BOOL) :: data_n_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni + LOGICAL(KIND=C_BOOL) :: data_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj + LOGICAL(KIND=C_BOOL) :: data_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_group_ref + LOGICAL(KIND=C_BOOL) :: domain_group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: i_index + LOGICAL(KIND=C_BOOL) :: i_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin + LOGICAL(KIND=C_BOOL) :: ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: iend + LOGICAL(KIND=C_BOOL) :: iend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: j_index + LOGICAL(KIND=C_BOOL) :: j_index_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin + LOGICAL(KIND=C_BOOL) :: jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jend + LOGICAL(KIND=C_BOOL) :: jend_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue + LOGICAL(KIND=C_BOOL) :: latvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue + LOGICAL(KIND=C_BOOL) :: lonvalue_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni + LOGICAL(KIND=C_BOOL) :: ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo + LOGICAL(KIND=C_BOOL) :: ni_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj + LOGICAL(KIND=C_BOOL) :: nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo + LOGICAL(KIND=C_BOOL) :: nj_glo_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex + LOGICAL(KIND=C_BOOL) :: nvertex_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni + LOGICAL(KIND=C_BOOL) :: zoom_ni_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_loc + LOGICAL(KIND=C_BOOL) :: zoom_ni_loc_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj + LOGICAL(KIND=C_BOOL) :: zoom_nj_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_loc + LOGICAL(KIND=C_BOOL) :: zoom_nj_loc_tmp + + CALL xios(is_defined_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat, bounds_lon, data_dim, data_i_index, data_ibegin, data_j_index & + , data_jbegin, data_n_index, data_ni, data_nj, domain_group_ref, group_ref, i_index, ibegin & + , iend, j_index, jbegin, jend, latvalue, long_name, lonvalue, mask, name, ni, ni_glo, nj, nj_glo & + , nvertex, standard_name, type, zoom_ibegin, zoom_ibegin_loc, zoom_jbegin, zoom_jbegin_loc, zoom_ni & + , zoom_ni_loc, zoom_nj, zoom_nj_loc ) + + END SUBROUTINE xios(is_defined_domaingroup_attr_hdl) + + SUBROUTINE xios(is_defined_domaingroup_attr_hdl_) & + ( domaingroup_hdl, bounds_lat_, bounds_lon_, data_dim_, data_i_index_, data_ibegin_, data_j_index_ & + , data_jbegin_, data_n_index_, data_ni_, data_nj_, domain_group_ref_, group_ref_, i_index_, ibegin_ & + , iend_, j_index_, jbegin_, jend_, latvalue_, long_name_, lonvalue_, mask_, name_, ni_, ni_glo_ & + , nj_, nj_glo_, nvertex_, standard_name_, type_, zoom_ibegin_, zoom_ibegin_loc_, zoom_jbegin_ & + , zoom_jbegin_loc_, zoom_ni_, zoom_ni_loc_, zoom_nj_, zoom_nj_loc_ ) + + IMPLICIT NONE + TYPE(txios(domaingroup)) , INTENT(IN) :: domaingroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lat_ + LOGICAL(KIND=C_BOOL) :: bounds_lat__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: bounds_lon_ + LOGICAL(KIND=C_BOOL) :: bounds_lon__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_dim_ + LOGICAL(KIND=C_BOOL) :: data_dim__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_i_index_ + LOGICAL(KIND=C_BOOL) :: data_i_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ibegin_ + LOGICAL(KIND=C_BOOL) :: data_ibegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_j_index_ + LOGICAL(KIND=C_BOOL) :: data_j_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_jbegin_ + LOGICAL(KIND=C_BOOL) :: data_jbegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_n_index_ + LOGICAL(KIND=C_BOOL) :: data_n_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_ni_ + LOGICAL(KIND=C_BOOL) :: data_ni__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: data_nj_ + LOGICAL(KIND=C_BOOL) :: data_nj__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_group_ref_ + LOGICAL(KIND=C_BOOL) :: domain_group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL(KIND=C_BOOL) :: group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: i_index_ + LOGICAL(KIND=C_BOOL) :: i_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ibegin_ + LOGICAL(KIND=C_BOOL) :: ibegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: iend_ + LOGICAL(KIND=C_BOOL) :: iend__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: j_index_ + LOGICAL(KIND=C_BOOL) :: j_index__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jbegin_ + LOGICAL(KIND=C_BOOL) :: jbegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: jend_ + LOGICAL(KIND=C_BOOL) :: jend__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: latvalue_ + LOGICAL(KIND=C_BOOL) :: latvalue__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_ + LOGICAL(KIND=C_BOOL) :: long_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: lonvalue_ + LOGICAL(KIND=C_BOOL) :: lonvalue__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask_ + LOGICAL(KIND=C_BOOL) :: mask__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_ + LOGICAL(KIND=C_BOOL) :: ni__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: ni_glo_ + LOGICAL(KIND=C_BOOL) :: ni_glo__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_ + LOGICAL(KIND=C_BOOL) :: nj__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nj_glo_ + LOGICAL(KIND=C_BOOL) :: nj_glo__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex_ + LOGICAL(KIND=C_BOOL) :: nvertex__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_ + LOGICAL(KIND=C_BOOL) :: standard_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type_ + LOGICAL(KIND=C_BOOL) :: type__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_ + LOGICAL(KIND=C_BOOL) :: zoom_ibegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ibegin_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_ibegin_loc__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_ + LOGICAL(KIND=C_BOOL) :: zoom_jbegin__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_jbegin_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_jbegin_loc__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_ + LOGICAL(KIND=C_BOOL) :: zoom_ni__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_ni_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_ni_loc__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_ + LOGICAL(KIND=C_BOOL) :: zoom_nj__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: zoom_nj_loc_ + LOGICAL(KIND=C_BOOL) :: zoom_nj_loc__tmp + + IF (PRESENT(bounds_lat_)) THEN + bounds_lat__tmp=cxios_is_defined_domaingroup_bounds_lat(domaingroup_hdl%daddr) + bounds_lat_=bounds_lat__tmp + ENDIF + + IF (PRESENT(bounds_lon_)) THEN + bounds_lon__tmp=cxios_is_defined_domaingroup_bounds_lon(domaingroup_hdl%daddr) + bounds_lon_=bounds_lon__tmp + ENDIF + + IF (PRESENT(data_dim_)) THEN + data_dim__tmp=cxios_is_defined_domaingroup_data_dim(domaingroup_hdl%daddr) + data_dim_=data_dim__tmp + ENDIF + + IF (PRESENT(data_i_index_)) THEN + data_i_index__tmp=cxios_is_defined_domaingroup_data_i_index(domaingroup_hdl%daddr) + data_i_index_=data_i_index__tmp + ENDIF + + IF (PRESENT(data_ibegin_)) THEN + data_ibegin__tmp=cxios_is_defined_domaingroup_data_ibegin(domaingroup_hdl%daddr) + data_ibegin_=data_ibegin__tmp + ENDIF + + IF (PRESENT(data_j_index_)) THEN + data_j_index__tmp=cxios_is_defined_domaingroup_data_j_index(domaingroup_hdl%daddr) + data_j_index_=data_j_index__tmp + ENDIF + + IF (PRESENT(data_jbegin_)) THEN + data_jbegin__tmp=cxios_is_defined_domaingroup_data_jbegin(domaingroup_hdl%daddr) + data_jbegin_=data_jbegin__tmp + ENDIF + + IF (PRESENT(data_n_index_)) THEN + data_n_index__tmp=cxios_is_defined_domaingroup_data_n_index(domaingroup_hdl%daddr) + data_n_index_=data_n_index__tmp + ENDIF + + IF (PRESENT(data_ni_)) THEN + data_ni__tmp=cxios_is_defined_domaingroup_data_ni(domaingroup_hdl%daddr) + data_ni_=data_ni__tmp + ENDIF + + IF (PRESENT(data_nj_)) THEN + data_nj__tmp=cxios_is_defined_domaingroup_data_nj(domaingroup_hdl%daddr) + data_nj_=data_nj__tmp + ENDIF + + IF (PRESENT(domain_group_ref_)) THEN + domain_group_ref__tmp=cxios_is_defined_domaingroup_domain_group_ref(domaingroup_hdl%daddr) + domain_group_ref_=domain_group_ref__tmp + ENDIF + + IF (PRESENT(group_ref_)) THEN + group_ref__tmp=cxios_is_defined_domaingroup_group_ref(domaingroup_hdl%daddr) + group_ref_=group_ref__tmp + ENDIF + + IF (PRESENT(i_index_)) THEN + i_index__tmp=cxios_is_defined_domaingroup_i_index(domaingroup_hdl%daddr) + i_index_=i_index__tmp + ENDIF + + IF (PRESENT(ibegin_)) THEN + ibegin__tmp=cxios_is_defined_domaingroup_ibegin(domaingroup_hdl%daddr) + ibegin_=ibegin__tmp + ENDIF + + IF (PRESENT(iend_)) THEN + iend__tmp=cxios_is_defined_domaingroup_iend(domaingroup_hdl%daddr) + iend_=iend__tmp + ENDIF + + IF (PRESENT(j_index_)) THEN + j_index__tmp=cxios_is_defined_domaingroup_j_index(domaingroup_hdl%daddr) + j_index_=j_index__tmp + ENDIF + + IF (PRESENT(jbegin_)) THEN + jbegin__tmp=cxios_is_defined_domaingroup_jbegin(domaingroup_hdl%daddr) + jbegin_=jbegin__tmp + ENDIF + + IF (PRESENT(jend_)) THEN + jend__tmp=cxios_is_defined_domaingroup_jend(domaingroup_hdl%daddr) + jend_=jend__tmp + ENDIF + + IF (PRESENT(latvalue_)) THEN + latvalue__tmp=cxios_is_defined_domaingroup_latvalue(domaingroup_hdl%daddr) + latvalue_=latvalue__tmp + ENDIF + + IF (PRESENT(long_name_)) THEN + long_name__tmp=cxios_is_defined_domaingroup_long_name(domaingroup_hdl%daddr) + long_name_=long_name__tmp + ENDIF + + IF (PRESENT(lonvalue_)) THEN + lonvalue__tmp=cxios_is_defined_domaingroup_lonvalue(domaingroup_hdl%daddr) + lonvalue_=lonvalue__tmp + ENDIF + + IF (PRESENT(mask_)) THEN + mask__tmp=cxios_is_defined_domaingroup_mask(domaingroup_hdl%daddr) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_domaingroup_name(domaingroup_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(ni_)) THEN + ni__tmp=cxios_is_defined_domaingroup_ni(domaingroup_hdl%daddr) + ni_=ni__tmp + ENDIF + + IF (PRESENT(ni_glo_)) THEN + ni_glo__tmp=cxios_is_defined_domaingroup_ni_glo(domaingroup_hdl%daddr) + ni_glo_=ni_glo__tmp + ENDIF + + IF (PRESENT(nj_)) THEN + nj__tmp=cxios_is_defined_domaingroup_nj(domaingroup_hdl%daddr) + nj_=nj__tmp + ENDIF + + IF (PRESENT(nj_glo_)) THEN + nj_glo__tmp=cxios_is_defined_domaingroup_nj_glo(domaingroup_hdl%daddr) + nj_glo_=nj_glo__tmp + ENDIF + + IF (PRESENT(nvertex_)) THEN + nvertex__tmp=cxios_is_defined_domaingroup_nvertex(domaingroup_hdl%daddr) + nvertex_=nvertex__tmp + ENDIF + + IF (PRESENT(standard_name_)) THEN + standard_name__tmp=cxios_is_defined_domaingroup_standard_name(domaingroup_hdl%daddr) + standard_name_=standard_name__tmp + ENDIF + + IF (PRESENT(type_)) THEN + type__tmp=cxios_is_defined_domaingroup_type(domaingroup_hdl%daddr) + type_=type__tmp + ENDIF + + IF (PRESENT(zoom_ibegin_)) THEN + zoom_ibegin__tmp=cxios_is_defined_domaingroup_zoom_ibegin(domaingroup_hdl%daddr) + zoom_ibegin_=zoom_ibegin__tmp + ENDIF + + IF (PRESENT(zoom_ibegin_loc_)) THEN + zoom_ibegin_loc__tmp=cxios_is_defined_domaingroup_zoom_ibegin_loc(domaingroup_hdl%daddr) + zoom_ibegin_loc_=zoom_ibegin_loc__tmp + ENDIF + + IF (PRESENT(zoom_jbegin_)) THEN + zoom_jbegin__tmp=cxios_is_defined_domaingroup_zoom_jbegin(domaingroup_hdl%daddr) + zoom_jbegin_=zoom_jbegin__tmp + ENDIF + + IF (PRESENT(zoom_jbegin_loc_)) THEN + zoom_jbegin_loc__tmp=cxios_is_defined_domaingroup_zoom_jbegin_loc(domaingroup_hdl%daddr) + zoom_jbegin_loc_=zoom_jbegin_loc__tmp + ENDIF + + IF (PRESENT(zoom_ni_)) THEN + zoom_ni__tmp=cxios_is_defined_domaingroup_zoom_ni(domaingroup_hdl%daddr) + zoom_ni_=zoom_ni__tmp + ENDIF + + IF (PRESENT(zoom_ni_loc_)) THEN + zoom_ni_loc__tmp=cxios_is_defined_domaingroup_zoom_ni_loc(domaingroup_hdl%daddr) + zoom_ni_loc_=zoom_ni_loc__tmp + ENDIF + + IF (PRESENT(zoom_nj_)) THEN + zoom_nj__tmp=cxios_is_defined_domaingroup_zoom_nj(domaingroup_hdl%daddr) + zoom_nj_=zoom_nj__tmp + ENDIF + + IF (PRESENT(zoom_nj_loc_)) THEN + zoom_nj_loc__tmp=cxios_is_defined_domaingroup_zoom_nj_loc(domaingroup_hdl%daddr) + zoom_nj_loc_=zoom_nj_loc__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_domaingroup_attr_hdl_) + +END MODULE idomaingroup_attr diff --git a/src/interface/fortran_attr/ifield_attr.F90 b/src/interface/fortran_attr/ifield_attr.F90 new file mode 100644 index 0000000..c6d61d5 --- /dev/null +++ b/src/interface/fortran_attr/ifield_attr.F90 @@ -0,0 +1,661 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE ifield_attr + USE, INTRINSIC :: ISO_C_BINDING + USE ifield + USE field_interface_attr + +CONTAINS + + SUBROUTINE xios(set_field_attr) & + ( field_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled, field_ref & + , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor, standard_name & + , unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(field)) :: field_hdl + CHARACTER(LEN=*), INTENT(IN) ::field_id + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value + LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref + INTEGER , OPTIONAL, INTENT(IN) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation + INTEGER , OPTIONAL, INTENT(IN) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min + + CALL xios(get_field_handle)(field_id,field_hdl) + CALL xios(set_field_attr_hdl_) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(set_field_attr) + + SUBROUTINE xios(set_field_attr_hdl) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(field)) , INTENT(IN) :: field_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value + LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref + INTEGER , OPTIONAL, INTENT(IN) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation + INTEGER , OPTIONAL, INTENT(IN) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min + + CALL xios(set_field_attr_hdl_) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(set_field_attr_hdl) + + SUBROUTINE xios(set_field_attr_hdl_) & + ( field_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_, enabled_ & + , field_ref_, freq_offset_, freq_op_, grid_ref_, level_, long_name_, name_, operation_, prec_ & + , scale_factor_, standard_name_, unit_, valid_max_, valid_min_ ) + + IMPLICIT NONE + TYPE(txios(field)) , INTENT(IN) :: field_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value_ + LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value_ + LOGICAL (KIND=C_BOOL) :: detect_missing_value__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref_ + LOGICAL , OPTIONAL, INTENT(IN) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_op_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref_ + INTEGER , OPTIONAL, INTENT(IN) :: level_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation_ + INTEGER , OPTIONAL, INTENT(IN) :: prec_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min_ + + IF (PRESENT(add_offset_)) THEN + CALL cxios_set_field_add_offset(field_hdl%daddr, add_offset_) + ENDIF + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_set_field_axis_ref(field_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(default_value_)) THEN + CALL cxios_set_field_default_value(field_hdl%daddr, default_value_) + ENDIF + + IF (PRESENT(detect_missing_value_)) THEN + detect_missing_value__tmp=detect_missing_value_ + CALL cxios_set_field_detect_missing_value(field_hdl%daddr, detect_missing_value__tmp) + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_set_field_domain_ref(field_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=enabled_ + CALL cxios_set_field_enabled(field_hdl%daddr, enabled__tmp) + ENDIF + + IF (PRESENT(field_ref_)) THEN + CALL cxios_set_field_field_ref(field_hdl%daddr, field_ref_, len(field_ref_)) + ENDIF + + IF (PRESENT(freq_offset_)) THEN + CALL cxios_set_field_freq_offset(field_hdl%daddr, freq_offset_, len(freq_offset_)) + ENDIF + + IF (PRESENT(freq_op_)) THEN + CALL cxios_set_field_freq_op(field_hdl%daddr, freq_op_, len(freq_op_)) + ENDIF + + IF (PRESENT(grid_ref_)) THEN + CALL cxios_set_field_grid_ref(field_hdl%daddr, grid_ref_, len(grid_ref_)) + ENDIF + + IF (PRESENT(level_)) THEN + CALL cxios_set_field_level(field_hdl%daddr, level_) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_set_field_long_name(field_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_field_name(field_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(operation_)) THEN + CALL cxios_set_field_operation(field_hdl%daddr, operation_, len(operation_)) + ENDIF + + IF (PRESENT(prec_)) THEN + CALL cxios_set_field_prec(field_hdl%daddr, prec_) + ENDIF + + IF (PRESENT(scale_factor_)) THEN + CALL cxios_set_field_scale_factor(field_hdl%daddr, scale_factor_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_set_field_standard_name(field_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_set_field_unit(field_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(valid_max_)) THEN + CALL cxios_set_field_valid_max(field_hdl%daddr, valid_max_) + ENDIF + + IF (PRESENT(valid_min_)) THEN + CALL cxios_set_field_valid_min(field_hdl%daddr, valid_min_) + ENDIF + + + + END SUBROUTINE xios(set_field_attr_hdl_) + + SUBROUTINE xios(get_field_attr) & + ( field_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled, field_ref & + , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor, standard_name & + , unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(field)) :: field_hdl + CHARACTER(LEN=*), INTENT(IN) ::field_id + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: default_value + LOGICAL , OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: grid_ref + INTEGER , OPTIONAL, INTENT(OUT) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation + INTEGER , OPTIONAL, INTENT(OUT) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_min + + CALL xios(get_field_handle)(field_id,field_hdl) + CALL xios(get_field_attr_hdl_) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(get_field_attr) + + SUBROUTINE xios(get_field_attr_hdl) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(field)) , INTENT(IN) :: field_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: default_value + LOGICAL , OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: grid_ref + INTEGER , OPTIONAL, INTENT(OUT) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation + INTEGER , OPTIONAL, INTENT(OUT) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_min + + CALL xios(get_field_attr_hdl_) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(get_field_attr_hdl) + + SUBROUTINE xios(get_field_attr_hdl_) & + ( field_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_, enabled_ & + , field_ref_, freq_offset_, freq_op_, grid_ref_, level_, long_name_, name_, operation_, prec_ & + , scale_factor_, standard_name_, unit_, valid_max_, valid_min_ ) + + IMPLICIT NONE + TYPE(txios(field)) , INTENT(IN) :: field_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: add_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: default_value_ + LOGICAL , OPTIONAL, INTENT(OUT) :: detect_missing_value_ + LOGICAL (KIND=C_BOOL) :: detect_missing_value__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: field_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_op_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: grid_ref_ + INTEGER , OPTIONAL, INTENT(OUT) :: level_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation_ + INTEGER , OPTIONAL, INTENT(OUT) :: prec_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_max_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_min_ + + IF (PRESENT(add_offset_)) THEN + CALL cxios_get_field_add_offset(field_hdl%daddr, add_offset_) + ENDIF + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_get_field_axis_ref(field_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(default_value_)) THEN + CALL cxios_get_field_default_value(field_hdl%daddr, default_value_) + ENDIF + + IF (PRESENT(detect_missing_value_)) THEN + CALL cxios_get_field_detect_missing_value(field_hdl%daddr, detect_missing_value__tmp) + detect_missing_value_=detect_missing_value__tmp + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_get_field_domain_ref(field_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + CALL cxios_get_field_enabled(field_hdl%daddr, enabled__tmp) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(field_ref_)) THEN + CALL cxios_get_field_field_ref(field_hdl%daddr, field_ref_, len(field_ref_)) + ENDIF + + IF (PRESENT(freq_offset_)) THEN + CALL cxios_get_field_freq_offset(field_hdl%daddr, freq_offset_, len(freq_offset_)) + ENDIF + + IF (PRESENT(freq_op_)) THEN + CALL cxios_get_field_freq_op(field_hdl%daddr, freq_op_, len(freq_op_)) + ENDIF + + IF (PRESENT(grid_ref_)) THEN + CALL cxios_get_field_grid_ref(field_hdl%daddr, grid_ref_, len(grid_ref_)) + ENDIF + + IF (PRESENT(level_)) THEN + CALL cxios_get_field_level(field_hdl%daddr, level_) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_get_field_long_name(field_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_field_name(field_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(operation_)) THEN + CALL cxios_get_field_operation(field_hdl%daddr, operation_, len(operation_)) + ENDIF + + IF (PRESENT(prec_)) THEN + CALL cxios_get_field_prec(field_hdl%daddr, prec_) + ENDIF + + IF (PRESENT(scale_factor_)) THEN + CALL cxios_get_field_scale_factor(field_hdl%daddr, scale_factor_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_get_field_standard_name(field_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_get_field_unit(field_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(valid_max_)) THEN + CALL cxios_get_field_valid_max(field_hdl%daddr, valid_max_) + ENDIF + + IF (PRESENT(valid_min_)) THEN + CALL cxios_get_field_valid_min(field_hdl%daddr, valid_min_) + ENDIF + + + + END SUBROUTINE xios(get_field_attr_hdl_) + + SUBROUTINE xios(is_defined_field_attr) & + ( field_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled, field_ref & + , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor, standard_name & + , unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(field)) :: field_hdl + CHARACTER(LEN=*), INTENT(IN) ::field_id + LOGICAL, OPTIONAL, INTENT(OUT) :: add_offset + LOGICAL(KIND=C_BOOL) :: add_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: default_value + LOGICAL(KIND=C_BOOL) :: default_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL(KIND=C_BOOL) :: detect_missing_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: field_ref + LOGICAL(KIND=C_BOOL) :: field_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_offset + LOGICAL(KIND=C_BOOL) :: freq_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_op + LOGICAL(KIND=C_BOOL) :: freq_op_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: grid_ref + LOGICAL(KIND=C_BOOL) :: grid_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: level + LOGICAL(KIND=C_BOOL) :: level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: operation + LOGICAL(KIND=C_BOOL) :: operation_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: prec + LOGICAL(KIND=C_BOOL) :: prec_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor + LOGICAL(KIND=C_BOOL) :: scale_factor_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_max + LOGICAL(KIND=C_BOOL) :: valid_max_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_min + LOGICAL(KIND=C_BOOL) :: valid_min_tmp + + CALL xios(get_field_handle)(field_id,field_hdl) + CALL xios(is_defined_field_attr_hdl_) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(is_defined_field_attr) + + SUBROUTINE xios(is_defined_field_attr_hdl) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(field)) , INTENT(IN) :: field_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: add_offset + LOGICAL(KIND=C_BOOL) :: add_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: default_value + LOGICAL(KIND=C_BOOL) :: default_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL(KIND=C_BOOL) :: detect_missing_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: field_ref + LOGICAL(KIND=C_BOOL) :: field_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_offset + LOGICAL(KIND=C_BOOL) :: freq_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_op + LOGICAL(KIND=C_BOOL) :: freq_op_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: grid_ref + LOGICAL(KIND=C_BOOL) :: grid_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: level + LOGICAL(KIND=C_BOOL) :: level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: operation + LOGICAL(KIND=C_BOOL) :: operation_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: prec + LOGICAL(KIND=C_BOOL) :: prec_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor + LOGICAL(KIND=C_BOOL) :: scale_factor_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_max + LOGICAL(KIND=C_BOOL) :: valid_max_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_min + LOGICAL(KIND=C_BOOL) :: valid_min_tmp + + CALL xios(is_defined_field_attr_hdl_) & + ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor & + , standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(is_defined_field_attr_hdl) + + SUBROUTINE xios(is_defined_field_attr_hdl_) & + ( field_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_, enabled_ & + , field_ref_, freq_offset_, freq_op_, grid_ref_, level_, long_name_, name_, operation_, prec_ & + , scale_factor_, standard_name_, unit_, valid_max_, valid_min_ ) + + IMPLICIT NONE + TYPE(txios(field)) , INTENT(IN) :: field_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: add_offset_ + LOGICAL(KIND=C_BOOL) :: add_offset__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref_ + LOGICAL(KIND=C_BOOL) :: axis_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: default_value_ + LOGICAL(KIND=C_BOOL) :: default_value__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value_ + LOGICAL(KIND=C_BOOL) :: detect_missing_value__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL(KIND=C_BOOL) :: domain_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL(KIND=C_BOOL) :: enabled__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: field_ref_ + LOGICAL(KIND=C_BOOL) :: field_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_offset_ + LOGICAL(KIND=C_BOOL) :: freq_offset__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_op_ + LOGICAL(KIND=C_BOOL) :: freq_op__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: grid_ref_ + LOGICAL(KIND=C_BOOL) :: grid_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: level_ + LOGICAL(KIND=C_BOOL) :: level__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_ + LOGICAL(KIND=C_BOOL) :: long_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: operation_ + LOGICAL(KIND=C_BOOL) :: operation__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: prec_ + LOGICAL(KIND=C_BOOL) :: prec__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor_ + LOGICAL(KIND=C_BOOL) :: scale_factor__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_ + LOGICAL(KIND=C_BOOL) :: standard_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit_ + LOGICAL(KIND=C_BOOL) :: unit__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_max_ + LOGICAL(KIND=C_BOOL) :: valid_max__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_min_ + LOGICAL(KIND=C_BOOL) :: valid_min__tmp + + IF (PRESENT(add_offset_)) THEN + add_offset__tmp=cxios_is_defined_field_add_offset(field_hdl%daddr) + add_offset_=add_offset__tmp + ENDIF + + IF (PRESENT(axis_ref_)) THEN + axis_ref__tmp=cxios_is_defined_field_axis_ref(field_hdl%daddr) + axis_ref_=axis_ref__tmp + ENDIF + + IF (PRESENT(default_value_)) THEN + default_value__tmp=cxios_is_defined_field_default_value(field_hdl%daddr) + default_value_=default_value__tmp + ENDIF + + IF (PRESENT(detect_missing_value_)) THEN + detect_missing_value__tmp=cxios_is_defined_field_detect_missing_value(field_hdl%daddr) + detect_missing_value_=detect_missing_value__tmp + ENDIF + + IF (PRESENT(domain_ref_)) THEN + domain_ref__tmp=cxios_is_defined_field_domain_ref(field_hdl%daddr) + domain_ref_=domain_ref__tmp + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=cxios_is_defined_field_enabled(field_hdl%daddr) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(field_ref_)) THEN + field_ref__tmp=cxios_is_defined_field_field_ref(field_hdl%daddr) + field_ref_=field_ref__tmp + ENDIF + + IF (PRESENT(freq_offset_)) THEN + freq_offset__tmp=cxios_is_defined_field_freq_offset(field_hdl%daddr) + freq_offset_=freq_offset__tmp + ENDIF + + IF (PRESENT(freq_op_)) THEN + freq_op__tmp=cxios_is_defined_field_freq_op(field_hdl%daddr) + freq_op_=freq_op__tmp + ENDIF + + IF (PRESENT(grid_ref_)) THEN + grid_ref__tmp=cxios_is_defined_field_grid_ref(field_hdl%daddr) + grid_ref_=grid_ref__tmp + ENDIF + + IF (PRESENT(level_)) THEN + level__tmp=cxios_is_defined_field_level(field_hdl%daddr) + level_=level__tmp + ENDIF + + IF (PRESENT(long_name_)) THEN + long_name__tmp=cxios_is_defined_field_long_name(field_hdl%daddr) + long_name_=long_name__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_field_name(field_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(operation_)) THEN + operation__tmp=cxios_is_defined_field_operation(field_hdl%daddr) + operation_=operation__tmp + ENDIF + + IF (PRESENT(prec_)) THEN + prec__tmp=cxios_is_defined_field_prec(field_hdl%daddr) + prec_=prec__tmp + ENDIF + + IF (PRESENT(scale_factor_)) THEN + scale_factor__tmp=cxios_is_defined_field_scale_factor(field_hdl%daddr) + scale_factor_=scale_factor__tmp + ENDIF + + IF (PRESENT(standard_name_)) THEN + standard_name__tmp=cxios_is_defined_field_standard_name(field_hdl%daddr) + standard_name_=standard_name__tmp + ENDIF + + IF (PRESENT(unit_)) THEN + unit__tmp=cxios_is_defined_field_unit(field_hdl%daddr) + unit_=unit__tmp + ENDIF + + IF (PRESENT(valid_max_)) THEN + valid_max__tmp=cxios_is_defined_field_valid_max(field_hdl%daddr) + valid_max_=valid_max__tmp + ENDIF + + IF (PRESENT(valid_min_)) THEN + valid_min__tmp=cxios_is_defined_field_valid_min(field_hdl%daddr) + valid_min_=valid_min__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_field_attr_hdl_) + +END MODULE ifield_attr diff --git a/src/interface/fortran_attr/ifieldgroup_attr.F90 b/src/interface/fortran_attr/ifieldgroup_attr.F90 new file mode 100644 index 0000000..01e9fda --- /dev/null +++ b/src/interface/fortran_attr/ifieldgroup_attr.F90 @@ -0,0 +1,686 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE ifieldgroup_attr + USE, INTRINSIC :: ISO_C_BINDING + USE ifield + USE fieldgroup_interface_attr + +CONTAINS + + SUBROUTINE xios(set_fieldgroup_attr) & + ( fieldgroup_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) :: fieldgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::fieldgroup_id + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value + LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + INTEGER , OPTIONAL, INTENT(IN) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation + INTEGER , OPTIONAL, INTENT(IN) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min + + CALL xios(get_fieldgroup_handle)(fieldgroup_id,fieldgroup_hdl) + CALL xios(set_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(set_fieldgroup_attr) + + SUBROUTINE xios(set_fieldgroup_attr_hdl) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) , INTENT(IN) :: fieldgroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value + LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + INTEGER , OPTIONAL, INTENT(IN) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation + INTEGER , OPTIONAL, INTENT(IN) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min + + CALL xios(set_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(set_fieldgroup_attr_hdl) + + SUBROUTINE xios(set_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_ & + , enabled_, field_ref_, freq_offset_, freq_op_, grid_ref_, group_ref_, level_, long_name_, name_ & + , operation_, prec_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) , INTENT(IN) :: fieldgroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: add_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: default_value_ + LOGICAL , OPTIONAL, INTENT(IN) :: detect_missing_value_ + LOGICAL (KIND=C_BOOL) :: detect_missing_value__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref_ + LOGICAL , OPTIONAL, INTENT(IN) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: field_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: freq_op_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: grid_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_ + INTEGER , OPTIONAL, INTENT(IN) :: level_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation_ + INTEGER , OPTIONAL, INTENT(IN) :: prec_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_max_ + REAL (KIND=8) , OPTIONAL, INTENT(IN) :: valid_min_ + + IF (PRESENT(add_offset_)) THEN + CALL cxios_set_fieldgroup_add_offset(fieldgroup_hdl%daddr, add_offset_) + ENDIF + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_set_fieldgroup_axis_ref(fieldgroup_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(default_value_)) THEN + CALL cxios_set_fieldgroup_default_value(fieldgroup_hdl%daddr, default_value_) + ENDIF + + IF (PRESENT(detect_missing_value_)) THEN + detect_missing_value__tmp=detect_missing_value_ + CALL cxios_set_fieldgroup_detect_missing_value(fieldgroup_hdl%daddr, detect_missing_value__tmp) + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_set_fieldgroup_domain_ref(fieldgroup_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=enabled_ + CALL cxios_set_fieldgroup_enabled(fieldgroup_hdl%daddr, enabled__tmp) + ENDIF + + IF (PRESENT(field_ref_)) THEN + CALL cxios_set_fieldgroup_field_ref(fieldgroup_hdl%daddr, field_ref_, len(field_ref_)) + ENDIF + + IF (PRESENT(freq_offset_)) THEN + CALL cxios_set_fieldgroup_freq_offset(fieldgroup_hdl%daddr, freq_offset_, len(freq_offset_)) + ENDIF + + IF (PRESENT(freq_op_)) THEN + CALL cxios_set_fieldgroup_freq_op(fieldgroup_hdl%daddr, freq_op_, len(freq_op_)) + ENDIF + + IF (PRESENT(grid_ref_)) THEN + CALL cxios_set_fieldgroup_grid_ref(fieldgroup_hdl%daddr, grid_ref_, len(grid_ref_)) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_set_fieldgroup_group_ref(fieldgroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(level_)) THEN + CALL cxios_set_fieldgroup_level(fieldgroup_hdl%daddr, level_) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_set_fieldgroup_long_name(fieldgroup_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_fieldgroup_name(fieldgroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(operation_)) THEN + CALL cxios_set_fieldgroup_operation(fieldgroup_hdl%daddr, operation_, len(operation_)) + ENDIF + + IF (PRESENT(prec_)) THEN + CALL cxios_set_fieldgroup_prec(fieldgroup_hdl%daddr, prec_) + ENDIF + + IF (PRESENT(scale_factor_)) THEN + CALL cxios_set_fieldgroup_scale_factor(fieldgroup_hdl%daddr, scale_factor_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_set_fieldgroup_standard_name(fieldgroup_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_set_fieldgroup_unit(fieldgroup_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(valid_max_)) THEN + CALL cxios_set_fieldgroup_valid_max(fieldgroup_hdl%daddr, valid_max_) + ENDIF + + IF (PRESENT(valid_min_)) THEN + CALL cxios_set_fieldgroup_valid_min(fieldgroup_hdl%daddr, valid_min_) + ENDIF + + + + END SUBROUTINE xios(set_fieldgroup_attr_hdl_) + + SUBROUTINE xios(get_fieldgroup_attr) & + ( fieldgroup_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) :: fieldgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::fieldgroup_id + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: default_value + LOGICAL , OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: grid_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation + INTEGER , OPTIONAL, INTENT(OUT) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_min + + CALL xios(get_fieldgroup_handle)(fieldgroup_id,fieldgroup_hdl) + CALL xios(get_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(get_fieldgroup_attr) + + SUBROUTINE xios(get_fieldgroup_attr_hdl) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) , INTENT(IN) :: fieldgroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: add_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: default_value + LOGICAL , OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL (KIND=C_BOOL) :: detect_missing_value_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: field_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_offset + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_op + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: grid_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation + INTEGER , OPTIONAL, INTENT(OUT) :: prec + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_max + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_min + + CALL xios(get_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(get_fieldgroup_attr_hdl) + + SUBROUTINE xios(get_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_ & + , enabled_, field_ref_, freq_offset_, freq_op_, grid_ref_, group_ref_, level_, long_name_, name_ & + , operation_, prec_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) , INTENT(IN) :: fieldgroup_hdl + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: add_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: default_value_ + LOGICAL , OPTIONAL, INTENT(OUT) :: detect_missing_value_ + LOGICAL (KIND=C_BOOL) :: detect_missing_value__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: field_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_offset_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: freq_op_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: grid_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_ + INTEGER , OPTIONAL, INTENT(OUT) :: level_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation_ + INTEGER , OPTIONAL, INTENT(OUT) :: prec_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_max_ + REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: valid_min_ + + IF (PRESENT(add_offset_)) THEN + CALL cxios_get_fieldgroup_add_offset(fieldgroup_hdl%daddr, add_offset_) + ENDIF + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_get_fieldgroup_axis_ref(fieldgroup_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(default_value_)) THEN + CALL cxios_get_fieldgroup_default_value(fieldgroup_hdl%daddr, default_value_) + ENDIF + + IF (PRESENT(detect_missing_value_)) THEN + CALL cxios_get_fieldgroup_detect_missing_value(fieldgroup_hdl%daddr, detect_missing_value__tmp) + detect_missing_value_=detect_missing_value__tmp + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_get_fieldgroup_domain_ref(fieldgroup_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + CALL cxios_get_fieldgroup_enabled(fieldgroup_hdl%daddr, enabled__tmp) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(field_ref_)) THEN + CALL cxios_get_fieldgroup_field_ref(fieldgroup_hdl%daddr, field_ref_, len(field_ref_)) + ENDIF + + IF (PRESENT(freq_offset_)) THEN + CALL cxios_get_fieldgroup_freq_offset(fieldgroup_hdl%daddr, freq_offset_, len(freq_offset_)) + ENDIF + + IF (PRESENT(freq_op_)) THEN + CALL cxios_get_fieldgroup_freq_op(fieldgroup_hdl%daddr, freq_op_, len(freq_op_)) + ENDIF + + IF (PRESENT(grid_ref_)) THEN + CALL cxios_get_fieldgroup_grid_ref(fieldgroup_hdl%daddr, grid_ref_, len(grid_ref_)) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_get_fieldgroup_group_ref(fieldgroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(level_)) THEN + CALL cxios_get_fieldgroup_level(fieldgroup_hdl%daddr, level_) + ENDIF + + IF (PRESENT(long_name_)) THEN + CALL cxios_get_fieldgroup_long_name(fieldgroup_hdl%daddr, long_name_, len(long_name_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_fieldgroup_name(fieldgroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(operation_)) THEN + CALL cxios_get_fieldgroup_operation(fieldgroup_hdl%daddr, operation_, len(operation_)) + ENDIF + + IF (PRESENT(prec_)) THEN + CALL cxios_get_fieldgroup_prec(fieldgroup_hdl%daddr, prec_) + ENDIF + + IF (PRESENT(scale_factor_)) THEN + CALL cxios_get_fieldgroup_scale_factor(fieldgroup_hdl%daddr, scale_factor_) + ENDIF + + IF (PRESENT(standard_name_)) THEN + CALL cxios_get_fieldgroup_standard_name(fieldgroup_hdl%daddr, standard_name_, len(standard_name_)) + ENDIF + + IF (PRESENT(unit_)) THEN + CALL cxios_get_fieldgroup_unit(fieldgroup_hdl%daddr, unit_, len(unit_)) + ENDIF + + IF (PRESENT(valid_max_)) THEN + CALL cxios_get_fieldgroup_valid_max(fieldgroup_hdl%daddr, valid_max_) + ENDIF + + IF (PRESENT(valid_min_)) THEN + CALL cxios_get_fieldgroup_valid_min(fieldgroup_hdl%daddr, valid_min_) + ENDIF + + + + END SUBROUTINE xios(get_fieldgroup_attr_hdl_) + + SUBROUTINE xios(is_defined_fieldgroup_attr) & + ( fieldgroup_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) :: fieldgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::fieldgroup_id + LOGICAL, OPTIONAL, INTENT(OUT) :: add_offset + LOGICAL(KIND=C_BOOL) :: add_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: default_value + LOGICAL(KIND=C_BOOL) :: default_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL(KIND=C_BOOL) :: detect_missing_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: field_ref + LOGICAL(KIND=C_BOOL) :: field_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_offset + LOGICAL(KIND=C_BOOL) :: freq_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_op + LOGICAL(KIND=C_BOOL) :: freq_op_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: grid_ref + LOGICAL(KIND=C_BOOL) :: grid_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: level + LOGICAL(KIND=C_BOOL) :: level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: operation + LOGICAL(KIND=C_BOOL) :: operation_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: prec + LOGICAL(KIND=C_BOOL) :: prec_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor + LOGICAL(KIND=C_BOOL) :: scale_factor_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_max + LOGICAL(KIND=C_BOOL) :: valid_max_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_min + LOGICAL(KIND=C_BOOL) :: valid_min_tmp + + CALL xios(get_fieldgroup_handle)(fieldgroup_id,fieldgroup_hdl) + CALL xios(is_defined_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(is_defined_fieldgroup_attr) + + SUBROUTINE xios(is_defined_fieldgroup_attr_hdl) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) , INTENT(IN) :: fieldgroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: add_offset + LOGICAL(KIND=C_BOOL) :: add_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: default_value + LOGICAL(KIND=C_BOOL) :: default_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value + LOGICAL(KIND=C_BOOL) :: detect_missing_value_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: field_ref + LOGICAL(KIND=C_BOOL) :: field_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_offset + LOGICAL(KIND=C_BOOL) :: freq_offset_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_op + LOGICAL(KIND=C_BOOL) :: freq_op_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: grid_ref + LOGICAL(KIND=C_BOOL) :: grid_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: level + LOGICAL(KIND=C_BOOL) :: level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name + LOGICAL(KIND=C_BOOL) :: long_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: operation + LOGICAL(KIND=C_BOOL) :: operation_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: prec + LOGICAL(KIND=C_BOOL) :: prec_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor + LOGICAL(KIND=C_BOOL) :: scale_factor_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name + LOGICAL(KIND=C_BOOL) :: standard_name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit + LOGICAL(KIND=C_BOOL) :: unit_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_max + LOGICAL(KIND=C_BOOL) :: valid_max_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_min + LOGICAL(KIND=C_BOOL) :: valid_min_tmp + + CALL xios(is_defined_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled & + , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec & + , scale_factor, standard_name, unit, valid_max, valid_min ) + + END SUBROUTINE xios(is_defined_fieldgroup_attr_hdl) + + SUBROUTINE xios(is_defined_fieldgroup_attr_hdl_) & + ( fieldgroup_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_ & + , enabled_, field_ref_, freq_offset_, freq_op_, grid_ref_, group_ref_, level_, long_name_, name_ & + , operation_, prec_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ ) + + IMPLICIT NONE + TYPE(txios(fieldgroup)) , INTENT(IN) :: fieldgroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: add_offset_ + LOGICAL(KIND=C_BOOL) :: add_offset__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref_ + LOGICAL(KIND=C_BOOL) :: axis_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: default_value_ + LOGICAL(KIND=C_BOOL) :: default_value__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: detect_missing_value_ + LOGICAL(KIND=C_BOOL) :: detect_missing_value__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL(KIND=C_BOOL) :: domain_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL(KIND=C_BOOL) :: enabled__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: field_ref_ + LOGICAL(KIND=C_BOOL) :: field_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_offset_ + LOGICAL(KIND=C_BOOL) :: freq_offset__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: freq_op_ + LOGICAL(KIND=C_BOOL) :: freq_op__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: grid_ref_ + LOGICAL(KIND=C_BOOL) :: grid_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL(KIND=C_BOOL) :: group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: level_ + LOGICAL(KIND=C_BOOL) :: level__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_ + LOGICAL(KIND=C_BOOL) :: long_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: operation_ + LOGICAL(KIND=C_BOOL) :: operation__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: prec_ + LOGICAL(KIND=C_BOOL) :: prec__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor_ + LOGICAL(KIND=C_BOOL) :: scale_factor__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_ + LOGICAL(KIND=C_BOOL) :: standard_name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: unit_ + LOGICAL(KIND=C_BOOL) :: unit__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_max_ + LOGICAL(KIND=C_BOOL) :: valid_max__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: valid_min_ + LOGICAL(KIND=C_BOOL) :: valid_min__tmp + + IF (PRESENT(add_offset_)) THEN + add_offset__tmp=cxios_is_defined_fieldgroup_add_offset(fieldgroup_hdl%daddr) + add_offset_=add_offset__tmp + ENDIF + + IF (PRESENT(axis_ref_)) THEN + axis_ref__tmp=cxios_is_defined_fieldgroup_axis_ref(fieldgroup_hdl%daddr) + axis_ref_=axis_ref__tmp + ENDIF + + IF (PRESENT(default_value_)) THEN + default_value__tmp=cxios_is_defined_fieldgroup_default_value(fieldgroup_hdl%daddr) + default_value_=default_value__tmp + ENDIF + + IF (PRESENT(detect_missing_value_)) THEN + detect_missing_value__tmp=cxios_is_defined_fieldgroup_detect_missing_value(fieldgroup_hdl%daddr) + detect_missing_value_=detect_missing_value__tmp + ENDIF + + IF (PRESENT(domain_ref_)) THEN + domain_ref__tmp=cxios_is_defined_fieldgroup_domain_ref(fieldgroup_hdl%daddr) + domain_ref_=domain_ref__tmp + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=cxios_is_defined_fieldgroup_enabled(fieldgroup_hdl%daddr) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(field_ref_)) THEN + field_ref__tmp=cxios_is_defined_fieldgroup_field_ref(fieldgroup_hdl%daddr) + field_ref_=field_ref__tmp + ENDIF + + IF (PRESENT(freq_offset_)) THEN + freq_offset__tmp=cxios_is_defined_fieldgroup_freq_offset(fieldgroup_hdl%daddr) + freq_offset_=freq_offset__tmp + ENDIF + + IF (PRESENT(freq_op_)) THEN + freq_op__tmp=cxios_is_defined_fieldgroup_freq_op(fieldgroup_hdl%daddr) + freq_op_=freq_op__tmp + ENDIF + + IF (PRESENT(grid_ref_)) THEN + grid_ref__tmp=cxios_is_defined_fieldgroup_grid_ref(fieldgroup_hdl%daddr) + grid_ref_=grid_ref__tmp + ENDIF + + IF (PRESENT(group_ref_)) THEN + group_ref__tmp=cxios_is_defined_fieldgroup_group_ref(fieldgroup_hdl%daddr) + group_ref_=group_ref__tmp + ENDIF + + IF (PRESENT(level_)) THEN + level__tmp=cxios_is_defined_fieldgroup_level(fieldgroup_hdl%daddr) + level_=level__tmp + ENDIF + + IF (PRESENT(long_name_)) THEN + long_name__tmp=cxios_is_defined_fieldgroup_long_name(fieldgroup_hdl%daddr) + long_name_=long_name__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_fieldgroup_name(fieldgroup_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(operation_)) THEN + operation__tmp=cxios_is_defined_fieldgroup_operation(fieldgroup_hdl%daddr) + operation_=operation__tmp + ENDIF + + IF (PRESENT(prec_)) THEN + prec__tmp=cxios_is_defined_fieldgroup_prec(fieldgroup_hdl%daddr) + prec_=prec__tmp + ENDIF + + IF (PRESENT(scale_factor_)) THEN + scale_factor__tmp=cxios_is_defined_fieldgroup_scale_factor(fieldgroup_hdl%daddr) + scale_factor_=scale_factor__tmp + ENDIF + + IF (PRESENT(standard_name_)) THEN + standard_name__tmp=cxios_is_defined_fieldgroup_standard_name(fieldgroup_hdl%daddr) + standard_name_=standard_name__tmp + ENDIF + + IF (PRESENT(unit_)) THEN + unit__tmp=cxios_is_defined_fieldgroup_unit(fieldgroup_hdl%daddr) + unit_=unit__tmp + ENDIF + + IF (PRESENT(valid_max_)) THEN + valid_max__tmp=cxios_is_defined_fieldgroup_valid_max(fieldgroup_hdl%daddr) + valid_max_=valid_max__tmp + ENDIF + + IF (PRESENT(valid_min_)) THEN + valid_min__tmp=cxios_is_defined_fieldgroup_valid_min(fieldgroup_hdl%daddr) + valid_min_=valid_min__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_fieldgroup_attr_hdl_) + +END MODULE ifieldgroup_attr diff --git a/src/interface/fortran_attr/ifile_attr.F90 b/src/interface/fortran_attr/ifile_attr.F90 new file mode 100644 index 0000000..587781b --- /dev/null +++ b/src/interface/fortran_attr/ifile_attr.F90 @@ -0,0 +1,438 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE ifile_attr + USE, INTRINSIC :: ISO_C_BINDING + USE ifile + USE file_interface_attr + +CONTAINS + + SUBROUTINE xios(set_file_attr) & + ( file_id, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(file)) :: file_hdl + CHARACTER(LEN=*), INTENT(IN) ::file_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + INTEGER , OPTIONAL, INTENT(IN) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_freq + INTEGER , OPTIONAL, INTENT(IN) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(get_file_handle)(file_id,file_hdl) + CALL xios(set_file_attr_hdl_) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(set_file_attr) + + SUBROUTINE xios(set_file_attr_hdl) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(file)) , INTENT(IN) :: file_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + INTEGER , OPTIONAL, INTENT(IN) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_freq + INTEGER , OPTIONAL, INTENT(IN) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(set_file_attr_hdl_) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(set_file_attr_hdl) + + SUBROUTINE xios(set_file_attr_hdl_) & + ( file_hdl, description_, enabled_, min_digits_, name_, name_suffix_, output_freq_, output_level_ & + , par_access_, split_freq_, split_freq_format_, sync_freq_, type_ ) + + IMPLICIT NONE + TYPE(txios(file)) , INTENT(IN) :: file_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description_ + LOGICAL , OPTIONAL, INTENT(IN) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + INTEGER , OPTIONAL, INTENT(IN) :: min_digits_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_suffix_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_freq_ + INTEGER , OPTIONAL, INTENT(IN) :: output_level_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: par_access_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_format_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: sync_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_ + + IF (PRESENT(description_)) THEN + CALL cxios_set_file_description(file_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=enabled_ + CALL cxios_set_file_enabled(file_hdl%daddr, enabled__tmp) + ENDIF + + IF (PRESENT(min_digits_)) THEN + CALL cxios_set_file_min_digits(file_hdl%daddr, min_digits_) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_file_name(file_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(name_suffix_)) THEN + CALL cxios_set_file_name_suffix(file_hdl%daddr, name_suffix_, len(name_suffix_)) + ENDIF + + IF (PRESENT(output_freq_)) THEN + CALL cxios_set_file_output_freq(file_hdl%daddr, output_freq_, len(output_freq_)) + ENDIF + + IF (PRESENT(output_level_)) THEN + CALL cxios_set_file_output_level(file_hdl%daddr, output_level_) + ENDIF + + IF (PRESENT(par_access_)) THEN + CALL cxios_set_file_par_access(file_hdl%daddr, par_access_, len(par_access_)) + ENDIF + + IF (PRESENT(split_freq_)) THEN + CALL cxios_set_file_split_freq(file_hdl%daddr, split_freq_, len(split_freq_)) + ENDIF + + IF (PRESENT(split_freq_format_)) THEN + CALL cxios_set_file_split_freq_format(file_hdl%daddr, split_freq_format_, len(split_freq_format_)) + ENDIF + + IF (PRESENT(sync_freq_)) THEN + CALL cxios_set_file_sync_freq(file_hdl%daddr, sync_freq_, len(sync_freq_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_set_file_type(file_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(set_file_attr_hdl_) + + SUBROUTINE xios(get_file_attr) & + ( file_id, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(file)) :: file_hdl + CHARACTER(LEN=*), INTENT(IN) ::file_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + INTEGER , OPTIONAL, INTENT(OUT) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_freq + INTEGER , OPTIONAL, INTENT(OUT) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_file_handle)(file_id,file_hdl) + CALL xios(get_file_attr_hdl_) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(get_file_attr) + + SUBROUTINE xios(get_file_attr_hdl) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(file)) , INTENT(IN) :: file_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + INTEGER , OPTIONAL, INTENT(OUT) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_freq + INTEGER , OPTIONAL, INTENT(OUT) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_file_attr_hdl_) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(get_file_attr_hdl) + + SUBROUTINE xios(get_file_attr_hdl_) & + ( file_hdl, description_, enabled_, min_digits_, name_, name_suffix_, output_freq_, output_level_ & + , par_access_, split_freq_, split_freq_format_, sync_freq_, type_ ) + + IMPLICIT NONE + TYPE(txios(file)) , INTENT(IN) :: file_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description_ + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + INTEGER , OPTIONAL, INTENT(OUT) :: min_digits_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_suffix_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_freq_ + INTEGER , OPTIONAL, INTENT(OUT) :: output_level_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: par_access_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_format_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: sync_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_ + + IF (PRESENT(description_)) THEN + CALL cxios_get_file_description(file_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + CALL cxios_get_file_enabled(file_hdl%daddr, enabled__tmp) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(min_digits_)) THEN + CALL cxios_get_file_min_digits(file_hdl%daddr, min_digits_) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_file_name(file_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(name_suffix_)) THEN + CALL cxios_get_file_name_suffix(file_hdl%daddr, name_suffix_, len(name_suffix_)) + ENDIF + + IF (PRESENT(output_freq_)) THEN + CALL cxios_get_file_output_freq(file_hdl%daddr, output_freq_, len(output_freq_)) + ENDIF + + IF (PRESENT(output_level_)) THEN + CALL cxios_get_file_output_level(file_hdl%daddr, output_level_) + ENDIF + + IF (PRESENT(par_access_)) THEN + CALL cxios_get_file_par_access(file_hdl%daddr, par_access_, len(par_access_)) + ENDIF + + IF (PRESENT(split_freq_)) THEN + CALL cxios_get_file_split_freq(file_hdl%daddr, split_freq_, len(split_freq_)) + ENDIF + + IF (PRESENT(split_freq_format_)) THEN + CALL cxios_get_file_split_freq_format(file_hdl%daddr, split_freq_format_, len(split_freq_format_)) + ENDIF + + IF (PRESENT(sync_freq_)) THEN + CALL cxios_get_file_sync_freq(file_hdl%daddr, sync_freq_, len(sync_freq_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_get_file_type(file_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(get_file_attr_hdl_) + + SUBROUTINE xios(is_defined_file_attr) & + ( file_id, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(file)) :: file_hdl + CHARACTER(LEN=*), INTENT(IN) ::file_id + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: min_digits + LOGICAL(KIND=C_BOOL) :: min_digits_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_suffix + LOGICAL(KIND=C_BOOL) :: name_suffix_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_freq + LOGICAL(KIND=C_BOOL) :: output_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_level + LOGICAL(KIND=C_BOOL) :: output_level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: par_access + LOGICAL(KIND=C_BOOL) :: par_access_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq + LOGICAL(KIND=C_BOOL) :: split_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_format + LOGICAL(KIND=C_BOOL) :: split_freq_format_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: sync_freq + LOGICAL(KIND=C_BOOL) :: sync_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(get_file_handle)(file_id,file_hdl) + CALL xios(is_defined_file_attr_hdl_) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(is_defined_file_attr) + + SUBROUTINE xios(is_defined_file_attr_hdl) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(file)) , INTENT(IN) :: file_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: min_digits + LOGICAL(KIND=C_BOOL) :: min_digits_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_suffix + LOGICAL(KIND=C_BOOL) :: name_suffix_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_freq + LOGICAL(KIND=C_BOOL) :: output_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_level + LOGICAL(KIND=C_BOOL) :: output_level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: par_access + LOGICAL(KIND=C_BOOL) :: par_access_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq + LOGICAL(KIND=C_BOOL) :: split_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_format + LOGICAL(KIND=C_BOOL) :: split_freq_format_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: sync_freq + LOGICAL(KIND=C_BOOL) :: sync_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(is_defined_file_attr_hdl_) & + ( file_hdl, description, enabled, min_digits, name, name_suffix, output_freq, output_level, par_access & + , split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(is_defined_file_attr_hdl) + + SUBROUTINE xios(is_defined_file_attr_hdl_) & + ( file_hdl, description_, enabled_, min_digits_, name_, name_suffix_, output_freq_, output_level_ & + , par_access_, split_freq_, split_freq_format_, sync_freq_, type_ ) + + IMPLICIT NONE + TYPE(txios(file)) , INTENT(IN) :: file_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: description_ + LOGICAL(KIND=C_BOOL) :: description__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL(KIND=C_BOOL) :: enabled__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: min_digits_ + LOGICAL(KIND=C_BOOL) :: min_digits__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_suffix_ + LOGICAL(KIND=C_BOOL) :: name_suffix__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_freq_ + LOGICAL(KIND=C_BOOL) :: output_freq__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_level_ + LOGICAL(KIND=C_BOOL) :: output_level__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: par_access_ + LOGICAL(KIND=C_BOOL) :: par_access__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_ + LOGICAL(KIND=C_BOOL) :: split_freq__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_format_ + LOGICAL(KIND=C_BOOL) :: split_freq_format__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: sync_freq_ + LOGICAL(KIND=C_BOOL) :: sync_freq__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type_ + LOGICAL(KIND=C_BOOL) :: type__tmp + + IF (PRESENT(description_)) THEN + description__tmp=cxios_is_defined_file_description(file_hdl%daddr) + description_=description__tmp + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=cxios_is_defined_file_enabled(file_hdl%daddr) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(min_digits_)) THEN + min_digits__tmp=cxios_is_defined_file_min_digits(file_hdl%daddr) + min_digits_=min_digits__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_file_name(file_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(name_suffix_)) THEN + name_suffix__tmp=cxios_is_defined_file_name_suffix(file_hdl%daddr) + name_suffix_=name_suffix__tmp + ENDIF + + IF (PRESENT(output_freq_)) THEN + output_freq__tmp=cxios_is_defined_file_output_freq(file_hdl%daddr) + output_freq_=output_freq__tmp + ENDIF + + IF (PRESENT(output_level_)) THEN + output_level__tmp=cxios_is_defined_file_output_level(file_hdl%daddr) + output_level_=output_level__tmp + ENDIF + + IF (PRESENT(par_access_)) THEN + par_access__tmp=cxios_is_defined_file_par_access(file_hdl%daddr) + par_access_=par_access__tmp + ENDIF + + IF (PRESENT(split_freq_)) THEN + split_freq__tmp=cxios_is_defined_file_split_freq(file_hdl%daddr) + split_freq_=split_freq__tmp + ENDIF + + IF (PRESENT(split_freq_format_)) THEN + split_freq_format__tmp=cxios_is_defined_file_split_freq_format(file_hdl%daddr) + split_freq_format_=split_freq_format__tmp + ENDIF + + IF (PRESENT(sync_freq_)) THEN + sync_freq__tmp=cxios_is_defined_file_sync_freq(file_hdl%daddr) + sync_freq_=sync_freq__tmp + ENDIF + + IF (PRESENT(type_)) THEN + type__tmp=cxios_is_defined_file_type(file_hdl%daddr) + type_=type__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_file_attr_hdl_) + +END MODULE ifile_attr diff --git a/src/interface/fortran_attr/ifilegroup_attr.F90 b/src/interface/fortran_attr/ifilegroup_attr.F90 new file mode 100644 index 0000000..45e536c --- /dev/null +++ b/src/interface/fortran_attr/ifilegroup_attr.F90 @@ -0,0 +1,463 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE ifilegroup_attr + USE, INTRINSIC :: ISO_C_BINDING + USE ifile + USE filegroup_interface_attr + +CONTAINS + + SUBROUTINE xios(set_filegroup_attr) & + ( filegroup_id, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(filegroup)) :: filegroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::filegroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + INTEGER , OPTIONAL, INTENT(IN) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_freq + INTEGER , OPTIONAL, INTENT(IN) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(get_filegroup_handle)(filegroup_id,filegroup_hdl) + CALL xios(set_filegroup_attr_hdl_) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(set_filegroup_attr) + + SUBROUTINE xios(set_filegroup_attr_hdl) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(filegroup)) , INTENT(IN) :: filegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + LOGICAL , OPTIONAL, INTENT(IN) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + INTEGER , OPTIONAL, INTENT(IN) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_freq + INTEGER , OPTIONAL, INTENT(IN) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(set_filegroup_attr_hdl_) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(set_filegroup_attr_hdl) + + SUBROUTINE xios(set_filegroup_attr_hdl_) & + ( filegroup_hdl, description_, enabled_, group_ref_, min_digits_, name_, name_suffix_, output_freq_ & + , output_level_, par_access_, split_freq_, split_freq_format_, sync_freq_, type_ ) + + IMPLICIT NONE + TYPE(txios(filegroup)) , INTENT(IN) :: filegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description_ + LOGICAL , OPTIONAL, INTENT(IN) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_ + INTEGER , OPTIONAL, INTENT(IN) :: min_digits_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_suffix_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: output_freq_ + INTEGER , OPTIONAL, INTENT(IN) :: output_level_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: par_access_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: split_freq_format_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: sync_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_ + + IF (PRESENT(description_)) THEN + CALL cxios_set_filegroup_description(filegroup_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=enabled_ + CALL cxios_set_filegroup_enabled(filegroup_hdl%daddr, enabled__tmp) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_set_filegroup_group_ref(filegroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(min_digits_)) THEN + CALL cxios_set_filegroup_min_digits(filegroup_hdl%daddr, min_digits_) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_filegroup_name(filegroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(name_suffix_)) THEN + CALL cxios_set_filegroup_name_suffix(filegroup_hdl%daddr, name_suffix_, len(name_suffix_)) + ENDIF + + IF (PRESENT(output_freq_)) THEN + CALL cxios_set_filegroup_output_freq(filegroup_hdl%daddr, output_freq_, len(output_freq_)) + ENDIF + + IF (PRESENT(output_level_)) THEN + CALL cxios_set_filegroup_output_level(filegroup_hdl%daddr, output_level_) + ENDIF + + IF (PRESENT(par_access_)) THEN + CALL cxios_set_filegroup_par_access(filegroup_hdl%daddr, par_access_, len(par_access_)) + ENDIF + + IF (PRESENT(split_freq_)) THEN + CALL cxios_set_filegroup_split_freq(filegroup_hdl%daddr, split_freq_, len(split_freq_)) + ENDIF + + IF (PRESENT(split_freq_format_)) THEN + CALL cxios_set_filegroup_split_freq_format(filegroup_hdl%daddr, split_freq_format_, len(split_freq_format_)) + ENDIF + + IF (PRESENT(sync_freq_)) THEN + CALL cxios_set_filegroup_sync_freq(filegroup_hdl%daddr, sync_freq_, len(sync_freq_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_set_filegroup_type(filegroup_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(set_filegroup_attr_hdl_) + + SUBROUTINE xios(get_filegroup_attr) & + ( filegroup_id, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(filegroup)) :: filegroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::filegroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_freq + INTEGER , OPTIONAL, INTENT(OUT) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_filegroup_handle)(filegroup_id,filegroup_hdl) + CALL xios(get_filegroup_attr_hdl_) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(get_filegroup_attr) + + SUBROUTINE xios(get_filegroup_attr_hdl) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(filegroup)) , INTENT(IN) :: filegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled + LOGICAL (KIND=C_BOOL) :: enabled_tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + INTEGER , OPTIONAL, INTENT(OUT) :: min_digits + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_suffix + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_freq + INTEGER , OPTIONAL, INTENT(OUT) :: output_level + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: par_access + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_format + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: sync_freq + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_filegroup_attr_hdl_) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(get_filegroup_attr_hdl) + + SUBROUTINE xios(get_filegroup_attr_hdl_) & + ( filegroup_hdl, description_, enabled_, group_ref_, min_digits_, name_, name_suffix_, output_freq_ & + , output_level_, par_access_, split_freq_, split_freq_format_, sync_freq_, type_ ) + + IMPLICIT NONE + TYPE(txios(filegroup)) , INTENT(IN) :: filegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description_ + LOGICAL , OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL (KIND=C_BOOL) :: enabled__tmp + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_ + INTEGER , OPTIONAL, INTENT(OUT) :: min_digits_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_suffix_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: output_freq_ + INTEGER , OPTIONAL, INTENT(OUT) :: output_level_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: par_access_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: split_freq_format_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: sync_freq_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_ + + IF (PRESENT(description_)) THEN + CALL cxios_get_filegroup_description(filegroup_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(enabled_)) THEN + CALL cxios_get_filegroup_enabled(filegroup_hdl%daddr, enabled__tmp) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_get_filegroup_group_ref(filegroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(min_digits_)) THEN + CALL cxios_get_filegroup_min_digits(filegroup_hdl%daddr, min_digits_) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_filegroup_name(filegroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(name_suffix_)) THEN + CALL cxios_get_filegroup_name_suffix(filegroup_hdl%daddr, name_suffix_, len(name_suffix_)) + ENDIF + + IF (PRESENT(output_freq_)) THEN + CALL cxios_get_filegroup_output_freq(filegroup_hdl%daddr, output_freq_, len(output_freq_)) + ENDIF + + IF (PRESENT(output_level_)) THEN + CALL cxios_get_filegroup_output_level(filegroup_hdl%daddr, output_level_) + ENDIF + + IF (PRESENT(par_access_)) THEN + CALL cxios_get_filegroup_par_access(filegroup_hdl%daddr, par_access_, len(par_access_)) + ENDIF + + IF (PRESENT(split_freq_)) THEN + CALL cxios_get_filegroup_split_freq(filegroup_hdl%daddr, split_freq_, len(split_freq_)) + ENDIF + + IF (PRESENT(split_freq_format_)) THEN + CALL cxios_get_filegroup_split_freq_format(filegroup_hdl%daddr, split_freq_format_, len(split_freq_format_)) + ENDIF + + IF (PRESENT(sync_freq_)) THEN + CALL cxios_get_filegroup_sync_freq(filegroup_hdl%daddr, sync_freq_, len(sync_freq_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_get_filegroup_type(filegroup_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(get_filegroup_attr_hdl_) + + SUBROUTINE xios(is_defined_filegroup_attr) & + ( filegroup_id, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(filegroup)) :: filegroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::filegroup_id + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: min_digits + LOGICAL(KIND=C_BOOL) :: min_digits_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_suffix + LOGICAL(KIND=C_BOOL) :: name_suffix_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_freq + LOGICAL(KIND=C_BOOL) :: output_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_level + LOGICAL(KIND=C_BOOL) :: output_level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: par_access + LOGICAL(KIND=C_BOOL) :: par_access_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq + LOGICAL(KIND=C_BOOL) :: split_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_format + LOGICAL(KIND=C_BOOL) :: split_freq_format_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: sync_freq + LOGICAL(KIND=C_BOOL) :: sync_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(get_filegroup_handle)(filegroup_id,filegroup_hdl) + CALL xios(is_defined_filegroup_attr_hdl_) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(is_defined_filegroup_attr) + + SUBROUTINE xios(is_defined_filegroup_attr_hdl) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + IMPLICIT NONE + TYPE(txios(filegroup)) , INTENT(IN) :: filegroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled + LOGICAL(KIND=C_BOOL) :: enabled_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: min_digits + LOGICAL(KIND=C_BOOL) :: min_digits_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_suffix + LOGICAL(KIND=C_BOOL) :: name_suffix_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_freq + LOGICAL(KIND=C_BOOL) :: output_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_level + LOGICAL(KIND=C_BOOL) :: output_level_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: par_access + LOGICAL(KIND=C_BOOL) :: par_access_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq + LOGICAL(KIND=C_BOOL) :: split_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_format + LOGICAL(KIND=C_BOOL) :: split_freq_format_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: sync_freq + LOGICAL(KIND=C_BOOL) :: sync_freq_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(is_defined_filegroup_attr_hdl_) & + ( filegroup_hdl, description, enabled, group_ref, min_digits, name, name_suffix, output_freq & + , output_level, par_access, split_freq, split_freq_format, sync_freq, type ) + + END SUBROUTINE xios(is_defined_filegroup_attr_hdl) + + SUBROUTINE xios(is_defined_filegroup_attr_hdl_) & + ( filegroup_hdl, description_, enabled_, group_ref_, min_digits_, name_, name_suffix_, output_freq_ & + , output_level_, par_access_, split_freq_, split_freq_format_, sync_freq_, type_ ) + + IMPLICIT NONE + TYPE(txios(filegroup)) , INTENT(IN) :: filegroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: description_ + LOGICAL(KIND=C_BOOL) :: description__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: enabled_ + LOGICAL(KIND=C_BOOL) :: enabled__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL(KIND=C_BOOL) :: group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: min_digits_ + LOGICAL(KIND=C_BOOL) :: min_digits__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_suffix_ + LOGICAL(KIND=C_BOOL) :: name_suffix__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_freq_ + LOGICAL(KIND=C_BOOL) :: output_freq__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: output_level_ + LOGICAL(KIND=C_BOOL) :: output_level__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: par_access_ + LOGICAL(KIND=C_BOOL) :: par_access__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_ + LOGICAL(KIND=C_BOOL) :: split_freq__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: split_freq_format_ + LOGICAL(KIND=C_BOOL) :: split_freq_format__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: sync_freq_ + LOGICAL(KIND=C_BOOL) :: sync_freq__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type_ + LOGICAL(KIND=C_BOOL) :: type__tmp + + IF (PRESENT(description_)) THEN + description__tmp=cxios_is_defined_filegroup_description(filegroup_hdl%daddr) + description_=description__tmp + ENDIF + + IF (PRESENT(enabled_)) THEN + enabled__tmp=cxios_is_defined_filegroup_enabled(filegroup_hdl%daddr) + enabled_=enabled__tmp + ENDIF + + IF (PRESENT(group_ref_)) THEN + group_ref__tmp=cxios_is_defined_filegroup_group_ref(filegroup_hdl%daddr) + group_ref_=group_ref__tmp + ENDIF + + IF (PRESENT(min_digits_)) THEN + min_digits__tmp=cxios_is_defined_filegroup_min_digits(filegroup_hdl%daddr) + min_digits_=min_digits__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_filegroup_name(filegroup_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(name_suffix_)) THEN + name_suffix__tmp=cxios_is_defined_filegroup_name_suffix(filegroup_hdl%daddr) + name_suffix_=name_suffix__tmp + ENDIF + + IF (PRESENT(output_freq_)) THEN + output_freq__tmp=cxios_is_defined_filegroup_output_freq(filegroup_hdl%daddr) + output_freq_=output_freq__tmp + ENDIF + + IF (PRESENT(output_level_)) THEN + output_level__tmp=cxios_is_defined_filegroup_output_level(filegroup_hdl%daddr) + output_level_=output_level__tmp + ENDIF + + IF (PRESENT(par_access_)) THEN + par_access__tmp=cxios_is_defined_filegroup_par_access(filegroup_hdl%daddr) + par_access_=par_access__tmp + ENDIF + + IF (PRESENT(split_freq_)) THEN + split_freq__tmp=cxios_is_defined_filegroup_split_freq(filegroup_hdl%daddr) + split_freq_=split_freq__tmp + ENDIF + + IF (PRESENT(split_freq_format_)) THEN + split_freq_format__tmp=cxios_is_defined_filegroup_split_freq_format(filegroup_hdl%daddr) + split_freq_format_=split_freq_format__tmp + ENDIF + + IF (PRESENT(sync_freq_)) THEN + sync_freq__tmp=cxios_is_defined_filegroup_sync_freq(filegroup_hdl%daddr) + sync_freq_=sync_freq__tmp + ENDIF + + IF (PRESENT(type_)) THEN + type__tmp=cxios_is_defined_filegroup_type(filegroup_hdl%daddr) + type_=type__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_filegroup_attr_hdl_) + +END MODULE ifilegroup_attr diff --git a/src/interface/fortran_attr/igrid_attr.F90 b/src/interface/fortran_attr/igrid_attr.F90 new file mode 100644 index 0000000..0b37c57 --- /dev/null +++ b/src/interface/fortran_attr/igrid_attr.F90 @@ -0,0 +1,250 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE igrid_attr + USE, INTRINSIC :: ISO_C_BINDING + USE igrid + USE grid_interface_attr + +CONTAINS + + SUBROUTINE xios(set_grid_attr) & + ( grid_id, axis_ref, description, domain_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(grid)) :: grid_hdl + CHARACTER(LEN=*), INTENT(IN) ::grid_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + + CALL xios(get_grid_handle)(grid_id,grid_hdl) + CALL xios(set_grid_attr_hdl_) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + END SUBROUTINE xios(set_grid_attr) + + SUBROUTINE xios(set_grid_attr_hdl) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(grid)) , INTENT(IN) :: grid_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + + CALL xios(set_grid_attr_hdl_) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + END SUBROUTINE xios(set_grid_attr_hdl) + + SUBROUTINE xios(set_grid_attr_hdl_) & + ( grid_hdl, axis_ref_, description_, domain_ref_, mask_, name_ ) + + IMPLICIT NONE + TYPE(txios(grid)) , INTENT(IN) :: grid_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref_ + LOGICAL , OPTIONAL, INTENT(IN) :: mask_(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_set_grid_axis_ref(grid_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(description_)) THEN + CALL cxios_set_grid_description(grid_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_set_grid_domain_ref(grid_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2),size(mask_,3))) + mask__tmp=mask_ + CALL cxios_set_grid_mask(grid_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2),size(mask_,3)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_grid_name(grid_hdl%daddr, name_, len(name_)) + ENDIF + + + + END SUBROUTINE xios(set_grid_attr_hdl_) + + SUBROUTINE xios(get_grid_attr) & + ( grid_id, axis_ref, description, domain_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(grid)) :: grid_hdl + CHARACTER(LEN=*), INTENT(IN) ::grid_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + + CALL xios(get_grid_handle)(grid_id,grid_hdl) + CALL xios(get_grid_attr_hdl_) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + END SUBROUTINE xios(get_grid_attr) + + SUBROUTINE xios(get_grid_attr_hdl) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(grid)) , INTENT(IN) :: grid_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + + CALL xios(get_grid_attr_hdl_) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + END SUBROUTINE xios(get_grid_attr_hdl) + + SUBROUTINE xios(get_grid_attr_hdl_) & + ( grid_hdl, axis_ref_, description_, domain_ref_, mask_, name_ ) + + IMPLICIT NONE + TYPE(txios(grid)) , INTENT(IN) :: grid_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL , OPTIONAL, INTENT(OUT) :: mask_(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_get_grid_axis_ref(grid_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(description_)) THEN + CALL cxios_get_grid_description(grid_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_get_grid_domain_ref(grid_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2),size(mask_,3))) + CALL cxios_get_grid_mask(grid_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2),size(mask_,3)) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_grid_name(grid_hdl%daddr, name_, len(name_)) + ENDIF + + + + END SUBROUTINE xios(get_grid_attr_hdl_) + + SUBROUTINE xios(is_defined_grid_attr) & + ( grid_id, axis_ref, description, domain_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(grid)) :: grid_hdl + CHARACTER(LEN=*), INTENT(IN) ::grid_id + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + + CALL xios(get_grid_handle)(grid_id,grid_hdl) + CALL xios(is_defined_grid_attr_hdl_) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + END SUBROUTINE xios(is_defined_grid_attr) + + SUBROUTINE xios(is_defined_grid_attr_hdl) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(grid)) , INTENT(IN) :: grid_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + + CALL xios(is_defined_grid_attr_hdl_) & + ( grid_hdl, axis_ref, description, domain_ref, mask, name ) + + END SUBROUTINE xios(is_defined_grid_attr_hdl) + + SUBROUTINE xios(is_defined_grid_attr_hdl_) & + ( grid_hdl, axis_ref_, description_, domain_ref_, mask_, name_ ) + + IMPLICIT NONE + TYPE(txios(grid)) , INTENT(IN) :: grid_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref_ + LOGICAL(KIND=C_BOOL) :: axis_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: description_ + LOGICAL(KIND=C_BOOL) :: description__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL(KIND=C_BOOL) :: domain_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask_ + LOGICAL(KIND=C_BOOL) :: mask__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + + IF (PRESENT(axis_ref_)) THEN + axis_ref__tmp=cxios_is_defined_grid_axis_ref(grid_hdl%daddr) + axis_ref_=axis_ref__tmp + ENDIF + + IF (PRESENT(description_)) THEN + description__tmp=cxios_is_defined_grid_description(grid_hdl%daddr) + description_=description__tmp + ENDIF + + IF (PRESENT(domain_ref_)) THEN + domain_ref__tmp=cxios_is_defined_grid_domain_ref(grid_hdl%daddr) + domain_ref_=domain_ref__tmp + ENDIF + + IF (PRESENT(mask_)) THEN + mask__tmp=cxios_is_defined_grid_mask(grid_hdl%daddr) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_grid_name(grid_hdl%daddr) + name_=name__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_grid_attr_hdl_) + +END MODULE igrid_attr diff --git a/src/interface/fortran_attr/igridgroup_attr.F90 b/src/interface/fortran_attr/igridgroup_attr.F90 new file mode 100644 index 0000000..ca39ef8 --- /dev/null +++ b/src/interface/fortran_attr/igridgroup_attr.F90 @@ -0,0 +1,275 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE igridgroup_attr + USE, INTRINSIC :: ISO_C_BINDING + USE igrid + USE gridgroup_interface_attr + +CONTAINS + + SUBROUTINE xios(set_gridgroup_attr) & + ( gridgroup_id, axis_ref, description, domain_ref, group_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) :: gridgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::gridgroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + + CALL xios(get_gridgroup_handle)(gridgroup_id,gridgroup_hdl) + CALL xios(set_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + END SUBROUTINE xios(set_gridgroup_attr) + + SUBROUTINE xios(set_gridgroup_attr_hdl) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) , INTENT(IN) :: gridgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + LOGICAL , OPTIONAL, INTENT(IN) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + + CALL xios(set_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + END SUBROUTINE xios(set_gridgroup_attr_hdl) + + SUBROUTINE xios(set_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref_, description_, domain_ref_, group_ref_, mask_, name_ ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) , INTENT(IN) :: gridgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: axis_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: description_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: domain_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_ + LOGICAL , OPTIONAL, INTENT(IN) :: mask_(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_set_gridgroup_axis_ref(gridgroup_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(description_)) THEN + CALL cxios_set_gridgroup_description(gridgroup_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_set_gridgroup_domain_ref(gridgroup_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_set_gridgroup_group_ref(gridgroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2),size(mask_,3))) + mask__tmp=mask_ + CALL cxios_set_gridgroup_mask(gridgroup_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2),size(mask_,3)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_gridgroup_name(gridgroup_hdl%daddr, name_, len(name_)) + ENDIF + + + + END SUBROUTINE xios(set_gridgroup_attr_hdl_) + + SUBROUTINE xios(get_gridgroup_attr) & + ( gridgroup_id, axis_ref, description, domain_ref, group_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) :: gridgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::gridgroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + + CALL xios(get_gridgroup_handle)(gridgroup_id,gridgroup_hdl) + CALL xios(get_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + END SUBROUTINE xios(get_gridgroup_attr) + + SUBROUTINE xios(get_gridgroup_attr_hdl) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) , INTENT(IN) :: gridgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL , OPTIONAL, INTENT(OUT) :: mask(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask_tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + + CALL xios(get_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + END SUBROUTINE xios(get_gridgroup_attr_hdl) + + SUBROUTINE xios(get_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref_, description_, domain_ref_, group_ref_, mask_, name_ ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) , INTENT(IN) :: gridgroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: axis_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: description_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: domain_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL , OPTIONAL, INTENT(OUT) :: mask_(:,:,:) + LOGICAL (KIND=C_BOOL) , ALLOCATABLE :: mask__tmp(:,:,:) + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + + IF (PRESENT(axis_ref_)) THEN + CALL cxios_get_gridgroup_axis_ref(gridgroup_hdl%daddr, axis_ref_, len(axis_ref_)) + ENDIF + + IF (PRESENT(description_)) THEN + CALL cxios_get_gridgroup_description(gridgroup_hdl%daddr, description_, len(description_)) + ENDIF + + IF (PRESENT(domain_ref_)) THEN + CALL cxios_get_gridgroup_domain_ref(gridgroup_hdl%daddr, domain_ref_, len(domain_ref_)) + ENDIF + + IF (PRESENT(group_ref_)) THEN + CALL cxios_get_gridgroup_group_ref(gridgroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(mask_)) THEN + ALLOCATE(mask__tmp(size(mask_,1),size(mask_,2),size(mask_,3))) + CALL cxios_get_gridgroup_mask(gridgroup_hdl%daddr, mask__tmp,size(mask_,1),size(mask_,2),size(mask_,3)) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_gridgroup_name(gridgroup_hdl%daddr, name_, len(name_)) + ENDIF + + + + END SUBROUTINE xios(get_gridgroup_attr_hdl_) + + SUBROUTINE xios(is_defined_gridgroup_attr) & + ( gridgroup_id, axis_ref, description, domain_ref, group_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) :: gridgroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::gridgroup_id + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + + CALL xios(get_gridgroup_handle)(gridgroup_id,gridgroup_hdl) + CALL xios(is_defined_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + END SUBROUTINE xios(is_defined_gridgroup_attr) + + SUBROUTINE xios(is_defined_gridgroup_attr_hdl) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) , INTENT(IN) :: gridgroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref + LOGICAL(KIND=C_BOOL) :: axis_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: description + LOGICAL(KIND=C_BOOL) :: description_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref + LOGICAL(KIND=C_BOOL) :: domain_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask + LOGICAL(KIND=C_BOOL) :: mask_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + + CALL xios(is_defined_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref, description, domain_ref, group_ref, mask, name ) + + END SUBROUTINE xios(is_defined_gridgroup_attr_hdl) + + SUBROUTINE xios(is_defined_gridgroup_attr_hdl_) & + ( gridgroup_hdl, axis_ref_, description_, domain_ref_, group_ref_, mask_, name_ ) + + IMPLICIT NONE + TYPE(txios(gridgroup)) , INTENT(IN) :: gridgroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: axis_ref_ + LOGICAL(KIND=C_BOOL) :: axis_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: description_ + LOGICAL(KIND=C_BOOL) :: description__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: domain_ref_ + LOGICAL(KIND=C_BOOL) :: domain_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL(KIND=C_BOOL) :: group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: mask_ + LOGICAL(KIND=C_BOOL) :: mask__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + + IF (PRESENT(axis_ref_)) THEN + axis_ref__tmp=cxios_is_defined_gridgroup_axis_ref(gridgroup_hdl%daddr) + axis_ref_=axis_ref__tmp + ENDIF + + IF (PRESENT(description_)) THEN + description__tmp=cxios_is_defined_gridgroup_description(gridgroup_hdl%daddr) + description_=description__tmp + ENDIF + + IF (PRESENT(domain_ref_)) THEN + domain_ref__tmp=cxios_is_defined_gridgroup_domain_ref(gridgroup_hdl%daddr) + domain_ref_=domain_ref__tmp + ENDIF + + IF (PRESENT(group_ref_)) THEN + group_ref__tmp=cxios_is_defined_gridgroup_group_ref(gridgroup_hdl%daddr) + group_ref_=group_ref__tmp + ENDIF + + IF (PRESENT(mask_)) THEN + mask__tmp=cxios_is_defined_gridgroup_mask(gridgroup_hdl%daddr) + mask_=mask__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_gridgroup_name(gridgroup_hdl%daddr) + name_=name__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_gridgroup_attr_hdl_) + +END MODULE igridgroup_attr diff --git a/src/interface/fortran_attr/ivariable_attr.F90 b/src/interface/fortran_attr/ivariable_attr.F90 new file mode 100644 index 0000000..a7f8190 --- /dev/null +++ b/src/interface/fortran_attr/ivariable_attr.F90 @@ -0,0 +1,165 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE ivariable_attr + USE, INTRINSIC :: ISO_C_BINDING + USE ivariable + USE variable_interface_attr + +CONTAINS + + SUBROUTINE xios(set_variable_attr) & + ( variable_id, name, type ) + + IMPLICIT NONE + TYPE(txios(variable)) :: variable_hdl + CHARACTER(LEN=*), INTENT(IN) ::variable_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(get_variable_handle)(variable_id,variable_hdl) + CALL xios(set_variable_attr_hdl_) & + ( variable_hdl, name, type ) + + END SUBROUTINE xios(set_variable_attr) + + SUBROUTINE xios(set_variable_attr_hdl) & + ( variable_hdl, name, type ) + + IMPLICIT NONE + TYPE(txios(variable)) , INTENT(IN) :: variable_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(set_variable_attr_hdl_) & + ( variable_hdl, name, type ) + + END SUBROUTINE xios(set_variable_attr_hdl) + + SUBROUTINE xios(set_variable_attr_hdl_) & + ( variable_hdl, name_, type_ ) + + IMPLICIT NONE + TYPE(txios(variable)) , INTENT(IN) :: variable_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_ + + IF (PRESENT(name_)) THEN + CALL cxios_set_variable_name(variable_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_set_variable_type(variable_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(set_variable_attr_hdl_) + + SUBROUTINE xios(get_variable_attr) & + ( variable_id, name, type ) + + IMPLICIT NONE + TYPE(txios(variable)) :: variable_hdl + CHARACTER(LEN=*), INTENT(IN) ::variable_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_variable_handle)(variable_id,variable_hdl) + CALL xios(get_variable_attr_hdl_) & + ( variable_hdl, name, type ) + + END SUBROUTINE xios(get_variable_attr) + + SUBROUTINE xios(get_variable_attr_hdl) & + ( variable_hdl, name, type ) + + IMPLICIT NONE + TYPE(txios(variable)) , INTENT(IN) :: variable_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_variable_attr_hdl_) & + ( variable_hdl, name, type ) + + END SUBROUTINE xios(get_variable_attr_hdl) + + SUBROUTINE xios(get_variable_attr_hdl_) & + ( variable_hdl, name_, type_ ) + + IMPLICIT NONE + TYPE(txios(variable)) , INTENT(IN) :: variable_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_ + + IF (PRESENT(name_)) THEN + CALL cxios_get_variable_name(variable_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_get_variable_type(variable_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(get_variable_attr_hdl_) + + SUBROUTINE xios(is_defined_variable_attr) & + ( variable_id, name, type ) + + IMPLICIT NONE + TYPE(txios(variable)) :: variable_hdl + CHARACTER(LEN=*), INTENT(IN) ::variable_id + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(get_variable_handle)(variable_id,variable_hdl) + CALL xios(is_defined_variable_attr_hdl_) & + ( variable_hdl, name, type ) + + END SUBROUTINE xios(is_defined_variable_attr) + + SUBROUTINE xios(is_defined_variable_attr_hdl) & + ( variable_hdl, name, type ) + + IMPLICIT NONE + TYPE(txios(variable)) , INTENT(IN) :: variable_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(is_defined_variable_attr_hdl_) & + ( variable_hdl, name, type ) + + END SUBROUTINE xios(is_defined_variable_attr_hdl) + + SUBROUTINE xios(is_defined_variable_attr_hdl_) & + ( variable_hdl, name_, type_ ) + + IMPLICIT NONE + TYPE(txios(variable)) , INTENT(IN) :: variable_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type_ + LOGICAL(KIND=C_BOOL) :: type__tmp + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_variable_name(variable_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(type_)) THEN + type__tmp=cxios_is_defined_variable_type(variable_hdl%daddr) + type_=type__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_variable_attr_hdl_) + +END MODULE ivariable_attr diff --git a/src/interface/fortran_attr/ivariablegroup_attr.F90 b/src/interface/fortran_attr/ivariablegroup_attr.F90 new file mode 100644 index 0000000..9cf2318 --- /dev/null +++ b/src/interface/fortran_attr/ivariablegroup_attr.F90 @@ -0,0 +1,190 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * +#include "xios_fortran_prefix.hpp" + +MODULE ivariablegroup_attr + USE, INTRINSIC :: ISO_C_BINDING + USE ivariable + USE variablegroup_interface_attr + +CONTAINS + + SUBROUTINE xios(set_variablegroup_attr) & + ( variablegroup_id, group_ref, name, type ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) :: variablegroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::variablegroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(get_variablegroup_handle)(variablegroup_id,variablegroup_hdl) + CALL xios(set_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref, name, type ) + + END SUBROUTINE xios(set_variablegroup_attr) + + SUBROUTINE xios(set_variablegroup_attr_hdl) & + ( variablegroup_hdl, group_ref, name, type ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) , INTENT(IN) :: variablegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type + + CALL xios(set_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref, name, type ) + + END SUBROUTINE xios(set_variablegroup_attr_hdl) + + SUBROUTINE xios(set_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref_, name_, type_ ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) , INTENT(IN) :: variablegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_ + + IF (PRESENT(group_ref_)) THEN + CALL cxios_set_variablegroup_group_ref(variablegroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_set_variablegroup_name(variablegroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_set_variablegroup_type(variablegroup_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(set_variablegroup_attr_hdl_) + + SUBROUTINE xios(get_variablegroup_attr) & + ( variablegroup_id, group_ref, name, type ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) :: variablegroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::variablegroup_id + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_variablegroup_handle)(variablegroup_id,variablegroup_hdl) + CALL xios(get_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref, name, type ) + + END SUBROUTINE xios(get_variablegroup_attr) + + SUBROUTINE xios(get_variablegroup_attr_hdl) & + ( variablegroup_hdl, group_ref, name, type ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) , INTENT(IN) :: variablegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type + + CALL xios(get_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref, name, type ) + + END SUBROUTINE xios(get_variablegroup_attr_hdl) + + SUBROUTINE xios(get_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref_, name_, type_ ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) , INTENT(IN) :: variablegroup_hdl + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_ + CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_ + + IF (PRESENT(group_ref_)) THEN + CALL cxios_get_variablegroup_group_ref(variablegroup_hdl%daddr, group_ref_, len(group_ref_)) + ENDIF + + IF (PRESENT(name_)) THEN + CALL cxios_get_variablegroup_name(variablegroup_hdl%daddr, name_, len(name_)) + ENDIF + + IF (PRESENT(type_)) THEN + CALL cxios_get_variablegroup_type(variablegroup_hdl%daddr, type_, len(type_)) + ENDIF + + + + END SUBROUTINE xios(get_variablegroup_attr_hdl_) + + SUBROUTINE xios(is_defined_variablegroup_attr) & + ( variablegroup_id, group_ref, name, type ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) :: variablegroup_hdl + CHARACTER(LEN=*), INTENT(IN) ::variablegroup_id + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(get_variablegroup_handle)(variablegroup_id,variablegroup_hdl) + CALL xios(is_defined_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref, name, type ) + + END SUBROUTINE xios(is_defined_variablegroup_attr) + + SUBROUTINE xios(is_defined_variablegroup_attr_hdl) & + ( variablegroup_hdl, group_ref, name, type ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) , INTENT(IN) :: variablegroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref + LOGICAL(KIND=C_BOOL) :: group_ref_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name + LOGICAL(KIND=C_BOOL) :: name_tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type + LOGICAL(KIND=C_BOOL) :: type_tmp + + CALL xios(is_defined_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref, name, type ) + + END SUBROUTINE xios(is_defined_variablegroup_attr_hdl) + + SUBROUTINE xios(is_defined_variablegroup_attr_hdl_) & + ( variablegroup_hdl, group_ref_, name_, type_ ) + + IMPLICIT NONE + TYPE(txios(variablegroup)) , INTENT(IN) :: variablegroup_hdl + LOGICAL, OPTIONAL, INTENT(OUT) :: group_ref_ + LOGICAL(KIND=C_BOOL) :: group_ref__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: name_ + LOGICAL(KIND=C_BOOL) :: name__tmp + LOGICAL, OPTIONAL, INTENT(OUT) :: type_ + LOGICAL(KIND=C_BOOL) :: type__tmp + + IF (PRESENT(group_ref_)) THEN + group_ref__tmp=cxios_is_defined_variablegroup_group_ref(variablegroup_hdl%daddr) + group_ref_=group_ref__tmp + ENDIF + + IF (PRESENT(name_)) THEN + name__tmp=cxios_is_defined_variablegroup_name(variablegroup_hdl%daddr) + name_=name__tmp + ENDIF + + IF (PRESENT(type_)) THEN + type__tmp=cxios_is_defined_variablegroup_type(variablegroup_hdl%daddr) + type_=type__tmp + ENDIF + + + + END SUBROUTINE xios(is_defined_variablegroup_attr_hdl_) + +END MODULE ivariablegroup_attr diff --git a/src/interface/fortran_attr/variable_interface_attr.f90 b/src/interface/fortran_attr/variable_interface_attr.f90 new file mode 100644 index 0000000..de5a190 --- /dev/null +++ b/src/interface/fortran_attr/variable_interface_attr.f90 @@ -0,0 +1,55 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE variable_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_variable_name(variable_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_variable_name + + SUBROUTINE cxios_get_variable_name(variable_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_variable_name + + FUNCTION cxios_is_defined_variable_name(variable_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_variable_name + INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl + END FUNCTION cxios_is_defined_variable_name + + + SUBROUTINE cxios_set_variable_type(variable_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_set_variable_type + + SUBROUTINE cxios_get_variable_type(variable_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_get_variable_type + + FUNCTION cxios_is_defined_variable_type(variable_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_variable_type + INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl + END FUNCTION cxios_is_defined_variable_type + + + END INTERFACE + +END MODULE variable_interface_attr diff --git a/src/interface/fortran_attr/variablegroup_interface_attr.f90 b/src/interface/fortran_attr/variablegroup_interface_attr.f90 new file mode 100644 index 0000000..495b48b --- /dev/null +++ b/src/interface/fortran_attr/variablegroup_interface_attr.f90 @@ -0,0 +1,76 @@ +! * ************************************************************************** * +! * Interface auto generated - do not modify * +! * ************************************************************************** * + +MODULE variablegroup_interface_attr + USE, INTRINSIC :: ISO_C_BINDING + + INTERFACE ! Do not call directly / interface FORTRAN 2003 <-> C99 + + + SUBROUTINE cxios_set_variablegroup_group_ref(variablegroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_set_variablegroup_group_ref + + SUBROUTINE cxios_get_variablegroup_group_ref(variablegroup_hdl, group_ref, group_ref_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: group_ref + INTEGER (kind = C_INT) , VALUE :: group_ref_size + END SUBROUTINE cxios_get_variablegroup_group_ref + + FUNCTION cxios_is_defined_variablegroup_group_ref(variablegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_variablegroup_group_ref + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + END FUNCTION cxios_is_defined_variablegroup_group_ref + + + SUBROUTINE cxios_set_variablegroup_name(variablegroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_set_variablegroup_name + + SUBROUTINE cxios_get_variablegroup_name(variablegroup_hdl, name, name_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: name + INTEGER (kind = C_INT) , VALUE :: name_size + END SUBROUTINE cxios_get_variablegroup_name + + FUNCTION cxios_is_defined_variablegroup_name(variablegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_variablegroup_name + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + END FUNCTION cxios_is_defined_variablegroup_name + + + SUBROUTINE cxios_set_variablegroup_type(variablegroup_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_set_variablegroup_type + + SUBROUTINE cxios_get_variablegroup_type(variablegroup_hdl, type, type_size) BIND(C) + USE ISO_C_BINDING + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + CHARACTER(kind = C_CHAR) , DIMENSION(*) :: type + INTEGER (kind = C_INT) , VALUE :: type_size + END SUBROUTINE cxios_get_variablegroup_type + + FUNCTION cxios_is_defined_variablegroup_type(variablegroup_hdl ) BIND(C) + USE ISO_C_BINDING + LOGICAL(kind=C_BOOL) :: cxios_is_defined_variablegroup_type + INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl + END FUNCTION cxios_is_defined_variablegroup_type + + + END INTERFACE + +END MODULE variablegroup_interface_attr diff --git a/src/log.cpp b/src/log.cpp new file mode 100644 index 0000000..c851603 --- /dev/null +++ b/src/log.cpp @@ -0,0 +1,7 @@ +#include "log.hpp" + +namespace xios +{ + CLog info("info") ; + CLog report("report") ; +} diff --git a/src/log.hpp b/src/log.hpp new file mode 100644 index 0000000..d03088c --- /dev/null +++ b/src/log.hpp @@ -0,0 +1,54 @@ +#ifndef __XIOS_LOG_HPP__ +#define __XIOS_LOG_HPP__ + +#include +#include +#include + +namespace xios +{ + using namespace std ; + + class CLog : public ostream + { + public : + CLog(const string& name_) : ostream(cout.rdbuf()),level(0),name(name_), strBuf_(cout.rdbuf()) {} + CLog& operator()(int l) + { + if (l<=level) + { + rdbuf(strBuf_); + *this<<"-> "< +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "memtrack.hpp" +#undef new // IMPORTANT! + +extern "C" +{ + void addr2line(const char *file_name, char** addr, int naddr) ; +} +/* ------------------------------------------------------------ */ +/* -------------------- namespace MemTrack -------------------- */ +/* ------------------------------------------------------------ */ + +namespace MemTrack +{ + + /* ------------------------------------------------------------ */ + /* --------------------- class BlockHeader -------------------- */ + /* ------------------------------------------------------------ */ + + class BlockHeader + { + private: // static member variables + static BlockHeader *ourFirstNode; + + private: // member variables + BlockHeader *myPrevNode; + BlockHeader *myNextNode; + size_t myRequestedSize; + char const *myFilename; + int myLineNum; + char const *myTypeName; + + size_t stackSize ; + void* stackArray[20] ; + + public: // members + BlockHeader(size_t requestedSize); + ~BlockHeader(); + + size_t GetRequestedSize() const { return myRequestedSize; } + char const *GetFilename() const { return myFilename; } + int GetLineNum() const { return myLineNum; } + char const *GetTypeName() const { return myTypeName; } + + void Stamp(char const *filename, int lineNum, char const *typeName); + void backTrace(void) ; + + static void AddNode(BlockHeader *node); + static void RemoveNode(BlockHeader *node); + static size_t CountBlocks(); + static void GetBlocks(BlockHeader **blockHeaderPP); + static bool TypeGreaterThan(BlockHeader *header1, BlockHeader *header2); + }; + + /* ---------------------------------------- BlockHeader static member variables */ + + BlockHeader *BlockHeader::ourFirstNode = NULL; + + /* ---------------------------------------- BlockHeader constructor */ + + BlockHeader::BlockHeader(size_t requestedSize) + { + myPrevNode = NULL; + myNextNode = NULL; + myRequestedSize = requestedSize; + myFilename = "[unknown]"; + myLineNum = 0; + myTypeName = "[unknown]"; + stackSize=backtrace(stackArray,20) ; + } + + /* ---------------------------------------- BlockHeader destructor */ + + BlockHeader::~BlockHeader() + { + } + + /* ---------------------------------------- BlockHeader Stamp */ + + void BlockHeader::Stamp(char const *filename, int lineNum, char const *typeName) + { + myFilename = filename; + myLineNum = lineNum; + myTypeName = typeName; + } + + void BlockHeader::backTrace(void) + { + +// oss<<"addr2line -C -f -i -s -e ../bin/test_client.exe " ; + char *addr ; + char buffer[20] ; + addr=buffer ; + for(int i=0;imyPrevNode == NULL); + assert(node->myNextNode == NULL); + + // If we have at least one node in the list ... + if (ourFirstNode != NULL) + { + // ... make the new node the first node's predecessor. + assert(ourFirstNode->myPrevNode == NULL); + ourFirstNode->myPrevNode = node; + } + + // Make the first node the new node's succesor. + node->myNextNode = ourFirstNode; + + // Make the new node the first node. + ourFirstNode = node; + } + + /* ---------------------------------------- BlockHeader RemoveNode */ + + void BlockHeader::RemoveNode(BlockHeader *node) + { + assert(node != NULL); + assert(ourFirstNode != NULL); + + // If target node is the first node in the list... + if (ourFirstNode == node) + { + // ... make the target node's successor the first node. + assert(ourFirstNode->myPrevNode == NULL); + ourFirstNode = node->myNextNode; + } + + // Link target node's predecessor, if any, to its successor. + if (node->myPrevNode != NULL) + { + node->myPrevNode->myNextNode = node->myNextNode; + } + + // Link target node's successor, if any, to its predecessor. + if (node->myNextNode != NULL) + { + node->myNextNode->myPrevNode = node->myPrevNode; + } + + // Clear target node's previous and next pointers. + node->myPrevNode = NULL; + node->myNextNode = NULL; + } + + /* ---------------------------------------- BlockHeader CountBlocks */ + + size_t BlockHeader::CountBlocks() + { + size_t count = 0; + BlockHeader *currNode = ourFirstNode; + while (currNode != NULL) + { + count++; + currNode = currNode->myNextNode; + } + return count; + } + + /* ---------------------------------------- BlockHeader GetBlocks */ + + void BlockHeader::GetBlocks(BlockHeader **blockHeaderPP) + { + BlockHeader *currNode = ourFirstNode; + while (currNode != NULL) + { + *blockHeaderPP = currNode; + blockHeaderPP++; + currNode = currNode->myNextNode; + } + } + + /* ---------------------------------------- BlockHeader TypeGreaterThan */ + + bool BlockHeader::TypeGreaterThan(BlockHeader *header1, BlockHeader *header2) + { + return (strcmp(header1->myTypeName, header2->myTypeName) > 0); + } + + /* ------------------------------------------------------------ */ + /* ---------------------- class Signature --------------------- */ + /* ------------------------------------------------------------ */ + + class Signature + { + private: // constants + static const unsigned int SIGNATURE1 = 0xCAFEBABE; + static const unsigned int SIGNATURE2 = 0xFACEFACE; + + private: // member variables + unsigned int mySignature1; + unsigned int mySignature2; + + public: // construction/destruction + Signature() : mySignature1(SIGNATURE1), mySignature2(SIGNATURE2) {}; + ~Signature() { mySignature1 = 0; mySignature2 = 0; } + + public: // static member functions + static bool IsValidSignature(const Signature *pProspectiveSignature) + { + try + { + if (pProspectiveSignature->mySignature1 != SIGNATURE1) return false; + if (pProspectiveSignature->mySignature2 != SIGNATURE2) return false; + return true; + } + catch (...) + { + return false; + } + } + }; + + /* ------------------------------------------------------------ */ + /* -------------------- address conversion -------------------- */ + /* ------------------------------------------------------------ */ + + /* We divide the memory blocks we allocate into two "chunks", the + * "prolog chunk" where we store information about the allocation, + * and the "user chunk" which we return to the caller to use. + */ + + /* ---------------------------------------- alignment */ + + const size_t ALIGNMENT = 4; + + /* If "value" (a memory size or offset) falls on an alignment boundary, + * then just return it. Otherwise return the smallest number larger + * than "value" that falls on an alignment boundary. + */ + + #define PAD_TO_ALIGNMENT_BOUNDARY(value) \ + ((value) + ((ALIGNMENT - ((value) % ALIGNMENT)) % ALIGNMENT)) + + /* ---------------------------------------- chunk structs */ + + /* We declare incomplete structures for each chunk, just to + * provide type safety. + */ + + struct PrologChunk; + struct UserChunk; + + /* ---------------------------------------- chunk sizes and offsets */ + + const size_t SIZE_BlockHeader = PAD_TO_ALIGNMENT_BOUNDARY(sizeof(BlockHeader)); + const size_t SIZE_Signature = PAD_TO_ALIGNMENT_BOUNDARY(sizeof(Signature)); + + const size_t OFFSET_BlockHeader = 0; + const size_t OFFSET_Signature = OFFSET_BlockHeader + SIZE_BlockHeader; + const size_t OFFSET_UserChunk = OFFSET_Signature + SIZE_Signature; + + const size_t SIZE_PrologChunk = OFFSET_UserChunk; + + /* ---------------------------------------- GetUserAddress */ + + static UserChunk *GetUserAddress(PrologChunk *pProlog) + { + char *pchProlog = reinterpret_cast(pProlog); + char *pchUser = pchProlog + OFFSET_UserChunk; + UserChunk *pUser = reinterpret_cast(pchUser); + return pUser; + } + + /* ---------------------------------------- GetPrologAddress */ + + static PrologChunk *GetPrologAddress(UserChunk *pUser) + { + char *pchUser = reinterpret_cast(pUser); + char *pchProlog = pchUser - OFFSET_UserChunk; + PrologChunk *pProlog = reinterpret_cast(pchProlog); + return pProlog; + } + + /* ---------------------------------------- GetHeaderAddress */ + + static BlockHeader *GetHeaderAddress(PrologChunk *pProlog) + { + char *pchProlog = reinterpret_cast(pProlog); + char *pchHeader = pchProlog + OFFSET_BlockHeader; + BlockHeader *pHeader = reinterpret_cast(pchHeader); + return pHeader; + } + + /* ---------------------------------------- GetSignatureAddress */ + + static Signature *GetSignatureAddress(PrologChunk *pProlog) + { + char *pchProlog = reinterpret_cast(pProlog); + char *pchSignature = pchProlog + OFFSET_Signature; + Signature *pSignature = reinterpret_cast(pchSignature); + return pSignature; + } + + /* ------------------------------------------------------------ */ + /* -------------- memory allocation and stamping -------------- */ + /* ------------------------------------------------------------ */ + + /* ---------------------------------------- TrackMalloc */ + + void *TrackMalloc(size_t size) + { + // Allocate the memory, including space for the prolog. + PrologChunk *pProlog = (PrologChunk *)malloc(SIZE_PrologChunk + size); + + // If the allocation failed, then return NULL. + if (pProlog == NULL) return NULL; + + // Use placement new to construct the block header in place. + BlockHeader *pBlockHeader = new (pProlog) BlockHeader(size); + + // Link the block header into the list of extant block headers. + BlockHeader::AddNode(pBlockHeader); + + // Use placement new to construct the signature in place. + Signature *pSignature = new (GetSignatureAddress(pProlog)) Signature; + + // Get the offset to the user chunk and return it. + UserChunk *pUser = GetUserAddress(pProlog); + + return pUser; + } + + /* ---------------------------------------- TrackFree */ + + void TrackFree(void *p) + { + // It's perfectly valid for "p" to be null; return if it is. + if (p == NULL) return; + + // Get the prolog address for this memory block. + UserChunk *pUser = reinterpret_cast(p); + PrologChunk *pProlog = GetPrologAddress(pUser); + + // Check the signature, and if it's invalid, return immediately. + Signature *pSignature = GetSignatureAddress(pProlog); + if (!Signature::IsValidSignature(pSignature)) return; + + // Destroy the signature. + pSignature->~Signature(); + pSignature = NULL; + + // Unlink the block header from the list and destroy it. + BlockHeader *pBlockHeader = GetHeaderAddress(pProlog); + BlockHeader::RemoveNode(pBlockHeader); + pBlockHeader->~BlockHeader(); + pBlockHeader = NULL; + + // Free the memory block. + free(pProlog); + } + + /* ---------------------------------------- TrackStamp */ + + void TrackStamp(void *p, const MemStamp &stamp, char const *typeName) + { + // Get the header and signature address for this pointer. + UserChunk *pUser = reinterpret_cast(p); + PrologChunk *pProlog = GetPrologAddress(pUser); + BlockHeader *pHeader = GetHeaderAddress(pProlog); + Signature *pSignature = GetSignatureAddress(pProlog); + + // If the signature is not valid, then return immediately. + if (!Signature::IsValidSignature(pSignature)) return; + + // "Stamp" the information onto the header. + pHeader->Stamp(stamp.filename, stamp.lineNum, typeName); + } + + /* ---------------------------------------- TrackDumpBlocks */ + + void TrackDumpBlocks() + { + // Get an array of pointers to all extant blocks. + size_t numBlocks = BlockHeader::CountBlocks(); + BlockHeader **ppBlockHeader = + (BlockHeader **)calloc(numBlocks, sizeof(*ppBlockHeader)); + BlockHeader::GetBlocks(ppBlockHeader); + + // Dump information about the memory blocks. + printf("\n"); + printf("=====================\n"); + printf("Current Memory Blocks\n"); + printf("=====================\n"); + printf("\n"); + for (size_t i = 0; i < numBlocks; i++) + { + BlockHeader *pBlockHeader = ppBlockHeader[i]; + char const *typeName = pBlockHeader->GetTypeName(); + size_t size = pBlockHeader->GetRequestedSize(); + char const *fileName = pBlockHeader->GetFilename(); + int lineNum = pBlockHeader->GetLineNum(); + printf("*** #%-6d %5d bytes %-50s\n", i, size, typeName); + printf("... %s:%d\n", fileName, lineNum); + pBlockHeader->backTrace(); + } + + // Clean up. + free(ppBlockHeader); + } + + /* ---------------------------------------- struct MemDigest */ + + struct MemDigest + { + char const *typeName; + int blockCount; + size_t totalSize; + + static bool TotalSizeGreaterThan(const MemDigest &md1, const MemDigest &md2) + { return md1.totalSize > md2.totalSize; } + }; + + + /* ---------------------------------------- SummarizeMemoryUsageForType */ + + static void SummarizeMemoryUsageForType( + MemDigest *pMemDigest, + BlockHeader **ppBlockHeader, + size_t startPost, + size_t endPost + ) + { + pMemDigest->typeName = ppBlockHeader[startPost]->GetTypeName(); + pMemDigest->blockCount = 0; + pMemDigest->totalSize = 0; + for (size_t i = startPost; i < endPost; i++) + { + pMemDigest->blockCount++; + pMemDigest->totalSize += ppBlockHeader[i]->GetRequestedSize(); + assert(strcmp(ppBlockHeader[i]->GetTypeName(), pMemDigest->typeName) == 0); + } + } + + /* ---------------------------------------- TrackListMemoryUsage */ + + void TrackListMemoryUsage() + { + // If there are no allocated blocks, then return now. + size_t numBlocks = BlockHeader::CountBlocks(); + if (numBlocks == 0) return; + + // Get an array of pointers to all extant blocks. + BlockHeader **ppBlockHeader = + (BlockHeader **)calloc(numBlocks, sizeof(*ppBlockHeader)); + BlockHeader::GetBlocks(ppBlockHeader); + + // Sort the blocks by type name. + std::sort( + ppBlockHeader, + ppBlockHeader + numBlocks, + BlockHeader::TypeGreaterThan + ); + + // Find out how many unique types we have. + size_t numUniqueTypes = 1; + for (size_t i = 1; i < numBlocks; i++) + { + char const *prevTypeName = ppBlockHeader[i - 1]->GetTypeName(); + char const *currTypeName = ppBlockHeader[i]->GetTypeName(); + if (strcmp(prevTypeName, currTypeName) != 0) numUniqueTypes++; + } + + // Create an array of "digests" summarizing memory usage by type. + size_t startPost = 0; + size_t uniqueTypeIndex = 0; + MemDigest *pMemDigestArray = + (MemDigest *)calloc(numUniqueTypes, sizeof(*pMemDigestArray)); + for (size_t i = 1; i <= numBlocks; i++) // yes, less than or *equal* to + { + char const *prevTypeName = ppBlockHeader[i - 1]->GetTypeName(); + char const *currTypeName = (i < numBlocks) ? ppBlockHeader[i]->GetTypeName() : ""; + if (strcmp(prevTypeName, currTypeName) != 0) + { + size_t endPost = i; + SummarizeMemoryUsageForType( + pMemDigestArray + uniqueTypeIndex, + ppBlockHeader, + startPost, + endPost + ); + startPost = endPost; + uniqueTypeIndex++; + } + } + assert(uniqueTypeIndex = numUniqueTypes); + + // Sort the digests by total memory usage. + std::sort( + pMemDigestArray, + pMemDigestArray + numUniqueTypes, + MemDigest::TotalSizeGreaterThan + ); + + // Compute the grand total memory usage. + size_t grandTotalNumBlocks = 0; + size_t grandTotalSize = 0; + for (size_t i = 0; i < numUniqueTypes; i++) + { + grandTotalNumBlocks += pMemDigestArray[i].blockCount; + grandTotalSize += pMemDigestArray[i].totalSize; + } + + // Dump the memory usage statistics. + printf("\n"); + printf("-----------------------\n"); + printf("Memory Usage Statistics\n"); + printf("-----------------------\n"); + printf("\n"); + printf("%-50s%5s %5s %7s %s \n", "allocated type", "blocks", "", "bytes", ""); + printf("%-50s%5s %5s %7s %s \n", "--------------", "------", "", "-----", ""); + + for (size_t i = 0; i < numUniqueTypes; i++) + { + MemDigest *pMD = pMemDigestArray + i; + size_t blockCount = pMD->blockCount; + double blockCountPct = 100.0 * blockCount / grandTotalNumBlocks; + size_t totalSize = pMD->totalSize; + double totalSizePct = 100.0 * totalSize / grandTotalSize; + + printf( + "%-50s %5d %5.1f%% %7d %5.1f%%\n", + pMD->typeName, + blockCount, + blockCountPct, + totalSize, + totalSizePct + ); + } + printf("%-50s %5s %5s %7s %s \n", "--------", "-----", "", "-------", ""); + printf("%-50s %5d %5s %7d %s \n", "[totals]", grandTotalNumBlocks, "", grandTotalSize, ""); + + // Clean up. + free(ppBlockHeader); + free(pMemDigestArray); + } + +} // namespace MemTrack + +/* ------------------------------------------------------------ */ +/* ---------------------- new and delete ---------------------- */ +/* ------------------------------------------------------------ */ + +/* ---------------------------------------- operator new */ + +void *operator new(size_t size) +{ + void *p = MemTrack::TrackMalloc(size); + if (p == NULL) throw std::bad_alloc(); + return p; +} + +/* ---------------------------------------- operator delete */ + +void operator delete(void *p) +{ + MemTrack::TrackFree(p); +} + +/* ---------------------------------------- operator new[] */ + +void *operator new[](size_t size) +{ + void *p = MemTrack::TrackMalloc(size); + if (p == NULL) throw std::bad_alloc(); + return p; +} + +/* ---------------------------------------- operator delete[] */ + +void operator delete[](void *p) +{ + MemTrack::TrackFree(p); +} + +#endif diff --git a/src/memtrack.hpp b/src/memtrack.hpp new file mode 100644 index 0000000..6e92795 --- /dev/null +++ b/src/memtrack.hpp @@ -0,0 +1,81 @@ +#ifdef XIOS_MEMTRACK +/* +Copyright (c) 2002, 2008 Curtis Bartley +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the +distribution. + +- Neither the name of Curtis Bartley nor the names of any other +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MemTrack_H_ +#define MemTrack_H_ + +#include +#include + +namespace MemTrack +{ + /* ---------------------------------------- class MemStamp */ + + class MemStamp + { + public: // member variables + char const * const filename; + int const lineNum; + public: // construction/destruction + MemStamp(char const *filename, int lineNum) + : filename(filename), lineNum(lineNum) { } + ~MemStamp() { } + }; + + /* ---------------------------------------- memory allocation and stamping prototypes */ + + void *TrackMalloc(size_t size); + void TrackFree(void *p); + void TrackStamp(void *p, const MemStamp &stamp, char const *typeName); + void TrackDumpBlocks(); + void TrackListMemoryUsage(); + + /* ---------------------------------------- operator * (MemStamp, ptr) */ + + template inline T *operator*(const MemStamp &stamp, T *p) + { + TrackStamp(p, stamp, typeid(T).name()); + return p; + } + +} // namespace MemTrack + +/* ---------------------------------------- new macro */ + +#define MEMTRACK_NEW MemTrack::MemStamp(__FILE__, __LINE__) * new +#define new MEMTRACK_NEW + +#endif // MemTrack_H_ + +#endif diff --git a/src/mpi.hpp b/src/mpi.hpp new file mode 100644 index 0000000..2850efa --- /dev/null +++ b/src/mpi.hpp @@ -0,0 +1,15 @@ +#ifndef __XIOS_MPI_HPP__ +#define __XIOS_MPI_HPP__ + +/* skip C++ Binding for mpich , intel MPI */ +#define MPICH_SKIP_MPICXX + +/* skip C++ Binding for SGI MPI library */ +#define MPI_NO_CPPBIND + +/* skip C++ Binding for OpenMPI */ +#define OMPI_SKIP_MPICXX + +#include + +#endif diff --git a/src/node/axis.cpp b/src/node/axis.cpp new file mode 100644 index 0000000..a4bd22f --- /dev/null +++ b/src/node/axis.cpp @@ -0,0 +1,85 @@ +#include "axis.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "message.hpp" +#include "type.hpp" +#include "xmlioserver_spl.hpp" + +namespace xios { + + /// ////////////////////// Définitions ////////////////////// /// + + CAxis::CAxis(void) + : CObjectTemplate() + , CAxisAttributes(), isChecked(false), relFiles() + { /* Ne rien faire de plus */ } + + CAxis::CAxis(const StdString & id) + : CObjectTemplate(id) + , CAxisAttributes(), isChecked(false), relFiles() + { /* Ne rien faire de plus */ } + + CAxis::~CAxis(void) + { /* Ne rien faire de plus */ } + + ///--------------------------------------------------------------- + + const std::set & CAxis::getRelFiles(void) const + { + return (this->relFiles); + } + + bool CAxis::IsWritten(const StdString & filename) const + { + return (this->relFiles.find(filename) != this->relFiles.end()); + } + + void CAxis::addRelFile(const StdString & filename) + { + this->relFiles.insert(filename); + } + + //---------------------------------------------------------------- + + StdString CAxis::GetName(void) { return (StdString("axis")); } + StdString CAxis::GetDefName(void){ return (CAxis::GetName()); } + ENodeType CAxis::GetType(void) { return (eAxis); } + + //---------------------------------------------------------------- + + void CAxis::checkAttributes(void) + { + if (this->isChecked) return; + if (this->size.isEmpty()) + ERROR("CAxis::checkAttributes(void)",<< "Attribut of the axis must be specified") ; + StdSize size = this->size.getValue(); + + StdSize zoom_begin,zoom_end, zoom_size ; + + zoom_begin = (this->zoom_begin.isEmpty()) ? 1 : this->zoom_begin.getValue() ; + zoom_end = (this->zoom_end.isEmpty()) ? size : this->zoom_end.getValue() ; + zoom_size = (this->zoom_size.isEmpty()) ? size : this->zoom_size.getValue() ; + + if (this->zoom_begin.isEmpty()) zoom_begin=zoom_end-zoom_size+1 ; + if (this->zoom_end.isEmpty()) zoom_end=zoom_begin+zoom_size-1 ; + if (this->zoom_size.isEmpty()) zoom_size=zoom_end-zoom_begin+1 ; + + if ( (zoom_begin < 1) || (zoom_begin > size) || (zoom_end<1) || (zoom_end>size) || (zoom_size<1) || (zoom_size>size) || (zoom_begin>zoom_end)) + ERROR("CAxis::checkAttributes(void)",<< "One or more attribut of , , , are not well specified") ; + this->zoom_begin.setValue(zoom_begin) ; + this->zoom_end.setValue(zoom_end) ; + this->zoom_size.setValue(zoom_size) ; + + StdSize true_size = value.numElements(); + if (size != true_size) + ERROR("CAxis::checkAttributes(void)", + << "The array \'value\' has a different size that the one defined by the \'size\' attribut") + + this->isChecked = true; + } + + ///--------------------------------------------------------------- + +} // namespace xios diff --git a/src/node/axis.hpp b/src/node/axis.hpp new file mode 100644 index 0000000..8a3af62 --- /dev/null +++ b/src/node/axis.hpp @@ -0,0 +1,87 @@ +#ifndef __XMLIO_CAxis__ +#define __XMLIO_CAxis__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "group_factory.hpp" + +#include "declare_group.hpp" +#include "attribute_array.hpp" +#include "attribute_enum.hpp" +#include "attribute_enum_impl.hpp" + +namespace xios { + + /// ////////////////////// Déclarations ////////////////////// /// + + class CAxisGroup; + class CAxisAttributes; + class CAxis; + + ///-------------------------------------------------------------- + + // Declare/Define CAxisAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CAxis) +# include "axis_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CAxis) + + ///-------------------------------------------------------------- + + class CAxis + : public CObjectTemplate + , public CAxisAttributes + { + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CAxisAttributes SuperClassAttribute; + + public : + + typedef CAxisAttributes RelAttributes; + typedef CAxisGroup RelGroup; + + /// Constructeurs /// + CAxis(void); + explicit CAxis(const StdString & id); + CAxis(const CAxis & axis); // Not implemented yet. + CAxis(const CAxis * const axis); // Not implemented yet. + + /// Accesseurs /// + const std::set & getRelFiles(void) const; + + /// Test /// + bool IsWritten(const StdString & filename) const; + + /// Mutateur /// + void addRelFile(const StdString & filename); + + /// Vérifications /// + void checkAttributes(void); + + /// Destructeur /// + virtual ~CAxis(void); + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + + static ENodeType GetType(void); + + private : + + bool isChecked; + std::set relFiles; + + + }; // class CAxis + + ///-------------------------------------------------------------- + + // Declare/Define CAxisGroup and CAxisDefinition + DECLARE_GROUP(CAxis); + + ///-------------------------------------------------------------- + +} // namespace xios + +#endif // __XMLIO_CAxis__ diff --git a/src/node/context.cpp b/src/node/context.cpp new file mode 100644 index 0000000..a355ac3 --- /dev/null +++ b/src/node/context.cpp @@ -0,0 +1,559 @@ +#include "context.hpp" +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "calendar_type.hpp" +#include "duration.hpp" + +#include "context_client.hpp" +#include "context_server.hpp" +#include "nc4_data_output.hpp" +#include "node_type.hpp" +#include "message.hpp" +#include "type.hpp" +#include "xmlioserver_spl.hpp" + +namespace xios { + + shared_ptr CContext::root ; + + /// ////////////////////// Définitions ////////////////////// /// + + CContext::CContext(void) + : CObjectTemplate(), CContextAttributes() + , calendar(),hasClient(false),hasServer(false) + { /* Ne rien faire de plus */ } + + CContext::CContext(const StdString & id) + : CObjectTemplate(id), CContextAttributes() + , calendar(),hasClient(false),hasServer(false) + { /* Ne rien faire de plus */ } + + CContext::~CContext(void) + { + if (hasClient) delete client ; + if (hasServer) delete server ; + } + + //---------------------------------------------------------------- + + StdString CContext::GetName(void) { return (StdString("context")); } + StdString CContext::GetDefName(void){ return (CContext::GetName()); } + ENodeType CContext::GetType(void) { return (eContext); } + + //---------------------------------------------------------------- + + CContextGroup* CContext::getRoot(void) + { + if (root.get()==NULL) root=shared_ptr(new CContextGroup(xml::CXMLNode::GetRootName())) ; + return root.get(); + } + + + //---------------------------------------------------------------- + + boost::shared_ptr CContext::getCalendar(void) const + { + return (this->calendar); + } + + //---------------------------------------------------------------- + + void CContext::setCalendar(boost::shared_ptr newCalendar) + { + this->calendar = newCalendar; + calendar_type.setValue(this->calendar->getId()); + start_date.setValue(this->calendar->getInitDate().toString()); + } + + //---------------------------------------------------------------- + + void CContext::solveCalendar(void) + { + if (this->calendar.get() != NULL) return; + if (calendar_type.isEmpty() || start_date.isEmpty()) + ERROR(" CContext::solveCalendar(void)", + << "[ context id = " << this->getId() << " ] " + << "Impossible to define a calendar (an attribute is missing)."); + +#define DECLARE_CALENDAR(MType , mtype) \ + if (calendar_type.getValue().compare(#mtype) == 0) \ + { \ + if (time_origin.isEmpty()) \ + this->calendar = boost::shared_ptr \ + (new C##MType##Calendar(start_date.getValue())); \ + else this->calendar = boost::shared_ptr \ + (new C##MType##Calendar(start_date.getValue(),time_origin.getValue())); \ + if (!this->timestep.isEmpty()) \ + this->calendar->setTimeStep \ + (CDuration::FromString(this->timestep.getValue())); \ + return; \ + } +#include "calendar_type.conf" + + ERROR("CContext::solveCalendar(void)", + << "[ calendar_type = " << calendar_type.getValue() << " ] " + << "The calendar is not defined !"); + } + + //---------------------------------------------------------------- + + void CContext::parse(xml::CXMLNode & node) + { + CContext::SuperClass::parse(node); + + // PARSING POUR GESTION DES ENFANTS + xml::THashAttributes attributes = node.getAttributes(); + + if (attributes.end() != attributes.find("src")) + { + StdIFStream ifs ( attributes["src"].c_str() , StdIFStream::in ); + if ( (ifs.rdstate() & std::ifstream::failbit ) != 0 ) + ERROR("void CContext::parse(xml::CXMLNode & node)", + < file" ); + if (!ifs.good()) + ERROR("CContext::parse(xml::CXMLNode & node)", + << "[ filename = " << attributes["src"] << " ] Bad xml stream !"); + xml::CXMLParser::ParseInclude(ifs, attributes["src"], *this); + } + + if (node.getElementName().compare(CContext::GetName())) + DEBUG("Le noeud is wrong defined but will be considered as a context !"); + + if (!(node.goToChildElement())) + { + DEBUG("Le context ne contient pas d'enfant !"); + } + else + { + do { // Parcours des contextes pour traitement. + + StdString name = node.getElementName(); + attributes.clear(); + attributes = node.getAttributes(); + + if (attributes.end() != attributes.find("id")) + { DEBUG(<< "Definition node has an id," + << "it will not be taking account !"); } + +#define DECLARE_NODE(Name_, name_) \ + if (name.compare(C##Name_##Definition::GetDefName()) == 0) \ + { C##Name_##Definition::create(C##Name_##Definition::GetDefName()) -> parse(node) ; continue; } +#define DECLARE_NODE_PAR(Name_, name_) +#include "node_type.conf" + + DEBUG(<< "The element \'" << name + << "\' in the context \'" << CContext::getCurrent()->getId() + << "\' is not a definition !"); + + } while (node.goToNextElement()); + + node.goToParentElement(); // Retour au parent + } + } + + //---------------------------------------------------------------- + + void CContext::ShowTree(StdOStream & out) + { + StdString currentContextId = CContext::getCurrent() -> getId() ; + std::vector def_vector = + CContext::getRoot()->getChildList(); + std::vector::iterator + it = def_vector.begin(), end = def_vector.end(); + + out << "" << std::endl; + out << "<" << xml::CXMLNode::GetRootName() << " >" << std::endl; + + for (; it != end; it++) + { + CContext* context = *it; + CContext::setCurrent(context->getId()); + out << *context << std::endl; + } + + out << "" << std::endl; + CContext::setCurrent(currentContextId); + } + + + //---------------------------------------------------------------- + + StdString CContext::toString(void) const + { + StdOStringStream oss; + oss << "<" << CContext::GetName() + << " id=\"" << this->getId() << "\" " + << SuperClassAttribute::toString() << ">" << std::endl; + if (!this->hasChild()) + { + //oss << "" << std::endl; // fait planter l'incrémentation + } + else + { + +#define DECLARE_NODE(Name_, name_) \ + if (C##Name_##Definition::has(C##Name_##Definition::GetDefName())) \ + oss << * C##Name_##Definition::get(C##Name_##Definition::GetDefName()) << std::endl; +#define DECLARE_NODE_PAR(Name_, name_) +#include "node_type.conf" + + } + + oss << ""; + + return (oss.str()); + } + + //---------------------------------------------------------------- + + void CContext::solveDescInheritance(bool apply, const CAttributeMap * const UNUSED(parent)) + { +#define DECLARE_NODE(Name_, name_) \ + if (C##Name_##Definition::has(C##Name_##Definition::GetDefName())) \ + C##Name_##Definition::get(C##Name_##Definition::GetDefName())->solveDescInheritance(apply); +#define DECLARE_NODE_PAR(Name_, name_) +#include "node_type.conf" + } + + //---------------------------------------------------------------- + + bool CContext::hasChild(void) const + { + return ( +#define DECLARE_NODE(Name_, name_) \ + C##Name_##Definition::has(C##Name_##Definition::GetDefName()) || +#define DECLARE_NODE_PAR(Name_, name_) +#include "node_type.conf" + false); +} + + //---------------------------------------------------------------- + + void CContext::solveFieldRefInheritance(bool apply) + { + if (!this->hasId()) return; + vector allField = CField::getAll() ; +// = CObjectTemplate::GetAllVectobject(this->getId()); + std::vector::iterator + it = allField.begin(), end = allField.end(); + + for (; it != end; it++) + { + CField* field = *it; + field->solveRefInheritance(apply); + } + } + + //---------------------------------------------------------------- + + void CContext::CleanTree(void) + { +#define DECLARE_NODE(Name_, name_) C##Name_##Group::ClearAllAttributes(); +#define DECLARE_NODE_PAR(Name_, name_) +#include "node_type.conf" + } + ///--------------------------------------------------------------- + + void CContext::initClient(MPI_Comm intraComm, MPI_Comm interComm) + { + hasClient=true ; + client = new CContextClient(this,intraComm, interComm) ; + } + + bool CContext::isInitialized(void) + { + return hasClient ; + } + + void CContext::initServer(MPI_Comm intraComm,MPI_Comm interComm) + { + hasServer=true ; + server = new CContextServer(this,intraComm,interComm) ; + } + + bool CContext::eventLoop(void) + { + return server->eventLoop() ; + } + + void CContext::finalize(void) + { + if (hasClient && !hasServer) + { + client->finalize() ; + } + if (hasServer) + { + closeAllFile() ; + } + } + + + + + void CContext::closeDefinition(void) + { + if (hasClient && !hasServer) sendCloseDefinition() ; + + solveCalendar(); + + // Résolution des héritages pour le context actuel. + this->solveAllInheritance(); + + //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir. + this->findEnabledFiles(); + + + this->processEnabledFiles() ; + +/* + //Recherche des champs à sortir (enable à true + niveau de sortie correct) + // pour chaque fichier précédemment listé. + this->findAllEnabledFields(); + + // Résolution des références de grilles pour chacun des champs. + this->solveAllGridRef(); + + // Traitement des opérations. + this->solveAllOperation(); + + // Traitement des expressions. + this->solveAllExpression(); +*/ + // Nettoyage de l'arborescence + CleanTree(); + if (hasClient) sendCreateFileHeader() ; + } + + void CContext::findAllEnabledFields(void) + { + for (unsigned int i = 0; i < this->enabledFiles.size(); i++) + (void)this->enabledFiles[i]->getEnabledFields(); + } + + void CContext::processEnabledFiles(void) + { + for (unsigned int i = 0; i < this->enabledFiles.size(); i++) + this->enabledFiles[i]->processEnabledFile(); + } + + + void CContext::solveAllGridRef(void) + { + for (unsigned int i = 0; i < this->enabledFiles.size(); i++) + this->enabledFiles[i]->solveEFGridRef(); + } + + void CContext::solveAllOperation(void) + { + for (unsigned int i = 0; i < this->enabledFiles.size(); i++) + this->enabledFiles[i]->solveEFOperation(); + } + + void CContext::solveAllExpression(void) + { + for (unsigned int i = 0; i < this->enabledFiles.size(); i++) + this->enabledFiles[i]->solveEFExpression(); + } + + void CContext::solveAllInheritance(bool apply) + { + // Résolution des héritages descendants (càd des héritages de groupes) + // pour chacun des contextes. + solveDescInheritance(apply); + + // Résolution des héritages par référence au niveau des fichiers. + const vector allFiles=CFile::getAll() ; + + for (unsigned int i = 0; i < allFiles.size(); i++) + allFiles[i]->solveFieldRefInheritance(apply); + } + + void CContext::findEnabledFiles(void) + { + const std::vector allFiles = CFile::getAll(); + + for (unsigned int i = 0; i < allFiles.size(); i++) + if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est défini. + { + if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixé à vrai. + enabledFiles.push_back(allFiles[i]); + } + else enabledFiles.push_back(allFiles[i]); // otherwise true by default + + + if (enabledFiles.size() == 0) + DEBUG(<<"Aucun fichier ne va être sorti dans le contexte nommé \"" + << getId() << "\" !"); + } + + void CContext::closeAllFile(void) + { + std::vector::const_iterator + it = this->enabledFiles.begin(), end = this->enabledFiles.end(); + + for (; it != end; it++) + { + info(30)<<"Closing File : "<<(*it)->getId()<close(); + } + } + + bool CContext::dispatchEvent(CEventServer& event) + { + + if (SuperClass::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_CLOSE_DEFINITION : + recvCloseDefinition(event) ; + return true ; + break ; + case EVENT_ID_UPDATE_CALENDAR : + recvUpdateCalendar(event) ; + return true ; + break ; + case EVENT_ID_CREATE_FILE_HEADER : + recvCreateFileHeader(event) ; + return true ; + break ; + default : + ERROR("bool CContext::dispatchEvent(CEventServer& event)", + <<"Unknown Event") ; + return false ; + } + } + } + + void CContext::sendCloseDefinition(void) + { + + CEventClient event(getType(),EVENT_ID_CLOSE_DEFINITION) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + event.push(client->getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + void CContext::recvCloseDefinition(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->closeDefinition() ; + } + + void CContext::sendUpdateCalendar(int step) + { + if (!hasServer) + { + CEventClient event(getType(),EVENT_ID_UPDATE_CALENDAR) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId()<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + } + + void CContext::recvUpdateCalendar(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvUpdateCalendar(*buffer) ; + } + + void CContext::recvUpdateCalendar(CBufferIn& buffer) + { + int step ; + buffer>>step ; + updateCalendar(step) ; + } + + void CContext::sendCreateFileHeader(void) + { + + CEventClient event(getType(),EVENT_ID_CREATE_FILE_HEADER) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + event.push(client->getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + void CContext::recvCreateFileHeader(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvCreateFileHeader(*buffer) ; + } + + void CContext::recvCreateFileHeader(CBufferIn& buffer) + { + createFileHeader() ; + } + + void CContext::updateCalendar(int step) + { + info(50)<<"updateCalendar : before : "<getCurrentDate()<update(step) ; + info(50)<<"updateCalendar : after : "<getCurrentDate()<::const_iterator it ; + + for (it=enabledFiles.begin(); it != enabledFiles.end(); it++) + { + (*it)->initFile(); + } + } + + CContext* CContext::getCurrent(void) + { + return CObjectFactory::GetObject(CObjectFactory::GetCurrentContextId()).get() ; + } + + void CContext::setCurrent(const string& id) + { + CObjectFactory::SetCurrentContextId(id); + CGroupFactory::SetCurrentContextId(id); + } + + CContext* CContext::create(const StdString& id) + { + CContext::setCurrent(id) ; + + bool hasctxt = CContext::has(id); + CContext* context = CObjectFactory::CreateObject(id).get(); + getRoot() ; + if (!hasctxt) CGroupFactory::AddChild(root, context->getShared()); + +#define DECLARE_NODE(Name_, name_) \ + C##Name_##Definition::create(C##Name_##Definition::GetDefName()); +#define DECLARE_NODE_PAR(Name_, name_) +#include "node_type.conf" + + return (context); + } +} // namespace xios diff --git a/src/node/context.hpp b/src/node/context.hpp new file mode 100644 index 0000000..726012a --- /dev/null +++ b/src/node/context.hpp @@ -0,0 +1,165 @@ +#ifndef __XMLIO_CContext__ +#define __XMLIO_CContext__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +//#include "node_type.hpp" +#include "calendar.hpp" + +#include "declare_group.hpp" +//#include "context_client.hpp" +//#include "context_server.hpp" +#include "data_output.hpp" + +#include "mpi.hpp" + + +namespace xios { + class CContextClient ; + class CContextServer ; + + + /// ////////////////////// Déclarations ////////////////////// /// + class CContextGroup; + class CContextAttributes; + class CContext; + class CFile; + ///-------------------------------------------------------------- + + // Declare/Define CFileAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CContext) +# include "context_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CContext) + + ///-------------------------------------------------------------- + + class CContext + : public CObjectTemplate + , public CContextAttributes + { + public : + enum EEventId + { + EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR, + EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE + } ; + + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CContextAttributes SuperClassAttribute; + + public : + + typedef CContextAttributes RelAttributes; + typedef CContext RelGroup; + + //--------------------------------------------------------- + + public : + + /// Constructeurs /// + CContext(void); + explicit CContext(const StdString & id); + CContext(const CContext & context); // Not implemented yet. + CContext(const CContext * const context); // Not implemented yet. + + /// Destructeur /// + virtual ~CContext(void); + + //--------------------------------------------------------- + + public : + + /// Mutateurs /// + void setCalendar(boost::shared_ptr newCalendar); + + /// Accesseurs /// + boost::shared_ptr getCalendar(void) const; + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + static ENodeType GetType(void); + + static CContextGroup* GetContextGroup(void); + + public : + + /// Traitements /// + virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0); + void solveFieldRefInheritance(bool apply); + void solveCalendar(void); + + /// Autres méthodes statiques /// + static void ShowTree(StdOStream & out = std::clog); + static void CleanTree(void); + + /// Test /// + virtual bool hasChild(void) const; + + bool eventLoop(void) ; + bool serverLoop(void) ; + void clientLoop(void) ; + void initServer(MPI_Comm intraComm, MPI_Comm interComm) ; + void initClient(MPI_Comm intraComm, MPI_Comm interComm) ; + bool isInitialized(void) ; + CContextServer* server ; + CContextClient* client ; + bool hasClient ; + bool hasServer ; + void finalize(void) ; + void closeDefinition(void) ; + void findAllEnabledFields(void); + void processEnabledFiles(void) ; + void solveAllGridRef(void); + void solveAllOperation(void); + void solveAllExpression(void); + void solveAllInheritance(bool apply=true) ; + void findEnabledFiles(void); + void closeAllFile(void) ; + void updateCalendar(int step) ; + void createFileHeader(void ) ; + // dispatch event + static bool dispatchEvent(CEventServer& event) ; + void sendCloseDefinition(void) ; + void sendUpdateCalendar(int step) ; + void sendCreateFileHeader(void) ; + static void recvUpdateCalendar(CEventServer& event) ; + void recvUpdateCalendar(CBufferIn& buffer) ; + static void recvCloseDefinition(CEventServer& event) ; + static void recvCreateFileHeader(CEventServer& event) ; + void recvCreateFileHeader(CBufferIn& buffer) ; + static CContext* getCurrent(void) ; + static CContextGroup* getRoot(void) ; + static void setCurrent(const string& id) ; + static CContext* create(const string& id = "") ; + + public : + + /// Autres /// + virtual void parse(xml::CXMLNode & node); + + virtual StdString toString(void) const; +// virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + + public : + + boost::shared_ptr calendar; + + std::vector enabledFiles; + static shared_ptr root ; + + + }; // class CContext + + ///-------------------------------------------------------------- + + // Declare/Define CContextGroup and CContextDefinition + DECLARE_GROUP(CContext); + + ///-------------------------------------------------------------- + +} // namespace xios + +#endif // __XMLIO_CContext__ diff --git a/src/node/domain.cpp b/src/node/domain.cpp new file mode 100644 index 0000000..f37ab22 --- /dev/null +++ b/src/node/domain.cpp @@ -0,0 +1,890 @@ +#include "domain.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "xmlioserver_spl.hpp" +#include "event_client.hpp" +#include "event_server.hpp" +#include "buffer_in.hpp" +#include "message.hpp" +#include "type.hpp" +#include "context.hpp" +#include "context_client.hpp" +#include "array_new.hpp" + +namespace xios { + + /// ////////////////////// Définitions ////////////////////// /// + + CDomain::CDomain(void) + : CObjectTemplate(), CDomainAttributes() + , isChecked(false), relFiles() + { /* Ne rien faire de plus */ } + + CDomain::CDomain(const StdString & id) + : CObjectTemplate(id), CDomainAttributes() + , isChecked(false), relFiles() + { /* Ne rien faire de plus */ } + + CDomain::~CDomain(void) + { + } + + ///--------------------------------------------------------------- + + const std::set & CDomain::getRelFiles(void) const + { + return (this->relFiles); + } + + //---------------------------------------------------------------- + + bool CDomain::hasZoom(void) const + { + return ((this->zoom_ni.getValue() != this->ni_glo.getValue()) && + (this->zoom_nj.getValue() != this->nj_glo.getValue())); + } + + //---------------------------------------------------------------- + + bool CDomain::isEmpty(void) const + { + return ((this->zoom_ni_srv == 0) || + (this->zoom_nj_srv == 0)); + } + + //---------------------------------------------------------------- + + bool CDomain::IsWritten(const StdString & filename) const + { + return (this->relFiles.find(filename) != this->relFiles.end()); + } + + //---------------------------------------------------------------- + + void CDomain::addRelFile(const StdString & filename) + { + this->relFiles.insert(filename); + } + + + StdString CDomain::GetName(void) { return (StdString("domain")); } + StdString CDomain::GetDefName(void){ return (CDomain::GetName()); } + ENodeType CDomain::GetType(void) { return (eDomain); } + + //---------------------------------------------------------------- + + void CDomain::checkDomain(void) + { + if (!type.isEmpty() && type==type_attr::unstructured) + { + if (ni_glo.isEmpty() || ni_glo <= 0 ) + { + ERROR("CDomain::checkAttributes(void)", + << "[ Id = " << this->getId() << " ] " + << "The global domain is badly defined," + << " check the \'ni_glo\' value !") + } + nj_glo=ni_glo ; + ni_glo=1 ; + if (!ni.isEmpty()) nj=ni ; + if (!ibegin.isEmpty()) jbegin=ibegin ; + if (!iend.isEmpty()) jend=iend ; + if (!i_index.isEmpty()) + { + j_index.resize(1,nj) ; + for(int i=0;i mask_tmp(nj,1) ; + mask_tmp = mask ; + mask.resize(1,nj) ; + for(int j=0;j iend.getValue() || + ibegin.getValue() < 1 || iend.getValue() > ni_glo.getValue()) + { + + ERROR("CDomain::checkAttributes(void)", + << "[ Id = " << this->getId() << " ] " + << "Local domain is wrong defined," + << " Check the value : ni, ni_glo, ibegin, iend") ; + } + } + + //---------------------------------------------------------------- + + void CDomain::checkLocalJDomain(void) + { + if (!nj.isEmpty() && !jbegin.isEmpty() && jend.isEmpty()) + jend.setValue(jbegin.getValue() + nj.getValue() - 1) ; + + else if (!nj.isEmpty() && !jend.isEmpty() && jbegin.isEmpty()) + jbegin.setValue( - nj.getValue() + jend.getValue() + 1) ; + + else if (!jbegin.isEmpty() && !jend.isEmpty() && nj.isEmpty()) + nj.setValue(jend.getValue() - jbegin.getValue() + 1) ; + + else if (!jbegin.isEmpty() && !jend.isEmpty() && !nj.isEmpty() ) + { + if (jend.getValue() != jbegin.getValue() + nj.getValue() - 1) + ERROR("CDomain::checkAttributes(void)", + << "The domain is wrong defined," + << " iend is different of (jbegin + nj - 1) !") ; + } + else + { + ERROR("CDomain::checkAttributes(void)", + << "The domain is wrong defined," + << " 2 values from jend, jbegin, nj must be defined !") ; + } + + if (nj.getValue() < 0 || jbegin.getValue() > jend.getValue() || + jbegin.getValue() < 1 || jend.getValue() > nj_glo.getValue()) + ERROR("CDomain::checkAttributes(void)", + << "Domain is wrong defined," + << " Check the values : nj, nj_glo, jbegin, jend") ; + + ibegin_client=ibegin ; iend_client=iend ; ni_client=ni ; + jbegin_client=jbegin ; jend_client=jend ; nj_client=nj ; + } + + //---------------------------------------------------------------- + + void CDomain::checkMask(void) + { + using namespace std; + + int ibegin_mask = 0, + jbegin_mask = 0, + iend_mask = iend.getValue() - ibegin.getValue(), + jend_mask = jend.getValue() - jbegin.getValue(); + + if (!zoom_ibegin.isEmpty()) + { + int zoom_iend = zoom_ibegin.getValue() + zoom_ni.getValue() - 1; + int zoom_jend = zoom_jbegin.getValue() + zoom_nj.getValue() - 1; + + ibegin_mask = max (ibegin.getValue(), zoom_ibegin.getValue()); + jbegin_mask = max (jbegin.getValue(), zoom_jbegin.getValue()); + iend_mask = min (iend.getValue(), zoom_iend); + jend_mask = min (jend.getValue(), zoom_jend); + + ibegin_mask -= ibegin.getValue(); + jbegin_mask -= jbegin.getValue(); + iend_mask -= ibegin.getValue(); + jend_mask -= jbegin.getValue(); + } + + + if (!mask.isEmpty()) + { + if ((mask.extent(0) != ni) || + (mask.extent(1) != nj)) + ERROR("CDomain::checkAttributes(void)", + <<"the mask has not the same size than the local domain"< iend_mask && + j < jbegin_mask && j > jend_mask ) + mask(i,j) = false; + } + } + } + else // (!mask.hasValue()) + { // Si aucun masque n'est défini, + // on en crée un nouveau qui valide l'intégralité du domaine. + mask.resize(ni,nj) ; + for (int i = 0; i < ni.getValue(); i++) + { + for (int j = 0; j < nj.getValue(); j++) + { + if (i >= ibegin_mask && i <= iend_mask && + j >= jbegin_mask && j <= jend_mask ) + mask(i,j) = true; + else mask(i,j) = false; + } + } + } + } + + + //---------------------------------------------------------------- + + void CDomain::checkDomainData(void) + { + if (!data_dim.isEmpty() && + !(data_dim.getValue() == 1 || data_dim.getValue() == 2)) + { + ERROR("CDomain::checkAttributes(void)", + << "Data dimension incompatible (must be 1 or 2) !") ; + } + else if (data_dim.isEmpty()) + { + ERROR("CDomain::checkAttributes(void)", + << "Data dimension undefined !") ; + } + + if (data_ibegin.isEmpty()) + data_ibegin.setValue(0) ; + if (data_jbegin.isEmpty() && (data_dim.getValue() == 2)) + data_jbegin.setValue(0) ; + + if (!data_ni.isEmpty() && (data_ni.getValue() <= 0)) + { + ERROR("CDomain::checkAttributes(void)", + << "Data dimension is negative (data_ni).") ; + } + else if (data_ni.isEmpty()) + { + data_ni.setValue((data_dim.getValue() == 1) + ? (ni.getValue() * nj.getValue()) + : ni.getValue()); + } + + if (data_dim.getValue() == 2) + { + if (!data_nj.isEmpty() && (data_nj.getValue() <= 0) ) + { + ERROR("CDomain::checkAttributes(void)", + << "Data dimension is negative (data_nj).") ; + } + else if (data_nj.isEmpty()) + data_nj.setValue(nj.getValue()) ; + } + + } + + //---------------------------------------------------------------- + + void CDomain::checkCompression(void) + { + if (!data_i_index.isEmpty()) + { + int ssize = data_i_index.numElements(); + if (!data_n_index.isEmpty() && + (data_n_index.getValue() != ssize)) + { + ERROR("CDomain::checkAttributes(void)", + <<"Dimension data_i_index incompatible with data_n_index.") ; + } + else if (data_n_index.isEmpty()) + data_n_index.setValue(ssize) ; + + if (data_dim.getValue() == 2) + { + if (!data_j_index.isEmpty() && + (data_j_index.numElements() != data_i_index.numElements())) + { + ERROR("CDomain::checkAttributes(void)", + <<"Dimension data_j_index incompatible with data_i_index.") ; + } + else if (data_j_index.isEmpty()) + { + ERROR("CDomain::checkAttributes(void)", + <<"data_j_index must be defined !") ; + } + } + } + else + { + if (!data_n_index.isEmpty() || + ((data_dim.getValue() == 2) && (!data_j_index.isEmpty()))) + ERROR("CDomain::checkAttributes(void)", << "data_i_index undefined") ; + } + + if (data_n_index.isEmpty()) + { // -> bloc re-vérifié OK + if (data_dim.getValue() == 1) + { + const int dni = data_ni.getValue(); + data_i_index.resize(dni) ; + data_n_index.setValue(dni); + for (int i = 0; i < dni; i++) data_i_index(i) = i+1 ; + } + else // (data_dim == 2) + { + const int dni = data_ni.getValue() * data_nj.getValue(); + data_i_index.resize(dni) ; + data_j_index.resize(dni) ; + + data_n_index.setValue(dni); + + for(int count = 0, j = 0; j < data_nj.getValue(); j++) + { + for(int i = 0; i < data_ni.getValue(); i++, count++) + { + data_i_index(count) = i+1 ; + data_j_index(count) = j+1 ; + } + } + } + } + } + + //---------------------------------------------------------------- + + void CDomain::completeLonLatClient(void) + { + int i,j,k ; + CArray lonvalue_temp(ni*nj) ; + CArray latvalue_temp(ni*nj) ; + CArray bounds_lon_temp(nvertex,ni*nj) ; + CArray bounds_lat_temp(nvertex,ni*nj) ; + + if (type.isEmpty()) + { + if ( lonvalue.numElements() == ni*nj && latvalue.numElements() == ni*nj ) + { + type.setValue(type_attr::curvilinear) ; + isCurvilinear=true ; + } + else if ( lonvalue.numElements() == ni && latvalue.numElements() == nj ) + { + type.setValue(type_attr::regular) ; + isCurvilinear=false ; + } + else ERROR("void CDomain::completeLonLatClient(void)",<<"the grid is nor curvilinear, nor cartesian, because the size of longitude and latitude array is not coherent with the domain size"<zoom_ni.isEmpty() || !this->zoom_nj.isEmpty() || + !this->zoom_ibegin.isEmpty() || !this->zoom_jbegin.isEmpty()) + { + if (this->zoom_ni.isEmpty() || this->zoom_nj.isEmpty() || + this->zoom_ibegin.isEmpty() || this->zoom_jbegin.isEmpty()) + { + ERROR("CDomain::checkZoom(void)", + <<"if one of zoom attributes is defined then all zoom attributes must be defined") ; + } + else + { + int zoom_iend = zoom_ibegin + zoom_ni - 1; + int zoom_jend = zoom_jbegin + zoom_nj - 1; + + if (zoom_ibegin < 1 || zoom_jbegin < 1 || zoom_iend > ni_glo || zoom_jend > nj_glo) + ERROR("CDomain::checkZoom(void)", + << "Zoom is wrong defined," + << " Check the values : zoom_ni, zoom_nj, zoom_ibegin, zoom_jbegin") ; + } + } + else + { + zoom_ni = ni_glo; + zoom_nj = nj_glo; + zoom_ibegin = 1; + zoom_jbegin = 1; + } + + // compute client zoom indices + + int zoom_iend=zoom_ibegin+zoom_ni-1 ; + zoom_ibegin_client = ibegin_client > zoom_ibegin ? ibegin_client : zoom_ibegin ; + zoom_iend_client = iend_client < zoom_iend ? iend_client : zoom_iend ; + zoom_ni_client=zoom_iend_client-zoom_ibegin_client+1 ; + if (zoom_ni_client<0) zoom_ni_client=0 ; + + + int zoom_jend=zoom_jbegin+zoom_nj-1 ; + zoom_jbegin_client = jbegin_client > zoom_jbegin ? jbegin_client : zoom_jbegin ; + zoom_jend_client = jend_client < zoom_jend ? jend_client : zoom_jend ; + zoom_nj_client=zoom_jend_client-zoom_jbegin_client+1 ; + if (zoom_nj_client<0) zoom_nj_client=0 ; + + } + + void CDomain::checkBounds(void) + { + if (!nvertex.isEmpty() && !bounds_lon.isEmpty() && !bounds_lat.isEmpty()) + { + hasBounds=true ; + + } + else + { + hasBounds=false; + nvertex=0 ; + } + } + + //---------------------------------------------------------------- + + void CDomain::checkAttributes(void) + { + if (this->isChecked) return; + CContext* context=CContext::getCurrent() ; + + this->checkDomain(); + this->checkZoom(); + this->checkBounds(); + + if (context->hasClient) + { // Côté client uniquement + this->checkMask(); + this->checkDomainData(); + this->checkCompression(); + this->completeLonLatClient(); + } + else + { // Côté serveur uniquement +// if (!this->isEmpty()) +// ne sert plus // this->completeLonLatServer(); + } + + if (context->hasClient) + { + computeConnectedServer() ; + sendServerAttribut() ; + sendLonLat() ; + } + + this->isChecked = true; + } + + void CDomain::sendServerAttribut(void) + { + int ni_srv=ni_glo.getValue() ; + int ibegin_srv=1 ; + int iend_srv=ni_glo.getValue() ; + + int nj_srv ; + int jbegin_srv ; + int jend_srv ; + + CContext* context=CContext::getCurrent() ; + CContextClient* client=context->client ; + int nbServer=client->serverSize ; + int serverRank=client->getServerLeader() ; + + jend_srv=0 ; + for(int i=0;i<=serverRank;i++) + { + jbegin_srv=jend_srv+1 ; + nj_srv=nj_glo.getValue()/nbServer ; + if (iisServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + void CDomain::computeConnectedServer(void) + { + int i,j,i_ind,j_ind ; + + ibegin_client=ibegin ; iend_client=iend ; ni_client=ni ; + jbegin_client=jbegin ; jend_client=jend ; nj_client=nj ; + + CContext* context = CContext::getCurrent() ; + CContextClient* client=context->client ; + int nbServer=client->serverSize ; + + // find how much client are connected to a server + int zoom_iend=zoom_ibegin+zoom_ni-1 ; + int zoom_jend=zoom_jbegin+zoom_nj-1 ; + + int blockSize=nj_glo/nbServer ; + int ns=nj_glo%nbServer ; + int pos=ns*(blockSize+1) ; + int serverNum ; + + mapConnectedServer.resize(ni,nj) ; + vector nbData(nbServer,0) ; + vector indServer(nbServer,-1) ; + vector IsConnected(nbServer,false) ; + + for(j=0;j= zoom_ibegin-1 && i_ind <= zoom_iend-1 && j_ind >= zoom_jbegin-1 && j_ind <= zoom_jend-1) + { + mapConnectedServer(i,j)=serverNum ; + nbData[serverNum]++ ; + } + else mapConnectedServer(i,j)=-1 ; + } + + + for(serverNum=0 ; serverNum=0) + { + ns=indServer[mapConnectedServer(i,j)] ; + mapConnectedServer(i,j)= ns ; + i_indSrv[ns].push_back(i+ibegin-1) ; + j_indSrv[ns].push_back(j+jbegin-1) ; + } + } + + int nbConnectedServer=connectedServer.size() ; + + int* recvCount=new int[client->clientSize] ; + int* displ=new int[client->clientSize] ; + int* sendBuff=new int[nbConnectedServer] ; + valarray nbClient(0,client->serverSize) ; + + for(int n=0;nintraComm) ; + + displ[0]=0 ; + for(int n=1;nclientSize;n++) displ[n]=displ[n-1]+recvCount[n-1] ; + int recvSize=displ[client->clientSize-1]+recvCount[client->clientSize-1] ; + int* recvBuff=new int[recvSize] ; + + + MPI_Allgatherv(sendBuff,nbConnectedServer,MPI_INT,recvBuff,recvCount,displ,MPI_INT,client->intraComm) ; + for(int n=0;nclient ; + // send lon lat for each connected server + CEventClient event(getType(),EVENT_ID_LON_LAT) ; + + list > list_msg ; + list< CArray* > list_indi,list_indj ; + list< CArray* >list_lon,list_lat ; + list< CArray* >list_boundslon,list_boundslat ; + + for(int ns=0;ns indi(nbData) ; + CArray indj(nbData) ; + CArray lon(nbData) ; + CArray lat(nbData) ; + CArray boundslon(nvertex,nbData) ; + CArray boundslat(nvertex,nbData) ; + + for(n=0;n(indi.copy())) ; + list_indj.push_back(new CArray(indj.copy())) ; + list_lon.push_back(new CArray(lon.copy())) ; + list_lat.push_back(new CArray(lat.copy())) ; + if (hasBounds) list_boundslon.push_back(new CArray(boundslon.copy())) ; + if (hasBounds) list_boundslat.push_back(new CArray(boundslat.copy())) ; + + list_msg.push_back(shared_ptr(new CMessage)) ; + + *list_msg.back()<getId()<<(int)type ; // enum ne fonctionne pour les message => ToFix + *list_msg.back()<sendEvent(event) ; + + + for(list* >::iterator it=list_indi.begin();it!=list_indi.end();it++) delete *it; + for(list* >::iterator it=list_indj.begin();it!=list_indj.end();it++) delete *it; + for(list* >::iterator it=list_lon.begin();it!=list_lon.end();it++) delete *it; + for(list* >::iterator it=list_lat.begin();it!=list_lat.end();it++) delete *it; + if (hasBounds) for(list* >::iterator it=list_boundslon.begin();it!=list_boundslon.end();it++) delete *it; + if (hasBounds) for(list* >::iterator it=list_boundslat.begin();it!=list_boundslat.end();it++) delete *it; + + } + + + bool CDomain::dispatchEvent(CEventServer& event) + { + + if (SuperClass::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_SERVER_ATTRIBUT : + recvServerAttribut(event) ; + return true ; + break ; + case EVENT_ID_LON_LAT : + recvLonLat(event) ; + return true ; + break ; + default : + ERROR("bool CContext::dispatchEvent(CEventServer& event)", + <<"Unknown Event") ; + return false ; + } + } + } + + void CDomain::recvServerAttribut(CEventServer& event) + { + CBufferIn* buffer=event.subEvents.begin()->buffer; + string domainId ; + *buffer>>domainId ; + get(domainId)->recvServerAttribut(*buffer) ; + } + + void CDomain::recvServerAttribut(CBufferIn& buffer) + { + int zoom_iend=zoom_ibegin.getValue()+zoom_ni.getValue()-1 ; + int zoom_jend=zoom_jbegin.getValue()+zoom_nj.getValue()-1 ; + + buffer>>ni_srv>>ibegin_srv>>iend_srv>>nj_srv>>jbegin_srv>>jend_srv; + + + zoom_ibegin_srv = zoom_ibegin.getValue() > ibegin_srv ? zoom_ibegin.getValue() : ibegin_srv ; + zoom_iend_srv = zoom_iend < iend_srv ? zoom_iend : iend_srv ; + zoom_ni_srv=zoom_iend_srv-zoom_ibegin_srv+1 ; + + zoom_jbegin_srv = zoom_jbegin.getValue() > jbegin_srv ? zoom_jbegin.getValue() : jbegin_srv ; + zoom_jend_srv = zoom_jend < jend_srv ? zoom_jend : jend_srv ; + zoom_nj_srv=zoom_jend_srv-zoom_jbegin_srv+1 ; + + if (zoom_ni_srv<=0 || zoom_nj_srv<=0) + { + zoom_ibegin_srv=1 ; zoom_iend_srv=0 ; zoom_ni_srv=0 ; + zoom_jbegin_srv=1 ; zoom_jend_srv=0 ; zoom_nj_srv=0 ; + } + lonvalue_srv.resize(zoom_ni_srv*zoom_nj_srv) ; + lonvalue_srv = 0. ; + latvalue_srv.resize(zoom_ni_srv*zoom_nj_srv) ; + latvalue_srv = 0. ; + if (hasBounds) + { + bounds_lon_srv.resize(nvertex,zoom_ni_srv*zoom_nj_srv) ; + bounds_lon_srv = 0. ; + bounds_lat_srv.resize(nvertex,zoom_ni_srv*zoom_nj_srv) ; + bounds_lat_srv = 0. ; + } + } + + void CDomain::recvLonLat(CEventServer& event) + { + list::iterator it ; + for (it=event.subEvents.begin();it!=event.subEvents.end();++it) + { + CBufferIn* buffer=it->buffer; + string domainId ; + *buffer>>domainId ; + get(domainId)->recvLonLat(*buffer) ; + } + } + + void CDomain::recvLonLat(CBufferIn& buffer) + { + CArray indi ; + CArray indj ; + CArray lon ; + CArray lat ; + CArray boundslon ; + CArray boundslat ; + + int type_int ; + buffer>>type_int>>isCurvilinear>>indi>>indj>>lon>>lat ; + if (hasBounds) buffer>>boundslon>>boundslat ; + type.setValue((type_attr::t_enum)type_int) ; // probleme des type enum avec les buffers : ToFix + + int i,j,ind_srv ; + for(int ind=0;ind + , public CDomainAttributes + { + enum EEventId + { + EVENT_ID_SERVER_ATTRIBUT, EVENT_ID_LON_LAT + } ; + + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CDomainAttributes SuperClassAttribute; + + public : + + typedef CDomainAttributes RelAttributes; + typedef CDomainGroup RelGroup; + + /// Constructeurs /// + CDomain(void); + explicit CDomain(const StdString & id); + CDomain(const CDomain & domain); // Not implemented yet. + CDomain(const CDomain * const domain); // Not implemented yet. + + /// Vérifications /// + void checkAttributes(void); + + private : + + void checkDomain(void); + + void checkLocalIDomain(void); + void checkLocalJDomain(void); + + void checkMask(void); + void checkDomainData(void); + void checkCompression(void); + + void checkZoom(void); + void checkBounds(void); + + + public : + + /// Autres /// + + const std::set & getRelFiles(void) const; + + + /// Test /// + bool IsWritten(const StdString & filename) const; + bool hasZoom(void) const; + bool isEmpty(void) const; + + + int ni_client,ibegin_client,iend_client ; + int zoom_ni_client,zoom_ibegin_client,zoom_iend_client ; + + int nj_client,jbegin_client,jend_client ; + int zoom_nj_client,zoom_jbegin_client,zoom_jend_client ; + + int ni_srv,ibegin_srv,iend_srv ; + int zoom_ni_srv,zoom_ibegin_srv,zoom_iend_srv ; + + int nj_srv,jbegin_srv,jend_srv ; + int zoom_nj_srv,zoom_jbegin_srv,zoom_jend_srv ; + + CArray lonvalue_srv, latvalue_srv ; + CArray bounds_lon_srv, bounds_lat_srv ; + + + vector connectedServer ; // list of connected server + vector nbSenders ; // for each communication with a server, number of communicating client + vector nbDataSrv ; // size of data to send to each server + vector< vector > i_indSrv ; // for each server, i global index to send + vector< vector > j_indSrv ; // for each server, j global index to send + + CArray mapConnectedServer ; // (ni,nj) => mapped to connected server number, -1 if no server is target + +// vector ib_srv, ie_srv, in_srv ; +// vector jb_srv, je_srv, jn_srv ; + + public : + + /// Mutateur /// + void addRelFile(const StdString & filename); + void completeLonLatClient(void); + void sendServerAttribut(void) ; + void sendLonLat(void) ; + void computeConnectedServer(void) ; + static bool dispatchEvent(CEventServer& event) ; + static void recvLonLat(CEventServer& event) ; + static void recvServerAttribut(CEventServer& event) ; + void recvLonLat(CBufferIn& buffer) ; + void recvServerAttribut(CBufferIn& buffer) ; + + /// Destructeur /// + virtual ~CDomain(void); + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + + static ENodeType GetType(void); + + CArray local_mask; + bool isCurvilinear ; + bool hasBounds ; + private : + + /// Proriétés protégées /// + bool isChecked; + std::set relFiles; + + }; // class CDomain + + ///-------------------------------------------------------------- + + // Declare/Define CDomainGroup and CDomainDefinition + DECLARE_GROUP(CDomain); + + ///-------------------------------------------------------------- + +} // namespace xios + +#endif // __XMLIO_CDomain__ diff --git a/src/node/field.cpp b/src/node/field.cpp new file mode 100644 index 0000000..a1de6f6 --- /dev/null +++ b/src/node/field.cpp @@ -0,0 +1,950 @@ +#include "field.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +#include "node_type.hpp" +#include "calendar_util.hpp" +#include "message.hpp" +#include "xmlioserver_spl.hpp" +#include "type.hpp" +#include "context_client.hpp" +#include + +namespace xios{ + + /// ////////////////////// Définitions ////////////////////// /// + + CField::CField(void) + : CObjectTemplate(), CFieldAttributes() + , refObject(), baseRefObject() + , grid(), file() + , freq_operation(), freq_write() + , nstep(0) + , last_Write(), last_operation() + , foperation(), hasInstantData(false), hasExpression(false) + , active(false) , hasOutputFile(false),hasFieldOut(false), slotUpdateDate(NULL) + , processed(false) + { setVirtualVariableGroup() ; } + + CField::CField(const StdString & id) + : CObjectTemplate(id), CFieldAttributes() + , refObject(), baseRefObject() + , grid(), file() + , freq_operation(), freq_write() + , nstep(0) + , last_Write(), last_operation() + , foperation(), hasInstantData(false), hasExpression(false) + , active(false), hasOutputFile(false), hasFieldOut(false), slotUpdateDate(NULL) + , processed(false) + { setVirtualVariableGroup() ; } + + CField::~CField(void) + { +// this->grid.reset() ; +// this->file.reset() ; + this->foperation.reset() ; + if (hasExpression) delete expression ; + if (slotUpdateDate!=NULL) delete slotUpdateDate ; + + } + + + //---------------------------------------------------------------- + + void CField::setVirtualVariableGroup(CVariableGroup* newVVariableGroup) + { + this->vVariableGroup = newVVariableGroup; + } + + void CField::setVirtualVariableGroup(void) + { + this->setVirtualVariableGroup(CVariableGroup::create()); + } + + CVariableGroup* CField::getVirtualVariableGroup(void) const + { + return (this->vVariableGroup); + } + + + std::vector CField::getAllVariables(void) const + { + return (this->vVariableGroup->getAllChildren()); + } + + void CField::solveDescInheritance(bool apply, const CAttributeMap * const parent) + { + SuperClassAttribute::setAttributes(parent,apply); + this->getVirtualVariableGroup()->solveDescInheritance(apply, NULL); + } + //---------------------------------------------------------------- + //---------------------------------------------------------------- + + bool CField::updateDataServer + (const CDate & currDate, + const std::deque< CArray* > storedClient) + { + const CDate opeDate = *last_operation + freq_operation; + const CDate writeDate = *last_Write + freq_write; + + if (opeDate <= currDate) + { + if (this->data.numElements() != this->grid->storeIndex[0]->numElements()) + { + this->data.resize(this->grid->storeIndex[0] ->numElements()); + } + CArray input(data.numElements()) ; + this->grid->inputFieldServer(storedClient, input); + (*this->foperation)(input); + *last_operation = currDate; + } + if (writeDate < (currDate + freq_operation)) + { + this->foperation->final(); + this->incrementNStep(); + *last_Write = writeDate; + return (true); + } + return (false); + } + + bool CField::dispatchEvent(CEventServer& event) + { + + if (SuperClass::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_UPDATE_DATA : + recvUpdateData(event) ; + return true ; + break ; + + case EVENT_ID_ADD_VARIABLE : + recvAddVariable(event) ; + return true ; + break ; + + case EVENT_ID_ADD_VARIABLE_GROUP : + recvAddVariableGroup(event) ; + return true ; + break ; + + default : + ERROR("bool CField::dispatchEvent(CEventServer& event)",<<"Unknown Event") ; + return false ; + } + } + } + + void CField::sendUpdateData(void) + { + CContext* context = CContext::getCurrent() ; + CContextClient* client=context->client ; + + CEventClient event(getType(),EVENT_ID_UPDATE_DATA) ; + + map* >::iterator it ; + list > list_msg ; + list< CArray* > list_data ; + + for(it=grid->storeIndex_toSrv.begin();it!=grid->storeIndex_toSrv.end();it++) + { + int rank=(*it).first ; + CArray& index = *(it->second) ; + CArray data_tmp(index.numElements()) ; + + for(int n=0;n(new CMessage)) ; + list_data.push_back(new CArray(data_tmp)) ; + *list_msg.back()<nbSenders[rank],*list_msg.back()) ; + } + client->sendEvent(event) ; + + for(list< CArray* >::iterator it=list_data.begin();it!=list_data.end();it++) delete *it ; + } + + void CField::recvUpdateData(CEventServer& event) + { + vector ranks ; + vector buffers ; + + list::iterator it ; + string fieldId ; + + for (it=event.subEvents.begin();it!=event.subEvents.end();++it) + { + int rank=it->rank; + CBufferIn* buffer=it->buffer; + *buffer>>fieldId ; + ranks.push_back(rank) ; + buffers.push_back(buffer) ; + } + get(fieldId)->recvUpdateData(ranks,buffers) ; + } + + void CField::recvUpdateData(vector& ranks, vector& buffers) + { + + if (data_srv.empty()) + { + for(map* >::iterator it=grid->out_i_fromClient.begin();it!=grid->out_i_fromClient.end();it++) + { + int rank=it->first ; + CArray data_tmp(it->second->numElements()) ; + data_srv.insert( pair* >(rank, new CArray(data_tmp) ) ) ; + foperation_srv.insert(pair >(rank,boost::shared_ptr(new func::CInstant(*data_srv[rank])))) ; + } + } + + CContext* context = CContext::getCurrent() ; + const CDate & currDate = context->getCalendar()->getCurrentDate(); + const CDate opeDate = *last_operation_srv + freq_operation_srv; + const CDate writeDate = *last_Write_srv + freq_write_srv; + + + + if (opeDate <= currDate) + { + for(int n=0;n data_tmp ; + *buffers[n]>>data_tmp ; + (*foperation_srv[ranks[n]])(data_tmp) ; + } + *last_operation_srv = currDate; + } + + if (writeDate < (currDate + freq_operation_srv)) + { + for(int n=0;nfoperation_srv[ranks[n]]->final(); + } + + *last_Write_srv = writeDate; + writeField() ; + *lastlast_Write_srv=*last_Write_srv; + } + } + + void CField::writeField(void) + { + if (! getRelFile()->allDomainEmpty ) + if (! grid->domain->isEmpty() || getRelFile()->type == CFile::type_attr::one_file) + { + getRelFile()->checkFile(); + this->incrementNStep(); + getRelFile()->getDataOutput()->writeFieldData(CField::get(this)); + } + } + //---------------------------------------------------------------- + + void CField::setRelFile(CFile* _file) + { + this->file = _file; + hasOutputFile=true ; + } + + //---------------------------------------------------------------- + + StdString CField::GetName(void) { return (StdString("field")); } + StdString CField::GetDefName(void){ return (CField::GetName()); } + ENodeType CField::GetType(void) { return (eField); } + + //---------------------------------------------------------------- + + CGrid* CField::getRelGrid(void) const + { + return (this->grid); + } + + //---------------------------------------------------------------- + + CFile* CField::getRelFile(void) const + { + return (this->file); + } + + StdSize CField::getNStep(void) const + { + return (this->nstep); + } + + void CField::incrementNStep(void) + { + this->nstep++; + } + + void CField::resetNStep(void) + { + this->nstep=0; + } + + //---------------------------------------------------------------- + + CField* CField::getDirectFieldReference(void) const + { + if (this->field_ref.isEmpty()) + return (this->getBaseFieldReference()); + + if (! CField::has(this->field_ref.getValue())) + ERROR("CField::getDirectFieldReference(void)", + << "[ ref_name = " << this->field_ref.getValue() << "]" + << " invalid field name !"); + + return (CField::get(this->field_ref.getValue())); + } + + //---------------------------------------------------------------- + + CField* CField::getBaseFieldReference(void) const + { + return (baseRefObject); + } + + //---------------------------------------------------------------- + + const std::vector& CField::getAllReference(void) const + { + return (refObject); + } + + //---------------------------------------------------------------- + + const StdString & CField::getBaseFieldId(void) const + { + return (this->getBaseFieldReference()->getId()); + } + + //---------------------------------------------------------------- + + const CDuration & CField::getFreqOperation(void) const + { + return (this->freq_operation); + } + + //---------------------------------------------------------------- + const CDuration & CField::getFreqWrite(void) const + { + return (this->freq_write); + } + + //---------------------------------------------------------------- + + boost::shared_ptr CField::getFieldOperation(void) const + { + return (this->foperation); + } + + //---------------------------------------------------------------- + + bool CField::hasDirectFieldReference(void) const + { + return (!this->field_ref.isEmpty()); + } + + bool CField::isActive(void) const + { + return (!this->refObject.empty()); + } + //---------------------------------------------------------------- + + CArray CField::getData(void) const + { + return(this->data); + } + + //---------------------------------------------------------------- + + boost::shared_ptr CField::getLastWriteDate(void) const + { + return(this->last_Write); + } + + //---------------------------------------------------------------- + + boost::shared_ptr CField::getLastOperationDate(void) const + { + return(this->last_operation); + } + + //---------------------------------------------------------------- + + void CField::processEnabledField(void) + { + if (!processed) + { + processed=true ; + solveRefInheritance(true) ; + solveBaseReference() ; + solveOperation() ; + solveGridReference() ; + + if (hasDirectFieldReference()) baseRefObject->processEnabledField() ; + buildExpression(); + active=true; + } + } + + void CField::solveRefInheritance(bool apply) + { + std::set sset; + CField* refer_sptr; + CField * refer_ptr = this; + + while (refer_ptr->hasDirectFieldReference()) + { + refer_sptr = refer_ptr->getDirectFieldReference(); + refer_ptr = refer_sptr; + + if(sset.end() != sset.find(refer_ptr)) + { + DEBUG (<< "Circular dependency stopped for field object on " + << "\"" + refer_ptr->getId() + "\" !"); + break; + } + + SuperClassAttribute::setAttributes(refer_ptr, apply); + sset.insert(refer_ptr); + } + + } + + void CField::solveBaseReference(void) + { + std::set sset; + CField* refer_sptr; + CField * refer_ptr = this; + + if (this->hasDirectFieldReference()) baseRefObject = getDirectFieldReference(); + else baseRefObject = CField::get(this); + + while (refer_ptr->hasDirectFieldReference()) + { + refer_sptr = refer_ptr->getDirectFieldReference(); + refer_ptr = refer_sptr; + + if(sset.end() != sset.find(refer_ptr)) + { + DEBUG (<< "Circular dependency stopped for field object on " + << "\"" + refer_ptr->getId() + "\" !"); + break; + } + + sset.insert(refer_ptr); + } + + if (hasDirectFieldReference()) baseRefObject->addReference(this) ; + } + + //---------------------------------------------------------------- + + void CField::solveOperation(void) + { + using namespace func; + + if (!hasOutputFile && !hasFieldOut) return ; + + StdString id ; + if (hasId()) id=getId(); + else if (!name.isEmpty()) id=name ; + else if (hasDirectFieldReference()) id=baseRefObject->getId() ; + + CContext* context = CContext::getCurrent(); + + if (freq_op.isEmpty()) freq_op=string("1ts") ; + + if (operation.isEmpty() ) + { + ERROR("CField::solveOperation(void)", + << "[ id = " << id << "]" + << "Impossible to define an operation for this field !"); + } + + CDuration freq_offset_ = NoneDu; + if (!freq_offset.isEmpty()) + { + freq_offset_ = CDuration::FromString(freq_offset.getValue()); + } + else + { + freq_offset.setValue(NoneDu.toString()); + } + +// if (CXIOSManager::GetStatus() == CXIOSManager::LOC_SERVER) + if (context->hasServer) + { + if (hasOutputFile) + { + this->freq_operation_srv =CDuration::FromString(this->file->output_freq.getValue()); + this->freq_write_srv = CDuration::FromString(this->file->output_freq.getValue()); + } + this->lastlast_Write_srv = boost::shared_ptr + (new CDate(context->getCalendar()->getInitDate())); + this->last_Write_srv = boost::shared_ptr + (new CDate(context->getCalendar()->getInitDate())); + this->last_operation_srv = boost::shared_ptr + (new CDate(context->getCalendar()->getInitDate())); +// this->foperation_srv = +// boost::shared_ptr(new CInstant(this->data_srv)); + + if (hasOutputFile) + { + const CDuration toffset = this->freq_operation_srv - freq_offset_ - context->getCalendar()->getTimeStep(); + *this->last_operation_srv = *this->last_operation_srv - toffset; + } + } + +// if (context->hasClient) +// { + this->freq_operation = CDuration::FromString(freq_op.getValue()); + if (hasOutputFile) this->freq_write = CDuration::FromString(this->file->output_freq.getValue()); + if (hasFieldOut) + { + this->freq_write = CDuration::FromString(this->fieldOut->freq_op.getValue()); + } + this->last_Write = boost::shared_ptr + (new CDate(context->getCalendar()->getInitDate())); + this->last_operation = boost::shared_ptr + (new CDate(context->getCalendar()->getInitDate())); + + const CDuration toffset = this->freq_operation - freq_offset_ - context->getCalendar()->getTimeStep(); + *this->last_operation = *this->last_operation - toffset; + + if (operation.get()=="once") isOnceOperation=true ; + else isOnceOperation=false; + isFirstOperation=true; + + +#define DECLARE_FUNCTOR(MType, mtype) \ + if (operation.getValue().compare(#mtype) == 0) \ + { \ + if (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value==true) \ + { \ + boost::shared_ptr foperation_(new C##MType(this->data,default_value)); \ + this->foperation = foperation_; \ + } \ + else \ + { \ + boost::shared_ptr foperation_(new C##MType(this->data)); \ + this->foperation = foperation_; \ + } \ + return; \ + } + +#include "functor_type.conf" + + ERROR("CField::solveOperation(void)", + << "[ operation = " << operation.getValue() << "]" + << "The operation is not defined !"); +// } + + + } + + //---------------------------------------------------------------- +/* + void CField::fromBinary(StdIStream & is) + { + SuperClass::fromBinary(is); +#define CLEAR_ATT(name_)\ + SuperClassAttribute::operator[](#name_)->reset() + + CLEAR_ATT(domain_ref); + CLEAR_ATT(axis_ref); +#undef CLEAR_ATT + + } +*/ + //---------------------------------------------------------------- + + void CField::solveGridReference(void) + { + CDomain* domain; + CAxis* axis; + + if (!domain_ref.isEmpty()) + { + if (CDomain::has(domain_ref.getValue())) + domain = CDomain::get(domain_ref.getValue()) ; + else + ERROR("CField::solveGridReference(void)", + << "Reference to the domain \'" + << domain_ref.getValue() << "\' is wrong") ; + } + + if (!axis_ref.isEmpty()) + { + if (CAxis::has(axis_ref.getValue())) + axis = CAxis::get(axis_ref.getValue()) ; + else + ERROR("CField::solveGridReference(void)", + << "Reference to the axis \'" + << axis_ref.getValue() <<"\' is wrong") ; + } + + if (!grid_ref.isEmpty()) + { + if (CGrid::has(grid_ref.getValue())) + this->grid = CGrid::get(grid_ref.getValue()) ; + else + ERROR("CField::solveGridReference(void)", + << "Reference to the grid \'" + << grid_ref.getValue() << "\' is wrong"); + } + + if (grid_ref.isEmpty() && domain_ref.isEmpty()) + { + ERROR("CField::solveGridReference(void)", + << "The horizontal domain for this field is not defined"); + + } + + CType goodDomain ; + CType goodAxis ; + if (!grid_ref.isEmpty()) + { + if (!grid->domain_ref.isEmpty()) goodDomain=grid->domain_ref ; + if (!grid->axis_ref.isEmpty()) goodAxis=grid->axis_ref ; + } + if (!domain_ref.isEmpty()) goodDomain=domain_ref ; + if (!axis_ref.isEmpty()) goodAxis=axis_ref ; + + + if (goodDomain.isEmpty()) + { + ERROR("CField::solveGridReference(void)", << "The horizontal domain for this field is not defined"); + } + else + { + if (CDomain::has(goodDomain)) domain = CDomain::get(goodDomain) ; + else ERROR("CField::solveGridReference(void)",<< "Reference to the domain \'"<domain_ref.isEmpty() && goodDomain.get() == grid->domain_ref.get()) + if (goodAxis.isEmpty()) nothingToDo=true ; + else if (!grid->axis_ref.isEmpty()) + if (grid->axis_ref.get()==goodAxis.get()) nothingToDo=true ; + } + + if (!nothingToDo) + { + if (!goodAxis.isEmpty()) + { + this->grid = CGrid::createGrid(domain, axis) ; + this->grid_ref.setValue(this->grid->getId()); + } + else + { + this->grid = CGrid::createGrid(domain) ; + this->grid_ref.setValue(this->grid->getId()); + } + } + + grid->solveReference() ; + + } + + + ///------------------------------------------------------------------- + + template <> + void CGroupTemplate::solveRefInheritance(void) + { + if (this->group_ref.isEmpty()) return; + StdString gref = this->group_ref.getValue(); + + if (!CFieldGroup::has(gref)) + ERROR("CGroupTemplate::solveRefInheritance(void)", + << "[ gref = " << gref << "]" + << " invalid group name !"); + + CFieldGroup* group = CFieldGroup::get(gref); + CFieldGroup* owner = CFieldGroup::get(boost::polymorphic_downcast(this)); + + std::vector allChildren = group->getAllChildren(); + std::vector::iterator + it = allChildren.begin(), end = allChildren.end(); + + for (; it != end; it++) + { + CField* child = *it; + if (child->hasId()) owner->createChild()->field_ref.setValue(child->getId()) ; + + } + } + + void CField::scaleFactorAddOffset(double scaleFactor, double addOffset) + { + map* >::iterator it; + for(it=data_srv.begin();it!=data_srv.end();it++) *it->second = (*it->second -addOffset) * 1./scaleFactor ; + } + + void CField::outputField(CArray& fieldOut) + { + map* >::iterator it; + for(it=data_srv.begin();it!=data_srv.end();it++) + grid->outputField(it->first,*it->second, fieldOut) ; + + } + + void CField::outputField(CArray& fieldOut) + { + map* >::iterator it; + + for(it=data_srv.begin();it!=data_srv.end();it++) + { + grid->outputField(it->first,*it->second, fieldOut) ; + } + } + ///------------------------------------------------------------------- + + void CField::parse(xml::CXMLNode & node) + { + SuperClass::parse(node); + if (! node.getContent(this->content)) + { + if (node.goToChildElement()) + { + do + { + if (node.getElementName()=="variable" || node.getElementName()=="variable_group") this->getVirtualVariableGroup()->parseChild(node); + } while (node.goToNextElement()) ; + node.goToParentElement(); + } + } + } + + CArray* CField::getInstantData(void) + { + if (!hasInstantData) + { + instantData.resize(grid->storeIndex_client.numElements()) ; + hasInstantData=true ; + } + return &instantData ; + } + + void CField::addReference(CField* field) + { + refObject.push_back(field) ; + } + + void CField::addDependency(CField* field, int slotId) + { + fieldDependency.push_back(pair(field,slotId)) ; + } + + void CField::buildExpression(void) + { + if (content.size() > 0) + { + CSimpleNodeExpr* simpleExpr=parseExpr(content+'\0') ; + expression=CFieldNode::newNode(simpleExpr) ; + delete simpleExpr ; + set instantFieldIds ; + map associatedInstantFieldIds ; + expression->getInstantFieldIds(instantFieldIds) ; + for (set::iterator it=instantFieldIds.begin() ; it!=instantFieldIds.end();++it) + { + if (*it!="this") + { + if (CField::has(*it)) + { + CField* field=CField::get(*it) ; + field->processEnabledField() ; + associatedInstantFieldIds[*it]=field ; + } + else ERROR("void CField::buildExpression(void)",<<" Field "<<*it<<" does not exist") ; + } + } + + set averageFieldIds ; + map associatedAverageFieldIds ; + + expression->getAverageFieldIds(averageFieldIds) ; + for (set::iterator it=averageFieldIds.begin() ; it!=averageFieldIds.end();++it) + { + if (CField::has(*it)) + { + CFieldGroup* root=CFieldGroup::get("field_definition") ; + CField* averageField=root->createChild() ; + CField* instantField=root->createChild() ; + averageField->field_ref=*it ; + averageField->hasFieldOut=true ; + averageField->fieldOut=instantField ; + instantField->freq_op=freq_op ; + averageField-> processEnabledField() ; + instantField->SuperClassAttribute::setAttributes(averageField, true); + instantField->field_ref.reset() ; + instantField->operation.reset() ; + + instantField-> processEnabledField() ; + associatedAverageFieldIds[*it]=instantField ; + } + else ERROR("void CField::buildExpression(void)",<<" Field "<<*it<<" does not exist") ; + } + + expression->reduce(this,associatedInstantFieldIds,associatedAverageFieldIds) ; + + slots.resize(instantFieldIds.size()+averageFieldIds.size()) ; + resetSlots() ; + int slotId=0 ; + set fields ; + expression->getFields(fields) ; + for (set::iterator it=fields.begin() ; it!=fields.end();++it,++slotId) (*it)->addDependency(this,slotId) ; + hasExpression=true; + } + } + + void CField::resetSlots(void) + { + for(vector::iterator it=slots.begin();it!=slots.end();++it) *it=false ; + } + + bool CField::slotsFull(void) + { + bool ret=true ; + for(vector::iterator it=slots.begin();it!=slots.end();++it) ret &= *it; + return ret ; + } + + + void CField::setSlot(int slotId) + { + CContext* context = CContext::getCurrent() ; + const CDate & currDate = context->getCalendar()->getCurrentDate(); + if (slotUpdateDate==NULL || currDate!=*slotUpdateDate) + { + resetSlots() ; + if (slotUpdateDate==NULL) slotUpdateDate=new CDate(currDate) ; + else *slotUpdateDate=currDate ; + } + slots[slotId]=true ; + if (slotsFull()) + { + CArray expr(expression->compute()) ; + + if (hasInstantData) + { + instantData=expr ; + for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) + if (it->first!=this) it->first->setSlot(it->second) ; + } + + if (hasOutputFile) updateDataFromExpression(expr) ; + + } + } + + + + CVariable* CField::addVariable(const string& id) + { + return vVariableGroup->createChild(id) ; + } + + CVariableGroup* CField::addVariableGroup(const string& id) + { + return vVariableGroup->createChildGroup(id) ; + } + + + void CField::sendAddVariable(const string& id) + { + CContext* context=CContext::getCurrent() ; + + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + + void CField::sendAddVariableGroup(const string& id) + { + CContext* context=CContext::getCurrent() ; + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE_GROUP) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + void CField::recvAddVariable(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvAddVariable(*buffer) ; + } + + + void CField::recvAddVariable(CBufferIn& buffer) + { + string id ; + buffer>>id ; + addVariable(id) ; + } + + void CField::recvAddVariableGroup(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvAddVariableGroup(*buffer) ; + } + + + void CField::recvAddVariableGroup(CBufferIn& buffer) + { + string id ; + buffer>>id ; + addVariableGroup(id) ; + } + + + + +} // namespace xios diff --git a/src/node/field.hpp b/src/node/field.hpp new file mode 100644 index 0000000..39b536a --- /dev/null +++ b/src/node/field.hpp @@ -0,0 +1,214 @@ +#ifndef __XMLIO_CField__ +#define __XMLIO_CField__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "group_factory.hpp" +#include "functor.hpp" +#include "functor_type.hpp" +#include "duration.hpp" +#include "date.hpp" +#include "declare_group.hpp" +#include "calendar_util.hpp" +#include "array_new.hpp" +#include "attribute_array.hpp" +#include "expr_node.hpp" +//#include "context.hpp" + + +namespace xios { + + /// ////////////////////// Déclarations ////////////////////// /// + + class CFieldGroup; + class CFieldAttributes; + class CField; + + class CFile; + class CGrid; + class CContext ; + ///-------------------------------------------------------------- + + // Declare/Define CFieldAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CField) +# include "field_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CField) + + ///-------------------------------------------------------------- + class CField + : public CObjectTemplate + , public CFieldAttributes + { + /// friend /// + friend class CFile; + + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CFieldAttributes SuperClassAttribute; + + public : + + typedef CFieldAttributes RelAttributes; + typedef CFieldGroup RelGroup; + + enum EEventId + { + EVENT_ID_UPDATE_DATA, EVENT_ID_ADD_VARIABLE, EVENT_ID_ADD_VARIABLE_GROUP + } ; + + /// Constructeurs /// + CField(void); + explicit CField(const StdString & id); + CField(const CField & field); // Not implemented yet. + CField(const CField * const field); // Not implemented yet. + + /// Accesseurs /// + CField* getDirectFieldReference(void) const; + CField* getBaseFieldReference(void) const; + void addReference(CField* field) ; + const std::vector & getAllReference(void) const; + + CGrid* getRelGrid(void) const ; + CFile* getRelFile(void) const ; + + public : + + StdSize getNStep(void) const; + + const CDuration & getFreqOperation(void) const; + const CDuration & getFreqWrite(void) const; + + boost::shared_ptr getLastWriteDate(void) const; + boost::shared_ptr getLastOperationDate(void) const; + + boost::shared_ptr getFieldOperation(void) const; + + CArray getData(void) const; + + const StdString & getBaseFieldId(void) const; + + /// Mutateur /// + void setRelFile(CFile* _file); + void incrementNStep(void); + void resetNStep() ; + + template bool updateData(const CArray& data); + bool updateDataFromExpression(const CArray& data); + void setDataFromExpression(const CArray& _data) ; + + bool updateDataServer + (const CDate & currDate, + const std::deque< CArray* > storedClient); + + public : + + /// Test /// + bool hasDirectFieldReference(void) const; + bool isActive(void) const; + bool active ; + bool hasOutputFile ; + bool hasFieldOut ; + + /// Traitements /// + void processEnabledField(void) ; + void solveRefInheritance(bool apply); + void solveBaseReference(void); + void solveGridReference(void); + void solveOperation(void); + +// virtual void fromBinary(StdIStream & is); + + /// Destructeur /// + virtual ~CField(void); + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + + static ENodeType GetType(void); + + template void setData(const CArray& _data) ; + static bool dispatchEvent(CEventServer& event) ; + void sendUpdateData(void) ; + static void recvUpdateData(CEventServer& event) ; + void recvUpdateData(vector& ranks, vector& buffers) ; + void writeField(void) ; + void outputField(CArray& fieldOut) ; + void outputField(CArray& fieldOut) ; + void scaleFactorAddOffset(double scaleFactor, double addOffset) ; + void parse(xml::CXMLNode & node) ; + CArray* getInstantData(void) ; + + void setVirtualVariableGroup(CVariableGroup* newVVariableGroup); + void setVirtualVariableGroup(void); + CVariableGroup* getVirtualVariableGroup(void) const; + vector getAllVariables(void) const; + virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0); + + CVariable* addVariable(const string& id="") ; + CVariableGroup* addVariableGroup(const string& id="") ; + void sendAddVariable(const string& id="") ; + void sendAddVariableGroup(const string& id="") ; + static void recvAddVariable(CEventServer& event) ; + void recvAddVariable(CBufferIn& buffer) ; + static void recvAddVariableGroup(CEventServer& event) ; + void recvAddVariableGroup(CBufferIn& buffer) ; + + public : + + /// Propriétés privées /// + CVariableGroup* vVariableGroup ; + + std::vector refObject; + CField* baseRefObject; + CGrid* grid ; + CFile* file; + CField* fieldOut ; + + CDuration freq_operation, freq_write; + CDuration freq_operation_srv, freq_write_srv; + + StdSize nstep; + boost::shared_ptr last_Write, last_operation; + boost::shared_ptr lastlast_Write_srv,last_Write_srv, last_operation_srv; + + boost::shared_ptr foperation; + map > foperation_srv; + + CArray data; + CArray instantData; + bool hasInstantData ; + map* > data_srv ; + bool isOnceOperation ; + bool isFirstOperation ; + string content ; + + list< pair > fieldDependency ; + void buildExpression(void) ; + void addDependency(CField* field, int slotId) ; + void resetSlots(void) ; + vector slots ; + CDate* slotUpdateDate ; + CFieldNode * expression ; + bool hasExpression ; + bool slotsFull(void) ; + void setSlot(int slotId); + bool processed ; + + }; // class CField + + ///-------------------------------------------------------------- + + // Declare/Define CFieldGroup and CFieldDefinition + DECLARE_GROUP(CField); + + ///----------------------------------------------------------------- + + template <> + void CGroupTemplate::solveRefInheritance(void); + + ///----------------------------------------------------------------- +} // namespace xios + + +#endif // __XMLIO_CField__ diff --git a/src/node/field_decl.cpp b/src/node/field_decl.cpp new file mode 100644 index 0000000..bd0b072 --- /dev/null +++ b/src/node/field_decl.cpp @@ -0,0 +1,9 @@ +#include "field_impl.hpp" + +namespace xios +{ + template void CField::setData<1>(const CArray& _data) ; + template void CField::setData<2>(const CArray& _data) ; + template void CField::setData<3>(const CArray& _data) ; + +} diff --git a/src/node/field_impl.hpp b/src/node/field_impl.hpp new file mode 100644 index 0000000..65c3608 --- /dev/null +++ b/src/node/field_impl.hpp @@ -0,0 +1,177 @@ + +#ifndef __FIELD_IMPL_HPP__ +#define __FIELD_IMPL_HPP__ + +#include "xmlioserver_spl.hpp" +#include "field.hpp" +#include "context.hpp" +#include "grid.hpp" +#include "timer.hpp" +#include "array_new.hpp" + + +namespace xios { + + template + void CField::setData(const CArray& _data) + { + if (hasInstantData) + { + grid->inputField(_data, instantData); + for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) it->first->setSlot(it->second) ; + } + + if (!hasExpression) + { + const std::vector& refField=getAllReference(); + std::vector::const_iterator it = refField.begin(), end = refField.end(); + + for (; it != end; it++) (*it)->setData(_data) ; + if (hasOutputFile || hasFieldOut) updateData(_data) ; + } + + } + + void CField::setDataFromExpression(const CArray& _data) + { + if (hasInstantData) + { + instantData=_data; + for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) it->first->setSlot(it->second) ; + } + + if (!hasExpression) + { + const std::vector& refField=getAllReference(); + std::vector::const_iterator it = refField.begin(), end = refField.end(); + + for (; it != end; it++) (*it)->setData(_data) ; + if (hasOutputFile || hasFieldOut) updateData(_data) ; + } + + } + + template + bool CField::updateData(const CArray& _data) + { + CContext* context=CContext::getCurrent(); + const CDate & currDate = context->getCalendar()->getCurrentDate(); + const CDate opeDate = *last_operation + freq_operation; + const CDate writeDate = *last_Write + freq_write; + bool doOperation, doWrite; + + + info(50) << "CField::updateData " << currDate << " : send data to " << this->getBaseFieldId() << std::endl; + info(50) << "Next operation " << opeDate<data.numElements() != this->grid->storeIndex_client.numElements()) + { + this->data.resize(this->grid->storeIndex_client.numElements()); + } + + CArray input(data.numElements()) ; + this->grid->inputField(_data, input); + (*this->foperation)(input); + + *last_operation = currDate; + info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; + } + + doWrite = (writeDate < (currDate + freq_operation)) ; + if (isOnceOperation) + { + if(isFirstOperation) + { + doWrite=true ; + isFirstOperation=false ; + } + else doWrite=false ; + } + + if (doWrite) + { + this->foperation->final(); + *last_Write = writeDate; + if (hasOutputFile) + { + info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; + CTimer::get("XIOS Send Data").resume() ; + sendUpdateData() ; + CTimer::get("XIOS Send Data").suspend() ; + } + + if (hasFieldOut) + { + fieldOut->setDataFromExpression(data) ; + } + return (true); + } + + return (false); + } + + bool CField::updateDataFromExpression(const CArray& _data) + { + CContext* context=CContext::getCurrent(); + const CDate & currDate = context->getCalendar()->getCurrentDate(); + const CDate opeDate = *last_operation + freq_operation; + const CDate writeDate = *last_Write + freq_write; + bool doOperation, doWrite; + + + info(50) << "CField::updateData " << currDate << " : send data to " << this->getBaseFieldId() << std::endl; + info(50) << "Next operation " << opeDate<data.numElements() != this->grid->storeIndex_client.numElements()) + { + this->data.resize(this->grid->storeIndex_client.numElements()); + } + + (*this->foperation)(_data); + + *last_operation = currDate; + info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; + } + + doWrite = (writeDate < (currDate + freq_operation)) ; + if (isOnceOperation) + { + if(isFirstOperation) + { + doWrite=true ; + isFirstOperation=false ; + } + else doWrite=false ; + } + + if (doWrite) + { + this->foperation->final(); + *last_Write = writeDate; + info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; + CTimer::get("XIOS Send Data").resume() ; + sendUpdateData() ; + CTimer::get("XIOS Send Data").suspend() ; + return (true); + } + + return (false); + } + +} // namespace xios + +#endif diff --git a/src/node/file.cpp b/src/node/file.cpp new file mode 100644 index 0000000..02262c4 --- /dev/null +++ b/src/node/file.cpp @@ -0,0 +1,678 @@ +#include "file.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "object_factory.hpp" +#include "data_output.hpp" +#include "context.hpp" +#include "context_server.hpp" +#include "nc4_data_output.hpp" +#include "calendar_util.hpp" +#include "date.hpp" +#include "message.hpp" +#include "type.hpp" +#include "xmlioserver_spl.hpp" +#include "context_client.hpp" +#include "mpi.hpp" + +namespace xios { + + /// ////////////////////// Définitions ////////////////////// /// + + CFile::CFile(void) + : CObjectTemplate(), CFileAttributes() + , vFieldGroup(), data_out(), enabledFields(), fileComm(MPI_COMM_NULL) + { + setVirtualFieldGroup() ; + setVirtualVariableGroup() ; + } + + CFile::CFile(const StdString & id) + : CObjectTemplate(id), CFileAttributes() + , vFieldGroup(), data_out(), enabledFields(), fileComm(MPI_COMM_NULL) + { + setVirtualFieldGroup() ; + setVirtualVariableGroup() ; + } + + CFile::~CFile(void) + { /* Ne rien faire de plus */ } + + ///--------------------------------------------------------------- + + StdString CFile::GetName(void) { return (StdString("file")); } + StdString CFile::GetDefName(void){ return (CFile::GetName()); } + ENodeType CFile::GetType(void) { return (eFile); } + + //---------------------------------------------------------------- + + boost::shared_ptr CFile::getDataOutput(void) const + { + return (data_out); + } + + CFieldGroup* CFile::getVirtualFieldGroup(void) const + { + return (this->vFieldGroup); + } + + CVariableGroup* CFile::getVirtualVariableGroup(void) const + { + return (this->vVariableGroup); + } + + std::vector CFile::getAllFields(void) const + { + return (this->vFieldGroup->getAllChildren()); + } + + std::vector CFile::getAllVariables(void) const + { + return (this->vVariableGroup->getAllChildren()); + } + + //---------------------------------------------------------------- + + std::vector CFile::getEnabledFields(int default_outputlevel, + int default_level, + bool default_enabled) + { + if (!this->enabledFields.empty()) + return (this->enabledFields); + + const int _outputlevel = + (!output_level.isEmpty()) ? output_level.getValue() : default_outputlevel; + std::vector::iterator it; + this->enabledFields = this->getAllFields(); + + std::vector newEnabledFields; + + for ( it = this->enabledFields.begin() ; it != this->enabledFields.end(); it++ ) + { + if (!(*it)->enabled.isEmpty()) // Si l'attribut 'enabled' est défini ... + { + if (! (*it)->enabled.getValue()) continue; +// { it--; this->enabledFields.erase(it+1); continue; } + } + else // Si l'attribut 'enabled' n'est pas défini ... + { + if (!default_enabled) continue ; +// { it--; this->enabledFields.erase(it+1); continue; } + } + + if (!(*it)->level.isEmpty()) // Si l'attribut 'level' est défini ... + { + if ((*it)->level.getValue() > _outputlevel) continue ; +// { it--; this->enabledFields.erase(it+1); continue; } + } + else // Si l'attribut 'level' n'est pas défini ... + { + if (default_level > _outputlevel) continue ; +// { it--; this->enabledFields.erase(it+1); continue; } + } + +// CField* field_tmp=(*it).get() ; +// shared_ptr sptfield=*it ; +// field_tmp->refObject.push_back(sptfield) ; + newEnabledFields.push_back(*it) ; + // Le champ est finalement actif, on y ajoute sa propre reference. +// (*it)->refObject.push_back(*it); + // Le champ est finalement actif, on y ajoute la référence au champ de base. + (*it)->setRelFile(CFile::get(this)); +// (*it)->baseRefObject->refObject.push_back(*it); + // A faire, ajouter les references intermediaires... + } + enabledFields=newEnabledFields ; + + return (this->enabledFields); + } + + //---------------------------------------------------------------- + + void CFile::setVirtualFieldGroup(CFieldGroup* newVFieldGroup) + { + this->vFieldGroup = newVFieldGroup; + } + + void CFile::setVirtualVariableGroup(CVariableGroup* newVVariableGroup) + { + this->vVariableGroup = newVVariableGroup; + } + + //---------------------------------------------------------------- + + void CFile::setVirtualFieldGroup(void) + { + this->setVirtualFieldGroup(CFieldGroup::create()); + } + + void CFile::setVirtualVariableGroup(void) + { + this->setVirtualVariableGroup(CVariableGroup::create()); + } + + //---------------------------------------------------------------- + bool CFile::isSyncTime(void) + { + CContext* context = CContext::getCurrent() ; + CDate& currentDate=context->calendar->getCurrentDate() ; + if (! sync_freq.isEmpty()) + { + if (*lastSync+syncFreq < currentDate) + { + *lastSync=currentDate ; + return true ; + } + } + return false ; + } + + void CFile::initFile(void) + { + CContext* context = CContext::getCurrent() ; + CDate& currentDate=context->calendar->getCurrentDate() ; + CContextServer* server=context->server ; + + if (! sync_freq.isEmpty()) syncFreq = CDuration::FromString(sync_freq.getValue()); + if (! split_freq.isEmpty()) splitFreq = CDuration::FromString(split_freq.getValue()); + if (! output_freq.isEmpty()) outputFreq = CDuration::FromString(output_freq.getValue()); + lastSync=new CDate(currentDate) ; + lastSplit=new CDate(currentDate) ; + isOpen=false ; + + allDomainEmpty=true ; + set setDomain ; + + std::vector::iterator it, end = this->enabledFields.end(); + for (it = this->enabledFields.begin() ;it != end; it++) + { + CField* field = *it; + allDomainEmpty&=field->grid->domain->isEmpty() ; + setDomain.insert(field->grid->domain) ; + } + nbDomain=setDomain.size() ; + + // create sub communicator for file + int color=allDomainEmpty?0:1 ; + MPI_Comm_split(server->intraComm,color,server->intraCommRank,&fileComm) ; + if (allDomainEmpty) MPI_Comm_free(&fileComm) ; + // + + } + + void CFile::checkFile(void) + { + if (!isOpen) createHeader() ; + checkSync() ; + checkSplit() ; + } + + + bool CFile::checkSync(void) + { + CContext* context = CContext::getCurrent() ; + CDate& currentDate=context->calendar->getCurrentDate() ; + if (! sync_freq.isEmpty()) + { + if (*lastSync+syncFreq <= currentDate) + { + *lastSync=currentDate ; + data_out->syncFile() ; + return true ; + } + } + return false ; + } + + + bool CFile::checkSplit(void) + { + CContext* context = CContext::getCurrent() ; + CDate& currentDate=context->calendar->getCurrentDate() ; + if (! split_freq.isEmpty()) + { + if (currentDate > *lastSplit+splitFreq) + { + *lastSplit=*lastSplit+splitFreq ; + std::vector::iterator it, end = this->enabledFields.end(); + for (it = this->enabledFields.begin() ;it != end; it++) (*it)->resetNStep() ; + createHeader() ; + return true ; + } + } + return false ; + } + + void CFile::createHeader(void) + { + CContext* context = CContext::getCurrent() ; + CContextServer* server=context->server ; + + if (!allDomainEmpty) + { + StdString filename = (!name.isEmpty()) ? name.getValue() : getId(); + StdOStringStream oss; + oss << filename; + if (!name_suffix.isEmpty()) oss << name_suffix.getValue(); +// if (!split_freq.isEmpty()) oss<<"_"<getStryyyymmdd()<<"-"<< (*lastSplit+(splitFreq-1*Second)).getStryyyymmdd(); +// if (!split_freq.isEmpty()) oss<<"_"<getStr("%y_%mo_%d")<<"-"<< (*lastSplit+(splitFreq-1*Second)).getStr("%y_%mo_%d"); + if (!split_freq.isEmpty()) + { + string splitFormat ; + if (split_freq_format.isEmpty()) + { + if (splitFreq.second!=0) splitFormat="%y%mo%d%h%mi%s"; + else if (splitFreq.minute!=0) splitFormat="%y%mo%d%h%mi"; + else if (splitFreq.hour!=0) splitFormat="%y%mo%d%h"; + else if (splitFreq.day!=0) splitFormat="%y%mo%d"; + else if (splitFreq.month!=0) splitFormat="%y%mo"; + else splitFormat="%y"; + } + else splitFormat=split_freq_format ; + oss<<"_"<getStr(splitFormat)<<"-"<< (*lastSplit+(splitFreq-1*Second)).getStr(splitFormat); + } + + bool multifile=true ; + if (!type.isEmpty()) + { + if (type==type_attr::one_file) multifile=false ; + else if (type==type_attr::multiple_file) multifile=true ; + + } +#ifndef USING_NETCDF_PAR + if (!multifile) + { + info(0)<<"!!! Warning -> Using non parallel version of netcdf, switching in multiple_file mode for file : "<intraCommSize > 1) + { + oss << "_" ; + int width=0 ; int n=commSize-1 ; + while(n != 0) { n=n/10 ; width++ ;} + if (!min_digits.isEmpty()) + if (widthcloseFile() ; + bool isCollective=true ; + if (!par_access.isEmpty()) + { + if (par_access.getValue()=="independent") isCollective=false ; + else if (par_access.getValue()=="collective") isCollective=true ; + else + { + ERROR("void Context::createDataOutput(void)", + "incorrect file attribut : must be or , " + <<"having : <"<") ; + } + } + data_out=shared_ptr(new CNc4DataOutput(oss.str(), false, fileComm, multifile, isCollective)); + isOpen=true ; + + data_out->writeFile(CFile::get(this)); + std::vector::iterator it, end = this->enabledFields.end(); + for (it = this->enabledFields.begin() ;it != end; it++) + { + CField* field = *it; + this->data_out->writeFieldGrid(field); + } + this->data_out->writeTimeDimension(); + + for (it = this->enabledFields.begin() ;it != end; it++) + { + CField* field = *it; + this->data_out->writeField(field); + } + + vector listVars = getAllVariables() ; + for (vector::iterator it = listVars.begin() ;it != listVars.end(); it++) this-> data_out-> writeAttribute(*it) ; + + this->data_out->definition_end(); + } + } + + void CFile::close(void) + { + delete lastSync ; + delete lastSplit ; + if (!allDomainEmpty) + if (isOpen) + { + this->data_out->closeFile(); + } + if (fileComm != MPI_COMM_NULL) MPI_Comm_free(&fileComm) ; + } + //---------------------------------------------------------------- + + void CFile::parse(xml::CXMLNode & node) + { + SuperClass::parse(node); + + if (node.goToChildElement()) + { + do + { + if (node.getElementName()=="field" || node.getElementName()=="field_group") this->getVirtualFieldGroup()->parseChild(node); + else if (node.getElementName()=="variable" || node.getElementName()=="variable_group") this->getVirtualVariableGroup()->parseChild(node); + } while (node.goToNextElement()) ; + node.goToParentElement(); + } + + } + //---------------------------------------------------------------- + + StdString CFile::toString(void) const + { + StdOStringStream oss; + + oss << "<" << CFile::GetName() << " "; + if (this->hasId()) + oss << " id=\"" << this->getId() << "\" "; + oss << SuperClassAttribute::toString() << ">" << std::endl; + if (this->getVirtualFieldGroup() != NULL) + oss << *this->getVirtualFieldGroup() << std::endl; + oss << ""; + return (oss.str()); + } + + //---------------------------------------------------------------- + + void CFile::solveDescInheritance(bool apply, const CAttributeMap * const parent) + { + SuperClassAttribute::setAttributes(parent,apply); + this->getVirtualFieldGroup()->solveDescInheritance(apply, NULL); + this->getVirtualVariableGroup()->solveDescInheritance(apply, NULL); + } + + //---------------------------------------------------------------- + + void CFile::processEnabledFile(void) + { + if (output_freq.isEmpty()) ERROR("void CFile::processEnabledFile(void)", + <<"File attribute <> is undefined"); + solveFieldRefInheritance(true) ; + getEnabledFields() ; + processEnabledFields() ; + } + + void CFile::processEnabledFields(void) + { + for (unsigned int i = 0; i < this->enabledFields.size(); i++) + { + this->enabledFields[i]->processEnabledField() ; + } + } + + void CFile::solveFieldRefInheritance(bool apply) + { + // Résolution des héritages par référence de chacun des champs contenus dans le fichier. + std::vector allF = this->getAllFields(); + for (unsigned int i = 0; i < allF.size(); i++) + allF[i]->solveRefInheritance(apply); + } + + //---------------------------------------------------------------- + + void CFile::solveEFGridRef(void) + { + for (unsigned int i = 0; i < this->enabledFields.size(); i++) + this->enabledFields[i]->solveGridReference(); + } + + //---------------------------------------------------------------- + + void CFile::solveEFOperation(void) + { + for (unsigned int i = 0; i < this->enabledFields.size(); i++) + this->enabledFields[i]->solveOperation(); + } + + void CFile::solveEFExpression(void) + { + for (unsigned int i = 0; i < this->enabledFields.size(); i++) + this->enabledFields[i]->buildExpression(); + } + + + CField* CFile::addField(const string& id) + { + return vFieldGroup->createChild(id) ; + } + + CFieldGroup* CFile::addFieldGroup(const string& id) + { + return vFieldGroup->createChildGroup(id) ; + } + + CVariable* CFile::addVariable(const string& id) + { + return vVariableGroup->createChild(id) ; + } + + CVariableGroup* CFile::addVariableGroup(const string& id) + { + return vVariableGroup->createChildGroup(id) ; + } + + + void CFile::sendAddField(const string& id) + { + CContext* context=CContext::getCurrent() ; + + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_ADD_FIELD) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + void CFile::sendAddFieldGroup(const string& id) + { + CContext* context=CContext::getCurrent() ; + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_ADD_FIELD_GROUP) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + void CFile::recvAddField(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvAddField(*buffer) ; + } + + + void CFile::recvAddField(CBufferIn& buffer) + { + string id ; + buffer>>id ; + addField(id) ; + } + + void CFile::recvAddFieldGroup(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvAddFieldGroup(*buffer) ; + } + + + void CFile::recvAddFieldGroup(CBufferIn& buffer) + { + string id ; + buffer>>id ; + addFieldGroup(id) ; + } + + + + + + + + + + + + void CFile::sendAddVariable(const string& id) + { + CContext* context=CContext::getCurrent() ; + + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + void CFile::sendAddVariableGroup(const string& id) + { + CContext* context=CContext::getCurrent() ; + if (! context->hasServer ) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE_GROUP) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + void CFile::recvAddVariable(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvAddVariable(*buffer) ; + } + + + void CFile::recvAddVariable(CBufferIn& buffer) + { + string id ; + buffer>>id ; + addVariable(id) ; + } + + void CFile::recvAddVariableGroup(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvAddVariableGroup(*buffer) ; + } + + + void CFile::recvAddVariableGroup(CBufferIn& buffer) + { + string id ; + buffer>>id ; + addVariableGroup(id) ; + } + + + + + + bool CFile::dispatchEvent(CEventServer& event) + { + if (SuperClass::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_ADD_FIELD : + recvAddField(event) ; + return true ; + break ; + + case EVENT_ID_ADD_FIELD_GROUP : + recvAddFieldGroup(event) ; + return true ; + break ; + + case EVENT_ID_ADD_VARIABLE : + recvAddVariable(event) ; + return true ; + break ; + + case EVENT_ID_ADD_VARIABLE_GROUP : + recvAddVariableGroup(event) ; + return true ; + break ; + default : + ERROR("bool CFile::dispatchEvent(CEventServer& event)", <<"Unknown Event") ; + return false ; + } + } + } + + + + + ///--------------------------------------------------------------- + +} // namespace xios diff --git a/src/node/file.hpp b/src/node/file.hpp new file mode 100644 index 0000000..a9fc3d2 --- /dev/null +++ b/src/node/file.hpp @@ -0,0 +1,154 @@ +#ifndef __XMLIO_CFile__ +#define __XMLIO_CFile__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "field.hpp" +#include "data_output.hpp" +#include "declare_group.hpp" +#include "date.hpp" +#include "attribute_enum.hpp" +#include "attribute_enum_impl.hpp" +#include "mpi.hpp" + + + +namespace xios { + + /// ////////////////////// Déclarations ////////////////////// /// + + class CFileGroup; + class CFileAttributes; + class CFile; + + ///-------------------------------------------------------------- + + // Declare/Define CFileAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CFile) +# include "file_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CFile) + + ///-------------------------------------------------------------- + + class CFile + : public CObjectTemplate + , public CFileAttributes + { + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CFileAttributes SuperClassAttribute; + + public : + enum EEventId + { + EVENT_ID_ADD_FIELD=0,EVENT_ID_ADD_FIELD_GROUP, EVENT_ID_ADD_VARIABLE,EVENT_ID_ADD_VARIABLE_GROUP + } ; + + typedef CFileAttributes RelAttributes; + typedef CFileGroup RelGroup; + + /// Constructeurs /// + CFile(void); + explicit CFile(const StdString & id); + CFile(const CFile & file); // Not implemented yet. + CFile(const CFile * const file); // Not implemented yet. + + /// Accesseurs /// + boost::shared_ptr getDataOutput(void) const; + CFieldGroup* getVirtualFieldGroup(void) const; + CVariableGroup* getVirtualVariableGroup(void) const; + std::vector getAllFields(void) const; + std::vector getAllVariables(void) const; + + std::vector getEnabledFields(int default_outputlevel = 5, + int default_level = 1, + bool default_enabled = true); + + public : + + /// Mutateurs /// + void setVirtualFieldGroup(CFieldGroup* newVFieldGroup); + void setVirtualFieldGroup(void); + void setVirtualVariableGroup(CVariableGroup* newVVariableGroup); + void setVirtualVariableGroup(void); + void processEnabledFile(void) ; + void processEnabledFields(void) ; + void createHeader(void); + void close(void) ; + + /// Traitements /// + virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0); + void solveFieldRefInheritance(bool apply); + void solveEFGridRef(void); + void solveEFOperation(void); + void solveEFExpression(void); + + /// Destructeur /// + virtual ~CFile(void); + + /// Autres /// + virtual void parse(xml::CXMLNode & node); + virtual StdString toString(void) const; + +// virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + + static ENodeType GetType(void); + + bool allDomainEmpty ; + CField* addField(const string& id="") ; + CFieldGroup* addFieldGroup(const string& id="") ; + CVariable* addVariable(const string& id="") ; + CVariableGroup* addVariableGroup(const string& id="") ; + void sendAddField(const string& id="") ; + void sendAddFieldGroup(const string& id="") ; + static void recvAddField(CEventServer& event) ; + void recvAddField(CBufferIn& buffer) ; + static void recvAddFieldGroup(CEventServer& event) ; + void recvAddFieldGroup(CBufferIn& buffer) ; + + void sendAddVariable(const string& id="") ; + void sendAddVariableGroup(const string& id="") ; + static void recvAddVariable(CEventServer& event) ; + void recvAddVariable(CBufferIn& buffer) ; + static void recvAddVariableGroup(CEventServer& event) ; + void recvAddVariableGroup(CBufferIn& buffer) ; + static bool dispatchEvent(CEventServer& event) ; + + bool isSyncTime(void) ; + bool checkSplit(void) ; + bool checkSync(void) ; + void checkFile(void) ; + void initFile(void) ; + CDate* lastSync ; + CDate* lastSplit ; + CDuration syncFreq ; + CDuration splitFreq ; + CDuration outputFreq ; + int nbDomain ; + bool isOpen ; + MPI_Comm fileComm ; + private : + + /// Propriétés privées /// + CFieldGroup* vFieldGroup; + CVariableGroup* vVariableGroup ; + boost::shared_ptr data_out; + std::vector enabledFields; + + }; // class CFile + + ///-------------------------------------------------------------- + + // Declare/Define CFileGroup and CFileDefinition + DECLARE_GROUP(CFile); + + ///-------------------------------------------------------------- + +} // namespace xios + +#endif // __XMLIO_CFile__ diff --git a/src/node/grid.cpp b/src/node/grid.cpp new file mode 100644 index 0000000..8777a65 --- /dev/null +++ b/src/node/grid.cpp @@ -0,0 +1,550 @@ + +#include "grid.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "message.hpp" +#include +#include "xmlioserver_spl.hpp" +#include "type.hpp" +#include "context.hpp" +#include "context_client.hpp" +#include "array_new.hpp" + +namespace xios { + + /// ////////////////////// Définitions ////////////////////// /// + + CGrid::CGrid(void) + : CObjectTemplate(), CGridAttributes() + , withAxis(false), isChecked(false), axis(), domain() + , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1) + { /* Ne rien faire de plus */ } + + CGrid::CGrid(const StdString & id) + : CObjectTemplate(id), CGridAttributes() + , withAxis(false), isChecked(false), axis(), domain() + , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1) + { /* Ne rien faire de plus */ } + + CGrid::~CGrid(void) + { + // this->axis.reset() ; +// this->domain.reset() ; + deque< CArray* >::iterator it ; + + for(deque< CArray* >::iterator it=storeIndex.begin(); it!=storeIndex.end();it++) delete *it ; + for(deque< CArray* >::iterator it=out_i_index.begin();it!=out_i_index.end();it++) delete *it ; + for(deque< CArray* >::iterator it=out_j_index.begin();it!=out_j_index.end();it++) delete *it ; + for(deque< CArray* >::iterator it=out_l_index.begin();it!=out_l_index.end();it++) delete *it ; + + for(map* >::iterator it=out_i_fromClient.begin();it!=out_i_fromClient.end();it++) delete it->second ; + for(map* >::iterator it=out_j_fromClient.begin();it!=out_j_fromClient.end();it++) delete it->second ; + for(map* >::iterator it=out_l_fromClient.begin();it!=out_l_fromClient.end();it++) delete it->second ; + + } + + ///--------------------------------------------------------------- + + StdString CGrid::GetName(void) { return (StdString("grid")); } + StdString CGrid::GetDefName(void) { return (CGrid::GetName()); } + ENodeType CGrid::GetType(void) { return (eGrid); } + + //---------------------------------------------------------------- + + const std::deque< CArray* > & CGrid::getStoreIndex(void) const + { + return (this->storeIndex ); + } + + //--------------------------------------------------------------- + + const std::deque< CArray* > & CGrid::getOutIIndex(void) const + { + return (this->out_i_index ); + } + + //--------------------------------------------------------------- + + const std::deque< CArray* > & CGrid::getOutJIndex(void) const + { + return (this->out_j_index ); + } + + //--------------------------------------------------------------- + + const std::deque< CArray* > & CGrid::getOutLIndex(void) const + { + return (this->out_l_index ); + } + + //--------------------------------------------------------------- + + const CAxis* CGrid::getRelAxis (void) const + { + return (this->axis ); + } + + //--------------------------------------------------------------- + + const CDomain* CGrid::getRelDomain(void) const + { + return (this->domain ); + } + + //--------------------------------------------------------------- + + bool CGrid::hasAxis(void) const + { + return (this->withAxis); + } + + //--------------------------------------------------------------- + + StdSize CGrid::getDimension(void) const + { + return ((this->withAxis)?3:2); + } + + //--------------------------------------------------------------- + +/* + std::vector CGrid::getLocalShape(void) const + { + std::vector retvalue; + retvalue.push_back(domain->zoom_ni_loc.getValue()); + retvalue.push_back(domain->zoom_nj_loc.getValue()); + if (this->withAxis) + retvalue.push_back(this->axis->zoom_size.getValue()); + return (retvalue); + } +*/ + //--------------------------------------------------------------- + +/* + StdSize CGrid::getLocalSize(void) const + { + StdSize retvalue = 1; + std::vector shape_ = this->getLocalShape(); + for (StdSize s = 0; s < shape_.size(); s++) + retvalue *= shape_[s]; + return (retvalue); + } +*/ + //--------------------------------------------------------------- +/* + std::vector CGrid::getGlobalShape(void) const + { + std::vector retvalue; + retvalue.push_back(domain->ni.getValue()); + retvalue.push_back(domain->nj.getValue()); + if (this->withAxis) + retvalue.push_back(this->axis->size.getValue()); + return (retvalue); + } +*/ + //--------------------------------------------------------------- + +/* + StdSize CGrid::getGlobalSize(void) const + { + StdSize retvalue = 1; + std::vector shape_ = this->getGlobalShape(); + for (StdSize s = 0; s < shape_.size(); s++) + retvalue *= shape_[s]; + return (retvalue); + } +*/ + StdSize CGrid::getDataSize(void) const + { + StdSize retvalue=domain->data_ni.getValue() ; + if (domain->data_dim.getValue()==2) retvalue*=domain->data_nj.getValue() ; + if (this->withAxis) retvalue*=this->axis->size.getValue() ; + + return (retvalue); + } + + //--------------------------------------------------------------- + + void CGrid::solveReference(void) + { + if (this->isChecked) return; + CContext* context = CContext::getCurrent() ; + CContextClient* client=context->client ; + + this->solveDomainRef() ; + this->solveAxisRef() ; + + if (context->hasClient) + { + checkMask() ; + this->computeIndex() ; + + this->storeIndex.push_front(new CArray() ); + this->out_i_index.push_front(new CArray()); + this->out_j_index.push_front(new CArray()); + this->out_l_index.push_front(new CArray()); + } +// this->computeIndexServer(); + this->isChecked = true; + } + + + void CGrid::checkMask(void) + { + using namespace std; + + unsigned int niu = domain->ni, nju = domain->nj; + unsigned int nlu = 1 ; + if (hasAxis()) nlu=axis->size ; + + if (!mask.isEmpty()) + { + if ((mask.extent(0) != niu) || + (mask.extent(1) != nju) || + (mask.extent(2) != nlu)) + ERROR("CGrid::checkAttributes(void)", + <<"The mask has not the same size than the local grid"<& domainMask = domain->mask ; + for (int l=0; l < nlu ; l++) + for (int j=0; j < nju ; j++) + for(int i=0; idomain = CDomain::get(domain_ref.getValue()) ; + domain->checkAttributes() ; + } + else ERROR("CGrid::solveDomainRef(void)", + << "Wrong domain reference") ; + } + else ERROR("CGrid::solveDomainRef(void)", + << "Domain reference is not defined") ; + } + + //--------------------------------------------------------------- + + void CGrid::solveAxisRef(void) + { + if (!axis_ref.isEmpty()) + { + this->withAxis = true ; + if (CAxis::get(axis_ref.getValue())) + { + this->axis = CAxis::get(axis_ref.getValue()) ; + axis->checkAttributes() ; + } + else ERROR("CGrid::solveAxisRef(void)", + << "Wrong axis reference") ; + } + else withAxis = false ; + } + + //--------------------------------------------------------------- + + void CGrid::computeIndex(void) + { + + const int ni = domain->ni.getValue() , + nj = domain->nj.getValue() , + size = (this->hasAxis()) ? axis->size.getValue() : 1 , + lbegin = (this->hasAxis()) ? axis->zoom_begin.getValue()-1 : 0 , + lend = (this->hasAxis()) ? axis->zoom_end.getValue()-1 : 0 ; + + + const int data_dim = domain->data_dim.getValue() , + data_n_index = domain->data_n_index.getValue() , + data_ibegin = domain->data_ibegin.getValue() , + data_jbegin = (data_dim == 2) + ? domain->data_jbegin.getValue() : -1; + + CArray data_i_index = domain->data_i_index ; + CArray data_j_index = domain->data_j_index ; + + + int indexCount = 0; + + for(int l = 0; l < size ; l++) + { + for(int n = 0, i = 0, j = 0; n < data_n_index; n++) + { + int temp_i = data_i_index(n) + data_ibegin, + temp_j = (data_dim == 1) ? -1 + : data_j_index(n) + data_jbegin; + i = (data_dim == 1) ? (temp_i - 1) % ni + : (temp_i - 1) ; + j = (data_dim == 1) ? (temp_i - 1) / ni + : (temp_j - 1) ; + + if ((l >=lbegin && l<= lend) && + (i >= 0 && i < ni) && + (j >= 0 && j < nj) && mask(i,j,l)) + indexCount++ ; + } + } + + storeIndex[0] = new CArray(indexCount) ; + out_i_index[0] = new CArray(indexCount) ; + out_j_index[0] = new CArray(indexCount) ; + out_l_index[0] = new CArray(indexCount) ; + + storeIndex_client.resize(indexCount) ; + out_i_client.resize(indexCount) ; + out_j_client.resize(indexCount) ; + out_l_client.resize(indexCount) ; + + + for(int count = 0, indexCount = 0, l = 0; l < size; l++) + { + for(int n = 0, i = 0, j = 0; n < data_n_index; n++, count++) + { + int temp_i = data_i_index(n) + data_ibegin, + temp_j = (data_dim == 1) ? -1 + : data_j_index(n) + data_jbegin; + i = (data_dim == 1) ? (temp_i - 1) % ni + : (temp_i - 1) ; + j = (data_dim == 1) ? (temp_i - 1) / ni + : (temp_j - 1) ; + + if ((l >= lbegin && l <= lend) && + (i >= 0 && i < ni) && + (j >= 0 && j < nj) && mask(i,j,l)) + { + (*storeIndex[0])(indexCount) = count ; + (*out_l_index[0])(indexCount) = l ; + (*out_i_index[0])(indexCount) = i ; + (*out_j_index[0])(indexCount) = j ; + + storeIndex_client(indexCount) = count ; + out_i_client(indexCount)=i+domain->ibegin_client-1 ; + out_j_client(indexCount)=j+domain->jbegin_client-1 ; + out_l_client(indexCount)=l-lbegin ; + indexCount++ ; + } + } + } + sendIndex() ; + + + } + + //---------------------------------------------------------------- + + CGrid* CGrid::createGrid(CDomain* domain) + { + StdString new_id = StdString("__") + domain->getId() + StdString("__") ; + CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ; + grid->domain_ref.setValue(domain->getId()); + return (grid); + } + + CGrid* CGrid::createGrid(CDomain* domain, CAxis* axis) + { + StdString new_id = StdString("__") + domain->getId() + + StdString("_") + axis->getId() + StdString("__") ; + CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ; + grid->domain_ref.setValue(domain->getId()); + grid->axis_ref.setValue(axis->getId()); + return (grid); + } + + //---------------------------------------------------------------- + + void CGrid::outputField(int rank, const CArray& stored, CArray& field) + { + CArray& out_i=*out_i_fromClient[rank] ; + CArray& out_j=*out_j_fromClient[rank] ; + CArray& out_l=*out_l_fromClient[rank] ; + + for(StdSize n = 0; n < stored.numElements(); n++) + field(out_i(n), out_j(n), out_l(n)) = stored(n) ; + } + + void CGrid::outputField(int rank, const CArray& stored, CArray& field) + { + CArray& out_i=*out_i_fromClient[rank] ; + CArray& out_j=*out_j_fromClient[rank] ; + + for(StdSize n = 0; n < stored.numElements(); n++) + field(out_i(n), out_j(n)) = stored(n) ; } + + //--------------------------------------------------------------- + + void CGrid::outputField(int rank,const CArray& stored, CArray& field) + { + CArray& out_i=*out_i_fromClient[rank] ; + + for(StdSize n = 0; n < stored.numElements(); n++) + field(out_i(n)) = stored(n) ; + } + + //---------------------------------------------------------------- + + + void CGrid::storeField_arr + (const double * const data, CArray& stored) const + { + const StdSize size = storeIndex_client.numElements() ; + + stored.resize(size) ; + for(StdSize i = 0; i < size; i++) stored(i) = data[storeIndex_client(i)] ; + } + + //--------------------------------------------------------------- + + void CGrid::sendIndex(void) + { + CContext* context = CContext::getCurrent() ; + CContextClient* client=context->client ; + + CEventClient event(getType(),EVENT_ID_INDEX) ; + int rank ; + list > list_msg ; + list< CArray* > list_out_i,list_out_j,list_out_l ; + + for(int ns=0;nsconnectedServer.size();ns++) + { + rank=domain->connectedServer[ns] ; + + int i,j ; + int nb=0 ; + for(int k=0;kibegin +1; + j=out_j_client(k)- domain->jbegin +1; + if (domain->mapConnectedServer(i,j)==ns) nb++ ; + } + + CArray storeIndex(nb) ; + CArray out_i(nb) ; + CArray out_j(nb) ; + CArray out_l(nb) ; + + + nb=0 ; + for(int k=0;kibegin +1 ; + j=out_j_client(k)- domain->jbegin +1 ; + if (domain->mapConnectedServer(i,j)==ns) + { + storeIndex(nb)=k ; + out_i(nb)=domain->i_index(i,j) + domain->ibegin-1; + out_j(nb)=domain->j_index(i,j) + domain->jbegin-1; + out_l(nb)=out_l_client(k) ; + nb++ ; + } + } + + storeIndex_toSrv.insert( pair* >(rank,new CArray(storeIndex) )) ; + nbSenders.insert(pair(rank,domain->nbSenders[ns])) ; + list_msg.push_back(shared_ptr(new CMessage)) ; + list_out_i.push_back(new CArray(out_i)) ; + list_out_j.push_back(new CArray(out_j)) ; + list_out_l.push_back(new CArray(out_l)) ; + + *list_msg.back()<nbSenders[ns],*list_msg.back()) ; + } + client->sendEvent(event) ; + + for(list* >::iterator it=list_out_i.begin();it!=list_out_i.end();it++) delete *it ; + for(list* >::iterator it=list_out_j.begin();it!=list_out_j.end();it++) delete *it ; + for(list* >::iterator it=list_out_l.begin();it!=list_out_l.end();it++) delete *it ; + + } + + void CGrid::recvIndex(CEventServer& event) + { + list::iterator it ; + for (it=event.subEvents.begin();it!=event.subEvents.end();++it) + { + int rank=it->rank; + CBufferIn* buffer=it->buffer; + string domainId ; + *buffer>>domainId ; + get(domainId)->recvIndex(rank,*buffer) ; + } + } + + void CGrid::recvIndex(int rank, CBufferIn& buffer) + { + CArray out_i ; + CArray out_j ; + CArray out_l ; + + buffer>>out_i>>out_j>>out_l ; + + out_i -= domain->zoom_ibegin_srv-1 ; + out_j -= domain->zoom_jbegin_srv-1 ; + + out_i_fromClient.insert(pair< int,CArray* >(rank,new CArray(out_i) )) ; + out_j_fromClient.insert(pair< int,CArray* >(rank,new CArray(out_j) )) ; + out_l_fromClient.insert(pair< int,CArray* >(rank,new CArray(out_l) )) ; + } + + bool CGrid::dispatchEvent(CEventServer& event) + { + + if (SuperClass::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_INDEX : + recvIndex(event) ; + return true ; + break ; + + default : + ERROR("bool CDomain::dispatchEvent(CEventServer& event)", + <<"Unknown Event") ; + return false ; + } + } + } + + void CGrid::inputFieldServer(const std::deque< CArray* > storedClient, CArray& storedServer) const + { + if ((this->storeIndex.size()-1 ) != storedClient.size()) + ERROR("void CGrid::inputFieldServer(const std::deque< CArray* > storedClient, CArray& storedServer) const", + << "[ Expected received field = " << (this->storeIndex.size()-1) << ", " + << "[ received fiedl = " << storedClient.size() << "] " + << "Data from clients are missing!") ; + storedServer.resize(storeIndex[0]->numElements()); + + for (StdSize i = 0, n = 0; i < storedClient.size(); i++) + for (StdSize j = 0; j < storedClient[i]->numElements(); j++) + storedServer(n++) = (*storedClient[i])(j); + } + + void CGrid::outputFieldToServer(CArray& fieldIn, int rank, CArray& fieldOut) + { + CArray& index = *storeIndex_toSrv[rank] ; + int nb=index.numElements() ; + fieldOut.resize(nb) ; + + for(int k=0;k + , public CGridAttributes + { + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CGridAttributes SuperClassAttribute; + + public : + + typedef CGridAttributes RelAttributes; + typedef CGridGroup RelGroup; + + enum EEventId + { + EVENT_ID_INDEX + } ; + + /// Constructeurs /// + CGrid(void); + explicit CGrid(const StdString & id); + CGrid(const CGrid & grid); // Not implemented yet. + CGrid(const CGrid * const grid); // Not implemented yet. + + /// Traitements /// + void solveReference(void); + + // virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + + /// Tests /// + bool hasAxis(void) const; + + public : + + /// Accesseurs /// + const std::deque< CArray* > & getStoreIndex(void) const; + const std::deque< CArray* > & getOutIIndex(void) const; + const std::deque< CArray* > & getOutJIndex(void) const; + const std::deque< CArray* > & getOutLIndex(void) const; + + const CAxis* getRelAxis (void) const; + const CDomain* getRelDomain(void) const; + + StdSize getDimension(void) const; + +// StdSize getLocalSize(void) const; +// StdSize getGlobalSize(void) const; + StdSize getDataSize(void) const; +// std::vector getLocalShape(void) const; +// std::vector getGlobalShape(void) const; + + /// Entrées-sorties de champs /// + template + void inputField(const CArray& field, CArray& stored) const; + + void inputFieldServer(const std::deque< CArray* > storedClient, + CArray& storedServer) const; + + void outputField(int rank, const CArray& stored, CArray& field) ; + void outputField(int rank, const CArray& stored, CArray& field) ; + void outputField(int rank, const CArray& stored, CArray& field) ; + + /// Destructeur /// + virtual ~CGrid(void); + + public : + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + + static ENodeType GetType(void); + + /// Instanciateurs Statiques /// + static CGrid* createGrid(CDomain* domain); + static CGrid* createGrid(CDomain* domain, CAxis* axis); + + public : + + /// Entrées-sorties de champs (interne) /// + void storeField_arr(const double * const data, CArray& stored) const; + + /// Traitements protégés /// + void computeIndexServer(void); + void computeIndex(void); + void solveDomainRef(void); + void solveAxisRef(void); + + static bool dispatchEvent(CEventServer& event) ; + void outputFieldToServer(CArray& fieldIn, int rank, CArray& fieldOut) ; + static void recvIndex(CEventServer& event) ; + void recvIndex(int rank, CBufferIn& buffer) ; + void sendIndex(void) ; + + public: + + /// Propriétés privées /// + bool withAxis ; + bool isChecked; + + CAxis* axis ; + CDomain* domain ; + + std::deque< CArray* > storeIndex ; + std::deque< CArray* > out_i_index ; + std::deque< CArray* > out_j_index ; + std::deque< CArray* > out_l_index ; + + CArray storeIndex_client ; + CArray out_i_client ; + CArray out_j_client ; + CArray out_l_client ; + + map* > storeIndex_toSrv ; + map nbSenders ; +// std::deque out_i_toSrv ; +// std::deque out_j_toSrv ; +// std::deque out_l_toSrv ; + + map* > out_i_fromClient ; + map* > out_j_fromClient ; + map* > out_l_fromClient ; + void checkMask(void) ; + }; // class CGrid + + ///-------------------------------------------------------------- + + template + void CGrid::inputField(const CArray& field, CArray& stored) const + { + if (this->getDataSize() != field.numElements()) + ERROR("void CGrid::inputField(const CArray& field, CArray& stored) const", + << "[ Awaiting size of the data = " << this->getDataSize() << ", " + << "Received data size = " << field.numElements() << " ] " + << "The array of data has not the good size !") + this->storeField_arr(field.dataFirst(), stored) ; + } + + ///-------------------------------------------------------------- + + // Declare/Define CGridGroup and CGridDefinition + DECLARE_GROUP(CGrid); + + ///-------------------------------------------------------------- + +} // namespace xios + +#endif // __XMLIO_CGrid__ diff --git a/src/node/method.hpp b/src/node/method.hpp new file mode 100644 index 0000000..f34109a --- /dev/null +++ b/src/node/method.hpp @@ -0,0 +1,99 @@ +#ifndef __XMLIO_CMethod__ +#define __XMLIO_CMethod__ + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + class CMethodGroup; + class CMethodAttributes; + class CBaseMethod; + class CMethod; + + ///-------------------------------------------------------------- + + // Declare/Define CMethodAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CMethod) +#include "method_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CMethod) + + ///-------------------------------------------------------------- + + class CBaseMethod + { // Declare CMethod functionalities + public : + + /// Constructeur et Destructeur /// + CBaseMethod(void); + ~CBaseMethod(void); + + }; // class CBaseMethod + + ///-------------------------------------------------------------- + + class CMethod + : public CObjectTemplate + , public CMethodAttributes + , public CBaseMethod + { + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CMethodAttributes SuperClassAttribute; + typedef CBaseMethod SuperClassBase; + + public : + + typedef CMethodAttributes RelAttributes; + typedef CMethodGroup RelGroup; + + /// Constructeurs /// + CMethod(void); + explicit CMethod(const StdString & id); + CMethod(const CMethod & method); // Not implemented yet. + CMethod(const CMethod * const method); // Not implemented yet. + + /// Destructeur /// + virtual ~CMethod(void); + + /// Accesseurs statiques /// + static inline StdString GetName(void); + static inline StdString GetDefName(void); + + }; // class CMethod + + ///-------------------------------------------------------------- + + // Declare/Define CMethodGroup and CMethodDefinition + DECLARE_GROUP(CMethod); + + /// ////////////////////// Définitions ////////////////////// /// + + CBaseMethod::CBaseMethod(void) + { /* Ne rien faire de plus */ } + + CBaseMethod::~CBaseMethod(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + CMethod::CMethod(void) + : CObjectTemplate() + , CMethodAttributes() + , CBaseMethod() + { /* Ne rien faire de plus */ } + + CMethod::CMethod(const StdString & id) + : CObjectTemplate(id) + , CMethodAttributes() + , CBaseMethod() + { /* Ne rien faire de plus */ } + + CMethod::~CMethod(void) + { /* Ne rien faire de plus */ } + + StdString CMethod::GetName(void) { return (StdString("method")); } + StdString CMethod::GetDefName(void){ return (CMethod::GetName()); } + +} // namespace xios + +#endif // __XMLIO_CMethod__ diff --git a/src/node/node_enum.hpp b/src/node/node_enum.hpp new file mode 100644 index 0000000..b869592 --- /dev/null +++ b/src/node/node_enum.hpp @@ -0,0 +1,27 @@ +#ifndef __XMLIO_NODE_ENUM__ +#define __XMLIO_NODE_ENUM__ + +//#define DECLARE_NODE(Name_, name_) ,e##Name_, g##Name_ +//#define DECLARE_NODE_PAR(Name_, name_) ,e##Name_, g##Name_ + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + typedef enum _node_type + { + Unknown = 0, + eAxis,gAxis, + eDomain,gDomain, + eField,gField, + eFile,gFile, + eGrid,gGrid, + eVariable,gVariable, + eContext,gContext + +//#include "node_type.conf" + + } ENodeType; + +} // namespace xios + +#endif // __XMLIO_NODE_ENUM__ diff --git a/src/node/node_type.hpp b/src/node/node_type.hpp new file mode 100644 index 0000000..6804c62 --- /dev/null +++ b/src/node/node_type.hpp @@ -0,0 +1,12 @@ +#ifndef __XMLIO_NODE_TYPE__ +#define __XMLIO_NODE_TYPE__ + +#include "axis.hpp" +#include "domain.hpp" +#include "field.hpp" +#include "file.hpp" +#include "grid.hpp" +#include "variable.hpp" +#include "context.hpp" + +#endif // __XMLIO_NODE_TYPE__ diff --git a/src/node/var.hpp b/src/node/var.hpp new file mode 100644 index 0000000..95b3f8f --- /dev/null +++ b/src/node/var.hpp @@ -0,0 +1,99 @@ +#ifndef __XMLIO_CVar__ +#define __XMLIO_CVar__ + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + class CVarGroup; + class CVarAttributes; + class CBaseVar; + class CVar; + + ///-------------------------------------------------------------- + + // Declare/Define CVarAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CVar) +#include "var_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CVar) + + ///-------------------------------------------------------------- + + class CBaseVar + { // Declare CVar functionalities + public : + + /// Constructeur et Destructeur /// + CBaseVar(void); + ~CBaseVar(void); + + }; // class CBaseVar + + ///-------------------------------------------------------------- + + class CVar + : public CObjectTemplate + , public CVarAttributes + , public CBaseVar + { + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CVarAttributes SuperClassAttribute; + typedef CBaseVar SuperClassBase; + + public : + + typedef CVarAttributes RelAttributes; + typedef CVarGroup RelGroup; + + /// Constructeurs /// + CVar(void); + explicit CVar(const StdString & id); + CVar(const CVar & var); // Not implemented yet. + CVar(const CVar * const var); // Not implemented yet. + + /// Destructeur /// + virtual ~CVar(void); + + /// Accesseurs statiques /// + static inline StdString GetName(void); + static inline StdString GetDefName(void); + + }; // class CVar + + ///-------------------------------------------------------------- + + // Declare/Define CVarGroup and CVarDefinition + DECLARE_GROUP(CVar); + + /// ////////////////////// Définitions ////////////////////// /// + + CBaseVar::CBaseVar(void) + { /* Ne rien faire de plus */ } + + CBaseVar::~CBaseVar(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + CVar::CVar(void) + : CObjectTemplate() + , CVarAttributes() + , CBaseVar() + { /* Ne rien faire de plus */ } + + CVar::CVar(const StdString & id) + : CObjectTemplate(id) + , CVarAttributes() + , CBaseVar() + { /* Ne rien faire de plus */ } + + CVar::~CVar(void) + { /* Ne rien faire de plus */ } + + StdString CVar::GetName(void) { return (StdString("var")); } + StdString CVar::GetDefName(void){ return (CVar::GetName()); } + +} // namespace xios + +#endif // __XMLIO_CVar__ diff --git a/src/node/variable.cpp b/src/node/variable.cpp new file mode 100644 index 0000000..72f2245 --- /dev/null +++ b/src/node/variable.cpp @@ -0,0 +1,212 @@ +#include "variable.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" +#include "object_factory.hpp" +#include "xmlioserver_spl.hpp" +#include "type.hpp" +#include "context.hpp" +#include "context_client.hpp" +#include + +namespace xios { + + /// ////////////////////// Définitions ////////////////////// /// + + CVariable::CVariable(void) + : CObjectTemplate() + , CVariableAttributes() + , content() + { /* Ne rien faire de plus */ } + + CVariable::CVariable(const StdString & id) + : CObjectTemplate(id) + , CVariableAttributes() + , content() + { /* Ne rien faire de plus */ } + + CVariable::~CVariable(void) + { /* Ne rien faire de plus */ } + + StdString CVariable::GetName(void) { return (StdString("variable")); } + StdString CVariable::GetDefName(void){ return (CVariable::GetName()); } + ENodeType CVariable::GetType(void) { return (eVariable); } + + void CVariable::parse(xml::CXMLNode & node) + { + SuperClass::parse(node); + StdString id = (this->hasId()) ? this->getId() : StdString("undefined"); + if (!node.getContent(this->content)) + { + ERROR("CVariable::parse(xml::CXMLNode & node)", + << "[ variable id = " << id + << " ] variable is not defined !"); + } + content = boost::trim_copy(content) ; + } + + const StdString & CVariable::getContent (void) const + { + return (this->content); + } + + void CVariable::setContent(const StdString& contentStr) + { + this->content = contentStr; + } + + StdString CVariable::toString(void) const + { + StdOStringStream oss; + + oss << "<" << CVariable::GetName() << " "; + if (this->hasId()) + oss << " id=\"" << this->getId() << "\" "; + oss << SuperClassAttribute::toString() << ">" << std::endl + << this->content /*<< std::endl*/; + oss << ""; + return (oss.str()); + } + + CVariable::EVarType CVariable::getVarType(void) const + { + EVarType ret ; + + if (type.isEmpty()) ret=t_undefined ; + else + { + string varType=boost::to_lower_copy(boost::trim_copy(type.getValue())) ; + if (varType=="int") ret=t_int ; + else if (varType=="short int" || varType=="short") ret=t_short_int ; + else if (varType=="long int" || varType=="long") ret=t_long_int ; + else if (varType=="float") ret=t_float ; + else if (varType=="double") ret=t_double ; + else if (varType=="long double") ret=t_long_double ; + else if (varType=="bool") ret=t_bool ; + else if (varType=="long double") ret=t_long_double ; + else if (varType=="string") ret=t_string ; + } + return ret ; + } + + /* + *\brief Sending value of a variable with its id from client to server + * + */ + void CVariable::sendValue() + { + CContext* context=CContext::getCurrent() ; + if (!context->hasServer) + { + CContextClient* client=context->client ; + + CEventClient event(this->getType(),EVENT_ID_VARIABLE_VALUE) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + } + + /* + *\brief Receive value of a variable with its id from client to server + * + */ + void CVariable::recvValue(CEventServer& event) + { + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id; + *buffer>>id ; + get(id)->recvValue(*buffer); + } + + + /* + *\brief Receive value of a variable with its id from client to server + * + */ + void CVariable::recvValue(CBufferIn& buffer) + { + string str ; + buffer>>str; + setContent(str); + } + + bool CVariable::dispatchEvent(CEventServer& event) + { + if (SuperClass::dispatchEvent(event)) return true ; + else + { + switch(event.type) + { + case EVENT_ID_VARIABLE_VALUE : + recvValue(event) ; + return true ; + break ; + + default : + ERROR("bool CVariable::dispatchEvent(CEventServer& event)",<<"Unknown Event") ; + return false ; + } + } + } + +/* + void CVariable::toBinary(StdOStream & os) const + { + const StdString & content = this->content; + const StdSize size = content.size(); + SuperClass::toBinary(os); + + os.write (reinterpret_cast(&size), sizeof(StdSize)); + os.write (content.data(), size * sizeof(char)); + } + + void CVariable::fromBinary(StdIStream & is) + { + SuperClass::fromBinary(is); + StdSize size = 0; + is.read (reinterpret_cast(&size), sizeof(StdSize)); + this->content.assign(size, ' '); + is.read (const_cast(this->content.data()), size * sizeof(char)); + } +*/ + void CVariableGroup::parse(xml::CXMLNode & node, bool withAttr) + { + CVariableGroup* group_ptr = (this->hasId()) + ? CVariableGroup::get(this->getId()) : CVariableGroup::get(this); + + StdString content; + if (this->getId().compare(CVariableGroup::GetDefName()) != 0 && node.getContent(content)) + { + StdSize beginid = 0, endid = 0, begindata = 0, enddata = 0; + StdString subdata, subid; + + while ((beginid = content.find_first_not_of ( " \r\n\t;", enddata)) != StdString::npos) + { + endid = content.find_first_of ( " \r\n\t=", beginid ); + subid = content.substr ( beginid, endid-beginid); + subid = boost::to_lower_copy(boost::trim_copy(subid)) ; + + begindata = content.find_first_of ( "=", endid ) + 1; + enddata = content.find_first_of ( ";", begindata ); + subdata = content.substr ( begindata, enddata-begindata); + subdata = boost::trim_copy(subdata) ; + group_ptr->createChild(subid)->content = subdata ; + } + } + else + { + SuperClass::parse(node, withAttr); + } + //SuperClass::parse(node, withAttr); + + } + +} // namespace xios diff --git a/src/node/variable.hpp b/src/node/variable.hpp new file mode 100644 index 0000000..63cc709 --- /dev/null +++ b/src/node/variable.hpp @@ -0,0 +1,146 @@ +#ifndef __XMLIO_CVariable__ +#define __XMLIO_CVariable__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "declare_group.hpp" +#include "group_template.hpp" +#include "array_new.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + class CVariableGroup; + class CVariableAttributes; + class CVariable; + class CContext; + ///-------------------------------------------------------------- + + // Declare/Define CVarAttribute + BEGIN_DECLARE_ATTRIBUTE_MAP(CVariable) +#include "var_attribute.conf" + END_DECLARE_ATTRIBUTE_MAP(CVariable) + + ///-------------------------------------------------------------- + + class CVariable + : public CObjectTemplate + , public CVariableAttributes + { + enum EEventId + { + EVENT_ID_VARIABLE_VALUE + }; + + /// typedef /// + typedef CObjectTemplate SuperClass; + typedef CVariableAttributes SuperClassAttribute; + + friend class CVariableGroup; + + public : + + typedef CVariableAttributes RelAttributes; + typedef CVariableGroup RelGroup; + + /// Constructeurs /// + CVariable(void); + explicit CVariable(const StdString & id); + CVariable(const CVariable & var); // Not implemented yet. + CVariable(const CVariable * const var); // Not implemented yet. + + /// Destructeur /// + virtual ~CVariable(void); + + public : + enum EVarType + { t_int, t_short_int, t_long_int, t_float, t_double, t_long_double, t_bool, t_string, t_undefined } ; + + + /// Autres /// + virtual void parse(xml::CXMLNode & node); + virtual StdString toString(void) const; + + /// Accesseur /// + const StdString & getContent (void) const; + + void setContent(const StdString& content); + + + template inline T getData(void) const; + template inline void setData(T data); + + template + inline void getData(CArray& _data_array) const; + + EVarType getVarType(void) const ; + + static bool dispatchEvent(CEventServer& event) ; + + //! Sending a request to set up variable data + void sendValue(); + + static void recvValue(CEventServer& event) ; + void recvValue(CBufferIn& buffer) ; + + public : + + /// Accesseurs statiques /// + static StdString GetName(void); + static StdString GetDefName(void); + static ENodeType GetType(void); + + private : + + StdString content; + + }; // class CVar + + template<> + inline bool CVariable::getData(void) const + { + if (content.compare("true")==0 || content.compare(".true.")==0 || content.compare(".TRUE.")==0) return true ; + else if (content.compare("false")==0 || content.compare(".false.")==0 || content.compare(".FALSE.")==0) return false ; + else ERROR("CVariable::getdata()", + << "Cannot convert string <" << content << "> into type required" ); + return false ; + } + + template + inline T CVariable::getData(void) const + { + T retval ; + std::stringstream sstr(std::stringstream::in | std::stringstream::out); + sstr<>retval ; + if (sstr.fail()) ERROR("CVariable::getdata()", + << "Cannot convert string <" << content << "> into type required" ); + return retval ; + } + + template<> + inline void CVariable::setData(bool data) + { + if (true == data) content.assign("true"); + else content.assign("false"); + } + + template + inline void CVariable::setData(T data) + { + std::stringstream sstr; + sstr<id); + } + + bool CObject::hasId(void) const + { + return (this->IdDefined); + } + + void CObject::resetId(void) + { + this->IdDefined = false ; + } + + void CObject::setId(const StdString & id) + { + this->id = id ; + this->IdDefined = true ; + } +/* + bool CObject::operator==(const CObject & other) const + { + if(!this->hasId() || !other.hasId()) + return (false); + return (this->id.compare(other.id) == 0); + } + + bool CObject::operator!=(const CObject & other) const + { + return (!(*this == other)); + } +*/ + StdOStream & operator << (StdOStream & os, const CObject & object) + { + os << object.toString(); + return (os); + } + +} // namespace xios diff --git a/src/object.hpp b/src/object.hpp new file mode 100644 index 0000000..377b80e --- /dev/null +++ b/src/object.hpp @@ -0,0 +1,58 @@ +#ifndef __XMLIO_CObject__ +#define __XMLIO_CObject__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + class CObject + { + public : + + /// Destructeur /// + virtual ~CObject(void); + + /// Accesseurs /// + const StdString & getId(void) const; + + /// Mutateurs /// + void resetId(void); + void setId(const StdString & id); + + /// Tests /// + bool hasId(void) const; + + /// Opérateurs /// +// bool operator==(const CObject & other) const; +// bool operator!=(const CObject & other) const; + + /// Flux /// + friend StdOStream & operator << (StdOStream & os, const CObject & object); + + /// Autres /// + virtual StdString toString(void) const = 0; + virtual void fromString(const StdString & str) = 0; + + protected : + + /// Constructeurs /// + CObject(void); + explicit CObject(const StdString & id); + CObject(const CObject & object); + CObject(const CObject * const object); // Not implemented. + + private : + + /// Propriétés /// + StdString id ; // identifiant de l'Object + bool IdDefined ; // true si l'object est identifié, false sinon. + + }; // class CObject + +} // namespace xios + +#endif // __XMLIO_CObject__ + diff --git a/src/object_factory.cpp b/src/object_factory.cpp new file mode 100644 index 0000000..3427b37 --- /dev/null +++ b/src/object_factory.cpp @@ -0,0 +1,15 @@ +#include "object_factory.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + StdString CObjectFactory::CurrContext(""); + + void CObjectFactory::SetCurrentContextId(const StdString & context) + { CObjectFactory::CurrContext = context; } + + StdString & CObjectFactory::GetCurrentContextId(void) + { return (CObjectFactory::CurrContext); } + +} // namespace xios diff --git a/src/object_factory.hpp b/src/object_factory.hpp new file mode 100644 index 0000000..707c318 --- /dev/null +++ b/src/object_factory.hpp @@ -0,0 +1,66 @@ +#ifndef __XMLIO_CObjectFactory__ +#define __XMLIO_CObjectFactory__ + +/// boost headers /// +#include + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "object_template.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CObjectFactory + { + public : + + /// Mutateurs /// + static void SetCurrentContextId(const StdString & context); + + /// Accesseurs /// + static StdString & GetCurrentContextId(void); + + template + static boost::shared_ptr GetObject(const StdString & id); + + template + static boost::shared_ptr GetObject(const StdString& context,const StdString & id); + + template + static boost::shared_ptr GetObject(const U * const object); + + template + static int GetObjectNum(void); + template + static int GetObjectIdNum(void); + + template + static const std::vector > & + GetObjectVector(const StdString & context = CObjectFactory::GetCurrentContextId()); + + /// Tests /// + template + static bool HasObject(const StdString & id); + + template + static bool HasObject(const StdString& context,const StdString & id); + + /// Instanciateur /// + template + static boost::shared_ptr CreateObject(const StdString & id = StdString("")); + + template static StdString GenUId(void) ; + + private : + + /// Propriétés statiques /// + static StdString CurrContext; + + }; // class CObjectFactory +} // namespace xios + +//#include "object_factory_impl.hpp" + +#endif // __XMLIO_CObjectFactory__ diff --git a/src/object_factory_decl.cpp b/src/object_factory_decl.cpp new file mode 100644 index 0000000..571d568 --- /dev/null +++ b/src/object_factory_decl.cpp @@ -0,0 +1,33 @@ +#include "object_factory_impl.hpp" +#include "node_type.hpp" + +namespace xios +{ +#define macro(U) \ + template shared_ptr CObjectFactory::GetObject(const StdString & id); \ + template shared_ptr CObjectFactory::GetObject(const StdString& context,const StdString & id); \ + template shared_ptr CObjectFactory::GetObject(const U * const object); \ + template int CObjectFactory::GetObjectNum(void); \ + template int CObjectFactory::GetObjectIdNum(void); \ + template const std::vector >& CObjectFactory::GetObjectVector(const StdString & context ); \ + template bool CObjectFactory::HasObject(const StdString & id); \ + template bool CObjectFactory::HasObject(const StdString& context,const StdString & id); \ + template boost::shared_ptr CObjectFactory::CreateObject(const StdString & id ); \ + template StdString CObjectFactory::GenUId(void) ; + + macro(CField) + macro(CFile) + macro(CGrid) + macro(CAxis) + macro(CDomain) + macro(CContext) + macro(CVariable) + + macro(CFieldGroup) + macro(CFileGroup) + macro(CGridGroup) + macro(CAxisGroup) + macro(CDomainGroup) + macro(CContextGroup) + macro(CVariableGroup) +} diff --git a/src/object_factory_impl.hpp b/src/object_factory_impl.hpp new file mode 100644 index 0000000..c3bfc10 --- /dev/null +++ b/src/object_factory_impl.hpp @@ -0,0 +1,154 @@ +#ifndef __XMLIO_CObjectFactory_impl__ +#define __XMLIO_CObjectFactory_impl__ + +#include "object_factory.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + template + int CObjectFactory::GetObjectNum(void) + { + if (CurrContext.size() == 0) + ERROR("CObjectFactory::GetObjectNum(void)", + << "please define current context id !"); + return (U::AllVectObj[CObjectFactory::CurrContext].size()); + } + + template + int CObjectFactory::GetObjectIdNum(void) + { + if (CurrContext.size() == 0) + ERROR("CObjectFactory::GetObjectIdNum(void)", + << "please define current context id !"); + return (U::AllMapObj[CObjectFactory::CurrContext].size()); + } + + template + bool CObjectFactory::HasObject(const StdString & id) + { + if (CurrContext.size() == 0) + ERROR("CObjectFactory::HasObject(const StdString & id)", + << "[ id = " << id << " ] please define current context id !"); + return (U::AllMapObj[CObjectFactory::CurrContext].find(id) != + U::AllMapObj[CObjectFactory::CurrContext].end()); + } + + template + bool CObjectFactory::HasObject(const StdString & context, const StdString & id) + { + if (U::AllMapObj.find(context) == U::AllMapObj.end()) return false ; + else return (U::AllMapObj[context].find(id) != U::AllMapObj[context].end()); + } + + template + boost::shared_ptr CObjectFactory::GetObject(const U * const object) + { + if (CurrContext.size() == 0) + ERROR("CObjectFactory::GetObject(const U * const object)", + << "please define current context id !"); + std::vector > & vect = + U::AllVectObj[CObjectFactory::CurrContext]; + + typename std::vector >::const_iterator + it = vect.begin(), end = vect.end(); + + for (; it != end; it++) + { + boost::shared_ptr ptr = *it; + if (ptr.get() == object) + return (ptr); + } + + ERROR("CObjectFactory::GetObject(const U * const object)", + << "[type = " << U::GetName() << ", " + << "adress = " << object << "]" + << " object was not found !"); + return (boost::shared_ptr()); // jamais atteint + } + + template + boost::shared_ptr CObjectFactory::GetObject(const StdString & id) + { + if (CurrContext.size() == 0) + ERROR("CObjectFactory::GetObject(const StdString & id)", + << "[ id = " << id << " ] please define current context id !"); + if (!CObjectFactory::HasObject(id)) + ERROR("CObjectFactory::GetObject(const StdString & id)", + << "[ id = " << id << ", U = " << U::GetName() << " ] " + << " object is not referenced !"); + return (U::AllMapObj[CObjectFactory::CurrContext][id]); + } + + template + boost::shared_ptr CObjectFactory::GetObject(const StdString & context, const StdString & id) + { + if (!CObjectFactory::HasObject(context,id)) + ERROR("CObjectFactory::GetObject(const StdString & id)", + << "[ id = " << id << ", U = " << U::GetName() <<", context = "< + boost::shared_ptr CObjectFactory::CreateObject(const StdString & id) + { + if (CurrContext.size() == 0) + ERROR("CObjectFactory::CreateObject(const StdString & id)", + << "[ id = " << id << " ] please define current context id !"); + if (id.size() == 0) + { + boost::shared_ptr value(new U(CObjectFactory::GenUId())); + U::AllVectObj[CObjectFactory::CurrContext].insert + (U::AllVectObj[CObjectFactory::CurrContext].end(), value); + U::AllMapObj[CObjectFactory::CurrContext].insert(std::make_pair(value->getId(), value)); + return (value); + } + else if (CObjectFactory::HasObject(id)) + { + return (CObjectFactory::GetObject(id)); + } + else + { + boost::shared_ptr value(new U(id)); + U::AllVectObj[CObjectFactory::CurrContext].insert + (U::AllVectObj[CObjectFactory::CurrContext].end(), value); + U::AllMapObj[CObjectFactory::CurrContext].insert(std::make_pair(id, value)); + return (value); + } + } + + template + const std::vector > & + CObjectFactory::GetObjectVector(const StdString & context) + { + return (U::AllVectObj[context]); + } + + template + StdString CObjectFactory::GenUId(void) + { + long int seed ; + + xios_map::iterator it ; + it=U::GenId.find(CObjectFactory::CurrContext); + if (it==U::GenId.end()) + { + seed=0 ; + U::GenId[CObjectFactory::CurrContext]=seed ; + } + else + { + seed=it->second ; + seed++ ; + it->second=seed ; + } + + StdOStringStream oss ; + oss<<"__"< + class CObjectTemplate + : public CObject + , public virtual CAttributeMap + { + + /// Friend /// + friend class CObjectFactory; + + /// Typedef /// + typedef CAttributeMap SuperClassMap; + typedef CObject SuperClass; + typedef T DerivedType; + + enum EEventId + { + EVENT_ID_SEND_ATTRIBUTE=100 + } ; + + public : + + /// Autres /// + virtual StdString toString(void) const; + virtual void fromString(const StdString & str); + +// virtual void toBinary (StdOStream & os) const; +// virtual void fromBinary(StdIStream & is); + virtual string getName(void) const ; + virtual void parse(xml::CXMLNode & node); + + /// Accesseurs /// + ENodeType getType(void) const; + + /// Test /// + virtual bool hasChild(void) const; + + /// Traitements /// + virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0); + + /// Traitement statique /// + static void ClearAllAttributes(void); + void sendAttributToServer(const string& id); + void sendAttributToServer(CAttribute& attr) ; + static void recvAttributFromClient(CEventServer& event) ; + static bool dispatchEvent(CEventServer& event) ; + + /// Accesseur statique /// + static std::vector > & + GetAllVectobject(const StdString & contextId); + + /// Destructeur /// + virtual ~CObjectTemplate(void); + + static bool has(const string& id) ; + static bool has(const string& contextId, const string& id) ; + static T* get(const string& id) ; + static T* get(const T* ptr) ; + static T* get(const string& contextId, const string& id) ; + T* get(void) ; + shared_ptr getShared(void) ; + static shared_ptr getShared(const T* ptr) ; + + static T* create(const string& id=string("")) ; + static const vector getAll() ; + static const vector getAll(const string& contextId) ; + + void generateCInterface(ostream& oss) ; + void generateFortran2003Interface(ostream& oss) ; + void generateFortranInterface(ostream& oss) ; + + protected : + + /// Constructeurs /// + CObjectTemplate(void); + explicit CObjectTemplate(const StdString & id); + CObjectTemplate(const CObjectTemplate & object, + bool withAttrList = true, bool withId = true); + CObjectTemplate(const CObjectTemplate * const object); // Not implemented. + + private : + + /// Propriétés statiques /// + static xios_map > > AllMapObj; + static xios_map > > AllVectObj; + + static xios_map< StdString, long int > GenId ; + + }; // class CObjectTemplate +} // namespace xios + +//#include "object_template_impl.hpp" + +#endif // __XMLIO_CObjectTemplate__ diff --git a/src/object_template_decl.cpp b/src/object_template_decl.cpp new file mode 100644 index 0000000..f349621 --- /dev/null +++ b/src/object_template_decl.cpp @@ -0,0 +1,29 @@ +#include "object_template_impl.hpp" +#include "xmlioserver_spl.hpp" +#include "field.hpp" +#include "context.hpp" +#include "file.hpp" +#include "domain.hpp" +#include "grid.hpp" +#include "axis.hpp" +#include "variable.hpp" + + +namespace xios +{ + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + template class CObjectTemplate ; + } diff --git a/src/object_template_impl.hpp b/src/object_template_impl.hpp new file mode 100644 index 0000000..e22d598 --- /dev/null +++ b/src/object_template_impl.hpp @@ -0,0 +1,408 @@ +#ifndef __XMLIO_CObjectTemplate_impl__ +#define __XMLIO_CObjectTemplate_impl__ + +#include "xmlioserver_spl.hpp" +#include "context_client.hpp" +#include "object_factory.hpp" +#include "context.hpp" +#include "buffer_in.hpp" +#include "attribute.hpp" +#include "event_client.hpp" +#include "object_template.hpp" +#include "context_client.hpp" +#include "indent.hpp" +#include "type_util.hpp" +#include "message.hpp" +#include "type.hpp" +#include "type_util.hpp" +#include "group_template.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + template + xios_map > > CObjectTemplate::AllMapObj; + + template + xios_map > > CObjectTemplate::AllVectObj; + + template + xios_map CObjectTemplate::GenId; + + template + CObjectTemplate::CObjectTemplate(void) + : CAttributeMap() + , CObject() + { /* Ne rien faire de plus */ } + + template + CObjectTemplate::CObjectTemplate(const StdString & id) + : CAttributeMap() + , CObject(id) + { /* Ne rien faire de plus */ } + + template + CObjectTemplate::CObjectTemplate + (const CObjectTemplate & object, bool withAttrList, bool withId) + : CAttributeMap() + , CObject() + { + if (object.hasId() && withId) + this->setId(object.getId()); + ERROR("CObjectTemplate construtor 3", << "Not completly implemented yet !"); + } + + template + CObjectTemplate::~CObjectTemplate(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + template + std::vector > & + CObjectTemplate::GetAllVectobject(const StdString & contextId) + { + return (CObjectTemplate::AllVectObj[contextId]); + } + + //--------------------------------------------------------------- + + template + StdString CObjectTemplate::toString(void) const + { + StdOStringStream oss; + oss << "<" << T::GetName(); + if (this->hasId()) + oss << " id=\"" << this->getId() << "\""; + oss << " " << SuperClassMap::toString() << "/>"; + return (oss.str()); + } + + template + void CObjectTemplate::fromString(const StdString & str) + { + ERROR("CObjectTemplate::fromString(str)", + << "[ str = " << str << "] Not implemented yet !"); + } + + //--------------------------------------------------------------- + +/* + template + void CObjectTemplate::toBinary(StdOStream & os) const + { + SuperClassMap::toBinary(os); + } + + template + void CObjectTemplate::fromBinary(StdIStream & is) + { + SuperClassMap::fromBinary(is); + } +*/ + + //--------------------------------------------------------------- + + template + void CObjectTemplate::parse(xml::CXMLNode & node) + { + xml::THashAttributes attributes = node.getAttributes(); + CAttributeMap::setAttributes(attributes); + } + + //--------------------------------------------------------------- + + template + ENodeType CObjectTemplate::getType(void) const + { + return (T::GetType()); + } + + template + string CObjectTemplate::getName(void) const + { + return (T::GetName()); + } + + //--------------------------------------------------------------- + + template + bool CObjectTemplate::hasChild(void) const + { + return (false); + } + + //--------------------------------------------------------------- + + template + void CObjectTemplate::solveDescInheritance(bool apply, const CAttributeMap * const parent) + { + SuperClassMap::setAttributes(parent, apply); + } + + //--------------------------------------------------------------- + + template + void CObjectTemplate::ClearAllAttributes(void) + { + vector avect = CObjectTemplate::getAll() ; + typename vector::iterator + it = avect.begin(), end = avect.end(); + + for (;it != end; it++) + { + CAttributeMap & amap = **it; + amap.clearAllAttributes(); + } + } + + template + void CObjectTemplate::sendAttributToServer(const string& id) + { + CAttributeMap & attrMap = *this; + CAttribute* attr=attrMap[id] ; + sendAttributToServer(*attr) ; + } + + template + void CObjectTemplate::sendAttributToServer(CAttribute& attr) + { + CContext* context=CContext::getCurrent() ; + + if (!context->hasServer) + { + CContextClient* client=context->client ; + + CEventClient event(getType(),EVENT_ID_SEND_ATTRIBUTE) ; + if (client->isServerLeader()) + { + CMessage msg ; + msg<getId() ; + msg<getServerLeader(),1,msg) ; + client->sendEvent(event) ; + } + else client->sendEvent(event) ; + } + + } + + template + void CObjectTemplate::recvAttributFromClient(CEventServer& event) + { + + CBufferIn* buffer=event.subEvents.begin()->buffer; + string id,attrId; + *buffer>>id ; + CAttributeMap & attrMap = *get(id); + *buffer>>attrId ; + CAttribute* attr=attrMap[attrId] ; + info(50)<<"attribut recu "<isEmpty()) info(50)<<"--> empty"<getValue()*/<>*attr ; + info(50)<<"attribut recu "<isEmpty()) info(50)<<"--> empty"<getValue()*/< + bool CObjectTemplate::dispatchEvent(CEventServer& event) + { + switch(event.type) + { + case EVENT_ID_SEND_ATTRIBUTE : + recvAttributFromClient(event) ; + return true ; + break ; + + default : + return false ; +// ERROR("void CObjectTemplate::recvEvent(CEventServer& event)", +// <<"Unknown Event") ; + } + } + + template + bool CObjectTemplate::has(const string & id) + { + return CObjectFactory::HasObject(id) ; + } + + template + bool CObjectTemplate::has(const string& contextId, const string & id) + { + return CObjectFactory::HasObject(contextId,id) ; + } + + template + T* CObjectTemplate::get(const string & id) + { + return CObjectFactory::GetObject(id).get() ; + } + + template + T* CObjectTemplate::get(const T* ptr) + { + return CObjectFactory::GetObject(ptr).get() ; + } + + template + shared_ptr CObjectTemplate::getShared(const T* ptr) + { + return CObjectFactory::GetObject(ptr) ; + } + + template + shared_ptr CObjectTemplate::getShared(void) + { + return CObjectFactory::GetObject((T*)this) ; + } + + template + const vector CObjectTemplate::getAll() + { + const vector< shared_ptr >& shared_vect= CObjectFactory::GetObjectVector(); + vector vect ; + + typename vector >::const_iterator it; + for(it=shared_vect.begin();it!=shared_vect.end();++it) vect.push_back(it->get()) ; + return vect ; + } + + template + const vector CObjectTemplate::getAll(const string & id) + { + const vector< shared_ptr >& shared_vect= CObjectFactory::GetObjectVector(id); + vector vect ; + + typename vector >::const_iterator it; + for(it=shared_vect.begin();it!=shared_vect.end();++it) vect.push_back(it->get()) ; + return vect ; + } + + template + T* CObjectTemplate::get(const string& contextId, const string & id) + { + return CObjectFactory::GetObject(contextId,id).get() ; + } + + template + T* CObjectTemplate::create(const string & id) + { + return CObjectFactory::CreateObject(id).get() ; + } ///-------------------------------------------------------------- + + template + T* CObjectTemplate::get(void) + { + return CObjectFactory::GetObject((T*)this).get() ; + } + + template + void CObjectTemplate::generateCInterface(ostream& oss) + { + string className=getName() ; + int found=className.find_first_of("_") ; + if (found!=string::npos) className.replace(found,1,0,'x') ; + + oss<<"/* ************************************************************************** *"<"<"<()<<"* "< + void CObjectTemplate::generateFortran2003Interface(ostream& oss) + { + string className=getName() ; + int found=className.find_first_of("_") ; + if (found!=string::npos) className.replace(found,1,0,'x') ; + + oss<<"! * ************************************************************************** *"< C99"< + void CObjectTemplate::generateFortranInterface(ostream& oss) + { + string className=getName() ; + int found=className.find_first_of('_') ; + if (found!=string::npos) className.erase(found,1) ; + string superClassName=getName(); + found=superClassName.find("_group") ; + if (found!=string::npos) superClassName.erase(found,6) ; + + oss<<"! * ************************************************************************** *"< +#include "attribute_template.hpp" +#include "group_template.hpp" + +#include "file.hpp" +#include "calendar.hpp" +#include "context.hpp" +#include "context_server.hpp" +#include "netCdfException.hpp" +#include "exception.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + CNc4DataOutput::CNc4DataOutput + (const StdString & filename, bool exist) + : SuperClass() + , SuperClassWriter(filename, exist) + , filename(filename) + { + StdString timeid = StdString("time_counter"); + SuperClass::type = MULTI_FILE; +// if (!exist) +// SuperClassWriter::addDimension(timeid); + } + + CNc4DataOutput::CNc4DataOutput + (const StdString & filename, bool exist, MPI_Comm comm_file,bool multifile, bool isCollective) + : SuperClass() + , SuperClassWriter(filename, exist, &comm_file,multifile) + , comm_file(comm_file) + , filename(filename) + , isCollective(isCollective) + { + StdString timeid = StdString("time_counter"); + + SuperClass::type = (multifile) ? MULTI_FILE : ONE_FILE; + + // if (!exist) +// SuperClassWriter::addDimension(timeid); + } + + + CNc4DataOutput::~CNc4DataOutput(void) + { /* Ne rien faire de plus */ } + + ///-------------------------------------------------------------- + + const StdString & CNc4DataOutput::getFileName(void) const + { + return (this->filename); + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeDomain_(CDomain* domain) + { + if (domain->type == CDomain::type_attr::unstructured) + { + writeUnstructuredDomain(domain) ; + return ; + } + + CContext* context = CContext::getCurrent() ; + CContextServer* server=context->server ; + + if (domain->IsWritten(this->filename)) return; + domain->checkAttributes(); + + if (domain->isEmpty()) + if (SuperClass::type==MULTI_FILE) return ; + + std::vector dim0, dim1; + StdString domid = (!domain->name.isEmpty()) + ? domain->name.getValue() : domain->getId(); + StdString appendDomid = (singleDomain) ? "" : "_"+domid ; + + + StdString dimXid, dimYid ; + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + dimXid = StdString("x").append(appendDomid); + dimYid = StdString("y").append(appendDomid); + break ; + case CDomain::type_attr::regular : + dimXid = StdString("lon").append(appendDomid); + dimYid = StdString("lat").append(appendDomid); + break; + case CDomain::type_attr::unstructured : + dimXid = StdString("cell").append(appendDomid); + break; + } + + string lonid,latid,bounds_lonid,bounds_latid ; +/* + StdString lonid_loc = (server->intraCommSize > 1) + ? StdString("lon").append(appendDomid).append("_local") + : lonid; + StdString latid_loc = (server->intraCommSize > 1) + ? StdString("lat").append(appendDomid).append("_local") + : latid; +*/ + + try + { + switch (SuperClass::type) + { + case (MULTI_FILE) : + { + // if (domain->isEmpty()) return; + + if (server->intraCommSize > 1) + { + // SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue()); + // SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue()); + } + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + dim0.push_back(dimYid); dim0.push_back(dimXid); + lonid = StdString("nav_lon").append(appendDomid); + latid = StdString("nav_lat").append(appendDomid); + break ; + case CDomain::type_attr::regular : + lonid = StdString("lon").append(appendDomid); + latid = StdString("lat").append(appendDomid); + dim0.push_back(dimYid); + dim1.push_back(dimXid); + break; + case CDomain::type_attr::unstructured : + lonid = StdString("lon").append(appendDomid); + latid = StdString("lat").append(appendDomid); + bounds_lonid=string("bounds_lon").append(appendDomid); + bounds_latid=string("bounds_lat").append(appendDomid); + dim0.push_back(dimXid); + break; + } + + if (domain->type == CDomain::type_attr::unstructured) + { + SuperClassWriter::addDimension(dimXid, domain->nj_glo); + } + else + { + SuperClassWriter::addDimension(dimXid, domain->zoom_ni_srv); + SuperClassWriter::addDimension(dimYid, domain->zoom_nj_srv); + } + + if (server->intraCommSize > 1) + { + if (domain->type != CDomain::type_attr::unstructured) + { + this->writeLocalAttributes(domain->zoom_ibegin_srv, + domain->zoom_ni_srv, + domain->zoom_jbegin_srv, + domain->zoom_nj_srv, + appendDomid); + + if (singleDomain) this->writeLocalAttributes_IOIPSL(domain->zoom_ibegin_srv, + domain->zoom_ni_srv, + domain->zoom_jbegin_srv, + domain->zoom_nj_srv, + domain->ni_glo,domain->nj_glo, + server->intraCommRank,server->intraCommSize); + } + } + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); + break ; + case CDomain::type_attr::regular : + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1); + break ; + case CDomain::type_attr::unstructured : + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); + } + + this->writeAxisAttributes(lonid, "X", "longitude", "Longitude", "degrees_east", domid); + this->writeAxisAttributes(latid, "Y", "latitude", "Latitude", "degrees_north", domid); + + dim0.clear(); + if (domain->type != CDomain::type_attr::unstructured) dim0.push_back(dimYid); + dim0.push_back(dimXid); + + + // supress mask if (server->intraCommSize > 1) + // supress mask { + // supress mask SuperClassWriter::addVariable(maskid, NC_INT, dim0); + // supress mask + // supress mask this->writeMaskAttributes(maskid, + // supress mask domain->data_dim.getValue()/*, + // supress mask domain->data_ni.getValue(), + // supress mask domain->data_nj.getValue(), + // supress mask domain->data_ibegin.getValue(), + // supress mask domain->data_jbegin.getValue()*/); + // supress mask } + + //SuperClassWriter::setDefaultValue(maskid, &dvm); + + SuperClassWriter::definition_end(); + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0); + SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0); + break; + case CDomain::type_attr::regular : + CArray lat = domain->latvalue_srv(Range(fromStart,toEnd,domain->zoom_ni_srv)) ; + SuperClassWriter::writeData(CArray(lat.copy()), latid, isCollective, 0); + CArray lon=domain->lonvalue_srv(Range(0,domain->zoom_ni_srv-1)) ; + SuperClassWriter::writeData(CArray(lon.copy()), lonid, isCollective, 0); + break; + } + SuperClassWriter::definition_start(); + + break; + } + case (ONE_FILE) : + { + SuperClassWriter::addDimension(dimXid, domain->zoom_ni.getValue()); + SuperClassWriter::addDimension(dimYid, domain->zoom_nj.getValue()); + + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + dim0.push_back(dimYid); dim0.push_back(dimXid); + lonid = StdString("nav_lon").append(appendDomid); + latid = StdString("nav_lat").append(appendDomid); + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); + break; + + case CDomain::type_attr::regular : + dim0.push_back(dimYid); + dim1.push_back(dimXid); + lonid = StdString("lon").append(appendDomid); + latid = StdString("lat").append(appendDomid); + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1); + break; + } + this->writeAxisAttributes + (lonid, "X", "longitude", "Longitude", "degrees_east", domid); + this->writeAxisAttributes + (latid, "Y", "latitude", "Latitude", "degrees_north", domid); + + + SuperClassWriter::definition_end(); + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + { + std::vector start(2) ; + std::vector count(2) ; + if (domain->isEmpty()) + { + start[0]=0 ; start [1]=0 ; + count[0]=0 ; count[1]=0 ; + } + else + { + start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; + count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ; + } + + SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); + SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); + break; + } + case CDomain::type_attr::regular : + { + std::vector start(1) ; + std::vector count(1) ; + if (domain->isEmpty()) + { + start[0]=0 ; + count[0]=0 ; + SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); + SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); } + else + { + start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; + count[0]=domain->zoom_nj_srv ; + CArray lat = domain->latvalue_srv(Range(fromStart,toEnd,domain->zoom_ni_srv)) ; + SuperClassWriter::writeData(CArray(lat.copy()), latid, isCollective, 0,&start,&count); + + start[0]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; + count[0]=domain->zoom_ni_srv ; + CArray lon=domain->lonvalue_srv(Range(0,domain->zoom_ni_srv-1)) ; + SuperClassWriter::writeData(CArray(lon.copy()), lonid, isCollective, 0,&start,&count); + } + break; + } + } + SuperClassWriter::definition_start(); + break; + } + default : + ERROR("CNc4DataOutput::writeDomain(domain)", + << "[ type = " << SuperClass::type << "]" + << " not implemented yet !"); + } + } + catch (CNetCdfException& e) + { + StdString msg("On writing the domain : "); + msg.append(domid); msg.append("\n"); + msg.append("In the context : "); + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeDomain_(CDomain* domain)", << msg); + } + + domain->addRelFile(this->filename); + } + + void CNc4DataOutput::writeUnstructuredDomain(CDomain* domain) + { + CContext* context = CContext::getCurrent() ; + CContextServer* server=context->server ; + + if (domain->IsWritten(this->filename)) return; + domain->checkAttributes(); + + if (domain->isEmpty()) + if (SuperClass::type==MULTI_FILE) return ; + + std::vector dim0, dim1; + StdString domid = (!domain->name.isEmpty()) + ? domain->name.getValue() : domain->getId(); + StdString appendDomid = (singleDomain) ? "" : "_"+domid ; + + + StdString dimXid = StdString("cell").append(appendDomid); + StdString dimVertId = StdString("nvertex").append(appendDomid); + + string lonid,latid,bounds_lonid,bounds_latid ; + + try + { + switch (SuperClass::type) + { + case (MULTI_FILE) : + { + lonid = StdString("lon").append(appendDomid); + latid = StdString("lat").append(appendDomid); + dim0.push_back(dimXid); + + SuperClassWriter::addDimension(dimXid, domain->zoom_nj_srv); + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); + + bounds_lonid = StdString("bounds_lon").append(appendDomid); + bounds_latid = StdString("bounds_lat").append(appendDomid); + + + this->writeAxisAttributes(lonid, "X", "longitude", "Longitude", "degrees_east", domid); + if (domain->hasBounds) SuperClassWriter::addAttribute("bounds",bounds_lonid, &lonid); + this->writeAxisAttributes(latid, "Y", "latitude", "Latitude", "degrees_north", domid); + if (domain->hasBounds) SuperClassWriter::addAttribute("bounds",bounds_latid, &latid); + if (domain->hasBounds) SuperClassWriter::addDimension(dimVertId, domain->nvertex); + dim0.clear(); + if (domain->hasBounds) + { + dim0.push_back(dimXid); + dim0.push_back(dimVertId); + SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0); + } + + dim0.clear(); + dim0.push_back(dimXid); + + SuperClassWriter::definition_end(); + + SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0); + SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0); + + if (domain->hasBounds) + { + SuperClassWriter::writeData(domain->bounds_lon_srv, bounds_lonid, isCollective, 0); + SuperClassWriter::writeData(domain->bounds_lat_srv, bounds_latid, isCollective, 0); + } + SuperClassWriter::definition_start(); + break ; + } + + case (ONE_FILE) : + { + lonid = StdString("lon").append(appendDomid); + latid = StdString("lat").append(appendDomid); + bounds_lonid = StdString("bounds_lon").append(appendDomid); + bounds_latid = StdString("bounds_lat").append(appendDomid); + dim0.push_back(dimXid); + SuperClassWriter::addDimension(dimXid, domain->nj_glo); + SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); + this->writeAxisAttributes(lonid, "X", "longitude", "Longitude", "degrees_east", domid); + if (domain->hasBounds) SuperClassWriter::addAttribute("bounds",bounds_lonid, &lonid); + this->writeAxisAttributes(latid, "Y", "latitude", "Latitude", "degrees_north", domid); + if (domain->hasBounds) SuperClassWriter::addAttribute("bounds",bounds_latid, &latid); + if (domain->hasBounds) SuperClassWriter::addDimension(dimVertId, domain->nvertex); + dim0.clear(); + + if (domain->hasBounds) + { + dim0.push_back(dimXid); + dim0.push_back(dimVertId); + SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0); + SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0); + } + + SuperClassWriter::definition_end(); + + std::vector start(1), startBounds(2) ; + std::vector count(1), countBounds(2) ; + if (domain->isEmpty()) + { + start[0]=0 ; + count[0]=0 ; + startBounds[1]=0 ; + countBounds[1]=domain->nvertex ; + startBounds[0]=0 ; + countBounds[0]=0 ; + } + else + { + start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin ; + count[0]=domain->zoom_nj_srv ; + startBounds[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin ; + startBounds[1]=0 ; + countBounds[0]=domain->zoom_nj_srv ; + countBounds[1]=domain->nvertex ; + } + SuperClassWriter::writeData(domain->latvalue_srv, latid, isCollective, 0,&start,&count); + SuperClassWriter::writeData(domain->lonvalue_srv, lonid, isCollective, 0,&start,&count); + if (domain->hasBounds) + { + SuperClassWriter::writeData(domain->bounds_lon_srv, bounds_lonid, isCollective, 0,&startBounds,&countBounds); + SuperClassWriter::writeData(domain->bounds_lat_srv, bounds_latid, isCollective, 0,&startBounds,&countBounds); + } + + + SuperClassWriter::definition_start(); + + break; + } + default : + ERROR("CNc4DataOutput::writeDomain(domain)", + << "[ type = " << SuperClass::type << "]" + << " not implemented yet !"); + } + } + catch (CNetCdfException& e) + { + StdString msg("On writing the domain : "); + msg.append(domid); msg.append("\n"); + msg.append("In the context : "); + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeUnstructuredDomain(CDomain* domain)", << msg); + } + domain->addRelFile(this->filename); + } + //-------------------------------------------------------------- + + void CNc4DataOutput::writeAxis_(CAxis* axis) + { + if (axis->IsWritten(this->filename)) return; + axis->checkAttributes(); + StdSize zoom_size=axis->zoom_size.getValue() ; + StdSize zoom_begin=axis->zoom_begin.getValue()-1 ; + + + std::vector dims; + StdString axisid = (!axis->name.isEmpty()) + ? axis->name.getValue() : axis->getId(); + try + { + SuperClassWriter::addDimension(axisid, zoom_size); + dims.push_back(axisid); + + switch (SuperClass::type) + { + case (MULTI_FILE ) : + {} + case (ONE_FILE) : + { + SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); + + SuperClassWriter::addAttribute("axis", StdString("Z"), &axisid); + + if (!axis->standard_name.isEmpty()) + SuperClassWriter::addAttribute + ("standard_name", axis->standard_name.getValue(), &axisid); + + if (!axis->long_name.isEmpty()) + SuperClassWriter::addAttribute + ("long_name", axis->long_name.getValue(), &axisid); + + if (!axis->unit.isEmpty()) + SuperClassWriter::addAttribute + ("units", axis->unit.getValue(), &axisid); + + if (!axis->positive.isEmpty()) + if (axis->positive==CAxis::positive_attr::up) SuperClassWriter::addAttribute("positive", string("up"), &axisid); + else SuperClassWriter::addAttribute("positive", string("down"), &axisid); + + SuperClassWriter::definition_end(); + + CArray axis_value(zoom_size) ; + for(StdSize i = 0 ; i < zoom_size ; i++) axis_value(i)=axis->value(i+zoom_begin) ; + SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); + + SuperClassWriter::definition_start(); + + break; + } + default : + ERROR("CNc4DataOutput::writeDomain(domain)", + << "[ type = " << SuperClass::type << "]" + << " not implemented yet !"); + } + } + catch (CNetCdfException& e) + { + StdString msg("On writing the axis : "); + msg.append(axisid); msg.append("\n"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeAxis_(CAxis* axis)", << msg); + } + axis->addRelFile(this->filename); + } + + void CNc4DataOutput::writeTimeDimension_(void) + { + try + { + SuperClassWriter::addDimension("time_counter"); + SuperClassWriter::addDimension("time_bounds", 2); + } + catch (CNetCdfException& e) + { + StdString msg("On writing time dimension : time_couter, time_bounds \n"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeTimeDimension_(void)", << msg); + } + } + //-------------------------------------------------------------- + + void CNc4DataOutput::writeField_(CField* field) + { + CContext* context = CContext::getCurrent() ; + CContextServer* server=context->server ; + + std::vector dims, coodinates; + CGrid* grid = field->grid; + CDomain* domain = grid->domain; + + if (domain->isEmpty()) + if (SuperClass::type==MULTI_FILE) return ; + + StdString timeid = StdString("time_counter"); + StdString domid = (!domain->name.isEmpty()) + ? domain->name.getValue() : domain->getId(); + StdString appendDomid = (singleDomain) ? "" : "_"+domid ; + +// bool isCurvilinear = domain->isCurvilinear ; +// bool isCurvilinear = (domain->type == CDomain::type_attr::curvilinear) ; + + StdString dimXid,dimYid ; + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + dimXid = StdString("x").append(appendDomid); + dimYid = StdString("y").append(appendDomid); + break ; + case CDomain::type_attr::regular : + dimXid = StdString("lon").append(appendDomid); + dimYid = StdString("lat").append(appendDomid); + break ; + case CDomain::type_attr::unstructured : + dimXid = StdString("cell").append(appendDomid); + break ; + } + +/* + StdString lonid_loc = (server->intraCommSize > 1) + ? StdString("lon").append(appendDomid).append("_local") + : lonid; + StdString latid_loc = (server->intraCommSize > 1) + ? StdString("lat").append(appendDomid).append("_local") + : latid; +*/ + StdString fieldid = (!field->name.isEmpty()) + ? field->name.getValue() : field->getBaseFieldReference()->getId(); + +// unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue(); +// bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize); +// bool isCurvilinear = domain->isCurvilinear ; + + nc_type type ; + if (field->prec.isEmpty()) type = NC_FLOAT ; + else + { + if (field->prec==2) type = NC_SHORT ; + else if (field->prec==4) type = NC_FLOAT ; + else if (field->prec==8) type = NC_DOUBLE ; + } + + bool wtime = !(!field->operation.isEmpty() && field->foperation->timeType() == func::CFunctor::once); + + if (wtime) + { + + //StdOStringStream oss; + // oss << "time_" << field->operation.getValue() + // << "_" << field->getRelFile()->output_freq.getValue(); + //oss + if (field->foperation->timeType() == func::CFunctor::instant) coodinates.push_back(string("time_instant")); + else if (field->foperation->timeType() == func::CFunctor::centered) coodinates.push_back(string("time_centered")); + dims.push_back(timeid); + } + + if (!grid->axis_ref.isEmpty()) + { + CAxis* axis = grid->axis ; + StdString axisid = (!axis->name.isEmpty()) ? axis->name.getValue() : axis->getId(); + dims.push_back(axisid); + coodinates.push_back(axisid); + } + + switch (domain->type) + { + case CDomain::type_attr::curvilinear : + coodinates.push_back(StdString("nav_lon").append(appendDomid)); + coodinates.push_back(StdString("nav_lat").append(appendDomid)); + break; + case CDomain::type_attr::regular : + case CDomain::type_attr::unstructured : + coodinates.push_back(StdString("lon").append(appendDomid)); + coodinates.push_back(StdString("lat").append(appendDomid)); + break; + } + + if ( domain->type == CDomain::type_attr::curvilinear || domain->type == CDomain::type_attr::regular)dims.push_back(dimYid); + dims.push_back(dimXid); + + try + { + SuperClassWriter::addVariable(fieldid, type, dims); + + if (!field->standard_name.isEmpty()) + SuperClassWriter::addAttribute + ("standard_name", field->standard_name.getValue(), &fieldid); + + if (!field->long_name.isEmpty()) + SuperClassWriter::addAttribute + ("long_name", field->long_name.getValue(), &fieldid); + + if (!field->unit.isEmpty()) + SuperClassWriter::addAttribute + ("units", field->unit.getValue(), &fieldid); + + if (!field->valid_min.isEmpty()) + SuperClassWriter::addAttribute + ("valid_min", field->valid_min.getValue(), &fieldid); + + if (!field->valid_max.isEmpty()) + SuperClassWriter::addAttribute + ("valid_max", field->valid_max.getValue(), &fieldid); + + if (!field->scale_factor.isEmpty()) + SuperClassWriter::addAttribute + ("scale_factor", field->scale_factor.getValue(), &fieldid); + + if (!field->add_offset.isEmpty()) + SuperClassWriter::addAttribute + ("add_offset", field->add_offset.getValue(), &fieldid); + + SuperClassWriter::addAttribute + ("online_operation", field->operation.getValue(), &fieldid); + + // write child variables as attributes + + + vector listVars = field->getAllVariables() ; + for (vector::iterator it = listVars.begin() ;it != listVars.end(); it++) writeAttribute_(*it, fieldid) ; + + + if (wtime) + { + CDuration duration ; + + duration=CDuration::FromString(field->freq_op) ; + duration.solveTimeStep(*(context->calendar)); + SuperClassWriter::addAttribute("interval_operation", duration.toString(), &fieldid); + + duration=CDuration::FromString(field->getRelFile()->output_freq) ; + duration.solveTimeStep(*(context->calendar)); + SuperClassWriter::addAttribute("interval_write", duration.toString(), &fieldid); + } + + if (!field->default_value.isEmpty()) + { + double default_value = field->default_value.getValue(); + float fdefault_value = (float)default_value; + if (type == NC_DOUBLE) + SuperClassWriter::setDefaultValue(fieldid, &default_value); + else + SuperClassWriter::setDefaultValue(fieldid, &fdefault_value); + } + else + { + double * default_value = NULL; + SuperClassWriter::setDefaultValue(fieldid, default_value); + } + + { // Ecriture des coordonnées + + StdString coordstr; //boost::algorithm::join(coodinates, " ") + std::vector::iterator + itc = coodinates.begin(), endc = coodinates.end(); + + for (; itc!= endc; itc++) + { + StdString & coord = *itc; + if (itc+1 != endc) + coordstr.append(coord).append(" "); + else coordstr.append(coord); + } + + SuperClassWriter::addAttribute("coordinates", coordstr, &fieldid); + + } + } + catch (CNetCdfException& e) + { + StdString msg("On writing field : "); + msg.append(fieldid); msg.append("\n"); + msg.append("In the context : "); + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeField_(CField* field)", << msg); + } + } + + //-------------------------------------------------------------- + + void CNc4DataOutput::writeFile_ (CFile* file) + { + StdString filename = (!file->name.isEmpty()) + ? file->name.getValue() : file->getId(); + StdString description = (!file->description.isEmpty()) + ? file->description.getValue() + : StdString("Created by xios"); + try + { + this->writeFileAttributes(filename, description, + StdString ("CF-1.1"), + StdString("An IPSL model"), + this->getTimeStamp()); + } + catch (CNetCdfException& e) + { + StdString msg("On writing file : "); + msg.append(filename); msg.append("\n"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeFile_ (CFile* file)", << msg); + } + if (file->nbDomain==1) singleDomain=true ; + else singleDomain=false ; + } + + void CNc4DataOutput::writeAttribute_ (CVariable* var, const string& fieldId) + { + string name ; + if (!var->name.isEmpty()) name=var->name ; + else if (var->hasId()) name=var->getId() ; + else return ; + + try + { + if (var->getVarType()==CVariable::t_int) addAttribute(name,var->getData(),&fieldId) ; + else if (var->getVarType()==CVariable::t_short_int) addAttribute(name,var->getData(),&fieldId) ; + else if (var->getVarType()==CVariable::t_long_int) addAttribute(name,var->getData(),&fieldId) ; + else if (var->getVarType()==CVariable::t_float) addAttribute(name,var->getData(),&fieldId) ; + else if (var->getVarType()==CVariable::t_double) addAttribute(name,var->getData(),&fieldId) ; + else addAttribute(name,var->getData(),&fieldId) ; + } + catch (CNetCdfException& e) + { + StdString msg("On writing attributes of variable with name : "); + msg.append(name); msg.append("in the field "); msg.append(fieldId); msg.append("\n"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeAttribute_ (CVariable* var, const string& fieldId)", << msg); + } + } + + void CNc4DataOutput::writeAttribute_ (CVariable* var) + { + string name ; + if (!var->name.isEmpty()) name=var->name ; + else if (var->hasId()) name=var->getId() ; + else return ; + try + { + if (var->getVarType()==CVariable::t_int) addAttribute(name,var->getData()) ; + else if (var->getVarType()==CVariable::t_short_int) addAttribute(name,var->getData()) ; + else if (var->getVarType()==CVariable::t_long_int) addAttribute(name,var->getData()) ; + else if (var->getVarType()==CVariable::t_float) addAttribute(name,var->getData()) ; + else if (var->getVarType()==CVariable::t_double) addAttribute(name,var->getData()) ; + else addAttribute(name,var->getData()) ; + } + catch (CNetCdfException& e) + { + StdString msg("On writing attributes of variable with name : "); + msg.append(name); msg.append("\n"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeAttribute_ (CVariable* var)", << msg); + } + } + + void CNc4DataOutput::syncFile_ (void) + { + try + { + SuperClassWriter::sync() ; + } + catch (CNetCdfException& e) + { + StdString msg("On synchronizing the write among processes"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::syncFile_ (void)", << msg); + } + } + + void CNc4DataOutput::closeFile_ (void) + { + try + { + SuperClassWriter::close() ; + } + catch (CNetCdfException& e) + { + StdString msg("On closing file"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::syncFile_ (void)", << msg); + } + + } + + //--------------------------------------------------------------- + + StdString CNc4DataOutput::getTimeStamp(void) const + { + const int buffer_size = 100; + time_t rawtime; + struct tm * timeinfo = NULL; + char buffer [buffer_size]; + + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + strftime (buffer, buffer_size, "%Y-%b-%d %H:%M:%S %Z", timeinfo); + + return (StdString(buffer)); + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeFieldData_ (CField* field) + { + CContext* context = CContext::getCurrent() ; +// if (field->getRelFile()->isSyncTime()) SuperClassWriter::sync() ; + CContextServer* server=context->server ; + + CGrid* grid = field->grid ; + CDomain* domain = grid->domain ; + + if(SuperClass::type==MULTI_FILE || !isCollective) if (domain->isEmpty()) return; + + + StdString fieldid = (!field->name.isEmpty()) + ? field->name.getValue() + : field->getBaseFieldReference()->getId(); + + StdOStringStream oss; + string timeAxisId ; + if (field->foperation->timeType() == func::CFunctor::instant) timeAxisId="time_instant" ; + else if (field->foperation->timeType() == func::CFunctor::centered) timeAxisId="time_centered" ; + + StdString timeBoundId("time_counter_bounds"); + + StdString timeAxisBoundId; + if (field->foperation->timeType() == func::CFunctor::instant) timeAxisBoundId="time_instant_bounds" ; + else if (field->foperation->timeType() == func::CFunctor::centered) timeAxisBoundId="time_centered_bounds" ; + + CArray time_data(1) ; + CArray time_counter(1) ; + CArray time_counter_bound(2); + CArray time_data_bound(2); + + bool wtime = !(!field->operation.isEmpty() && (field->foperation->timeType() == func::CFunctor::once)); + + if (wtime) + { + time_counter(0)= (Time(*field->last_Write_srv)+Time(*field->lastlast_Write_srv))/2 -Time(context->calendar->getTimeOrigin()); + if (field->foperation->timeType() == func::CFunctor::instant) + time_data(0) = Time(*field->last_Write_srv)-Time(context->calendar->getTimeOrigin()); + else if (field->foperation->timeType() == func::CFunctor::centered) time_data(0) = time_counter(0); + + time_counter_bound(0) = Time(*field->lastlast_Write_srv) - Time(context->calendar->getTimeOrigin()); + time_counter_bound(1) = Time(*field->last_Write_srv) - Time(context->calendar->getTimeOrigin()); + if (field->foperation->timeType() == func::CFunctor::instant) + time_data_bound(0) = time_data_bound(1) = Time(*field->last_Write_srv)-Time(context->calendar->getTimeOrigin()); + else if (field->foperation->timeType() == func::CFunctor::centered) + { + time_data_bound(0) = time_counter_bound(0); + time_data_bound(1) = time_counter_bound(1); + } + } + + bool isRoot ; + if (server->intraCommRank==0) isRoot=true ; + else isRoot=false ; + + if (!field->scale_factor.isEmpty() || !field->add_offset.isEmpty()) + { + double scaleFactor=1. ; + double addOffset=0. ; + if (!field->scale_factor.isEmpty()) scaleFactor=field->scale_factor ; + if (!field->add_offset.isEmpty()) addOffset=field->add_offset ; + field->scaleFactorAddOffset(scaleFactor,addOffset) ; + } + + try + { + if (grid->hasAxis()) // 3D + { + CAxis* axis = grid->axis ; + CArray field_data3D(domain->zoom_ni_srv,domain->zoom_nj_srv,axis->zoom_size) ; + if (!field->default_value.isEmpty()) field_data3D = field->default_value ; + + field->outputField(field_data3D); + + if (!field->prec.isEmpty() && field->prec==2) field_data3D=round(field_data3D) ; + + switch (SuperClass::type) + { + case (MULTI_FILE) : + { + SuperClassWriter::writeData(field_data3D, fieldid, isCollective, field->getNStep()-1); + if (wtime) + { + SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep()-1); + SuperClassWriter::writeData(time_counter, string("time_counter"), isCollective, field->getNStep()-1); + SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1); + SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1); + } + break ; + } + case (ONE_FILE) : + { + std::vector start(3) ; + std::vector count(3) ; + if (domain->isEmpty()) + { + start[0]=0 ; start[1]=0 ; start[2]=0 ; + count[0]=0 ; count[1]=0 ; start[2]=0 ; + } + else + { + // start[2]=domain->zoom_ibegin_loc.getValue()-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_loc.getValue()-domain->zoom_jbegin.getValue() ; start[0]=0 ; + start[2]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; start[0]=0 ; + count[2]=domain->zoom_ni_srv ; count[1]=domain->zoom_nj_srv ; count[0] = axis->zoom_size.getValue(); + } + SuperClassWriter::writeData(field_data3D, fieldid, isCollective, field->getNStep()-1,&start,&count ); + if (wtime) + { + SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep()-1,isRoot ); + SuperClassWriter::writeTimeAxisData(time_counter, string("time_counter"), isCollective, field->getNStep()-1,isRoot ); + SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1, isRoot ); + SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1, isRoot); + } + break; + } + } + + } + else // 2D + { + CArray field_data2D(domain->zoom_ni_srv,domain->zoom_nj_srv) ; + if (!field->default_value.isEmpty()) field_data2D = field->default_value ; + field->outputField(field_data2D); + if (!field->prec.isEmpty() && field->prec==2) field_data2D=round(field_data2D) ; + switch (SuperClass::type) + { + case (MULTI_FILE) : + { + SuperClassWriter::writeData(field_data2D, fieldid, isCollective, field->getNStep()-1); + if (wtime) + { + SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep()-1); + SuperClassWriter::writeData(time_counter, string("time_counter"), isCollective, field->getNStep()-1); + SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1); + SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1); + } + break; + } + case (ONE_FILE) : + { + std::vector start(2) ; + std::vector count(2) ; + if (domain->isEmpty()) + { + start[0]=0 ; start[1]=0 ; + count[0]=0 ; count[1]=0 ; + } + else + { + start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; + count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ; + } + + SuperClassWriter::writeData(field_data2D, fieldid, isCollective, field->getNStep()-1,&start,&count); + if (wtime) + { + SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep()-1,isRoot); + SuperClassWriter::writeTimeAxisData(time_counter, string("time_counter"), isCollective, field->getNStep()-1,isRoot); + SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1, isRoot); + SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1, isRoot); + } + break; + + } + } + } + } + catch (CNetCdfException& e) + { + StdString msg("On writing field data: "); + msg.append(fieldid); msg.append("\n"); + msg.append("In the context : "); + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeFieldData_ (CField* field)", << msg); + } + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeTimeAxis_ + (CField* field, + const boost::shared_ptr cal) + { + StdOStringStream oss; + +// if (field->operation.getValue().compare("once") == 0) return ; + if (field->foperation->timeType() == func::CFunctor::once) return ; + +// oss << "time_" << field->operation.getValue() +// << "_" << field->getRelFile()->output_freq.getValue(); + +// StdString axisid = oss.str(); +// if (field->foperation->timeType() == func::CFunctor::centered) axisid="time_centered" ; +// else if (field->foperation->timeType() == func::CFunctor::instant) axisid="time_instant" ; + + StdString axisid("time_centered") ; + StdString axisBoundId("time_centered_bounds"); + StdString timeid("time_counter"); + StdString timeBoundId("time_bounds"); + + if (field->foperation->timeType() == func::CFunctor::instant) + { + axisid = "time_instant"; + axisBoundId = "time_instant_bounds"; + } + + try + { + // Adding time_instant or time_centered + std::vector dims; + dims.push_back(timeid); + if (!SuperClassWriter::varExist(axisid)) + { + SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims); + + CDate timeOrigin=cal->getTimeOrigin() ; + StdOStringStream oss2; + // oss2<writeTimeAxisAttributes + (axisid, cal->getType(), + StdString("seconds since ").append(strTimeOrigin), + strTimeOrigin, axisBoundId); + } + + // Adding time_instant_bounds or time_centered_bounds variables + if (!SuperClassWriter::varExist(axisBoundId)) + { + dims.clear() ; + dims.push_back(timeid); + dims.push_back(timeBoundId); + SuperClassWriter::addVariable(axisBoundId, NC_DOUBLE, dims); + } + + // Adding time_counter + axisid = "time_counter" ; + axisBoundId = "time_counter_bounds" ; + dims.clear() ; + dims.push_back(timeid); + if (!SuperClassWriter::varExist(axisid)) + { + SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims); + SuperClassWriter::addAttribute("axis", string("T"), &axisid); + CDate timeOrigin=cal->getTimeOrigin() ; + StdString strTimeOrigin=timeOrigin.toString() ; + + this->writeTimeAxisAttributes + (axisid, cal->getType(), + StdString("seconds since ").append(strTimeOrigin), + strTimeOrigin, axisBoundId); + } + + // Adding time_counter_bound dimension + if (!SuperClassWriter::varExist(axisBoundId)) + { + dims.clear(); + dims.push_back(timeid); + dims.push_back(timeBoundId); + SuperClassWriter::addVariable(axisBoundId, NC_DOUBLE, dims); + } + } + catch (CNetCdfException& e) + { + StdString msg("On writing time axis data: "); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeTimeAxis_ (CField* field, \ + const boost::shared_ptr cal)", << msg); + } + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeTimeAxisAttributes(const StdString & axis_name, + const StdString & calendar, + const StdString & units, + const StdString & time_origin, + const StdString & time_bounds, + const StdString & standard_name, + const StdString & long_name, + const StdString & title) + { + try + { + SuperClassWriter::addAttribute("standard_name", standard_name, &axis_name); + SuperClassWriter::addAttribute("long_name", long_name , &axis_name); + SuperClassWriter::addAttribute("title", title , &axis_name); + SuperClassWriter::addAttribute("calendar", calendar , &axis_name); + SuperClassWriter::addAttribute("units", units , &axis_name); + SuperClassWriter::addAttribute("time_origin", time_origin , &axis_name); + SuperClassWriter::addAttribute("bounds", time_bounds , &axis_name); + } + catch (CNetCdfException& e) + { + StdString msg("On writing time axis Attribute: "); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeTimeAxisAttributes(const StdString & axis_name, \ + const StdString & calendar,\ + const StdString & units, \ + const StdString & time_origin, \ + const StdString & time_bounds, \ + const StdString & standard_name, \ + const StdString & long_name, \ + const StdString & title)", << msg); + } + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeAxisAttributes(const StdString & axis_name, + const StdString & axis, + const StdString & standard_name, + const StdString & long_name, + const StdString & units, + const StdString & nav_model) + { + try + { + SuperClassWriter::addAttribute("axis" , axis , &axis_name); + SuperClassWriter::addAttribute("standard_name", standard_name, &axis_name); + SuperClassWriter::addAttribute("long_name" , long_name , &axis_name); + SuperClassWriter::addAttribute("units" , units , &axis_name); + SuperClassWriter::addAttribute("nav_model" , nav_model , &axis_name); + } + catch (CNetCdfException& e) + { + StdString msg("On writing Axis Attribute: "); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeAxisAttributes(const StdString & axis_name, \ + const StdString & axis, \ + const StdString & standard_name, \ + const StdString & long_name, \ + const StdString & units, \ + const StdString & nav_model)", << msg); + } + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeLocalAttributes + (int ibegin, int ni, int jbegin, int nj, StdString domid) + { + try + { + SuperClassWriter::addAttribute(StdString("ibegin").append(domid), ibegin); + SuperClassWriter::addAttribute(StdString("ni" ).append(domid), ni); + SuperClassWriter::addAttribute(StdString("jbegin").append(domid), jbegin); + SuperClassWriter::addAttribute(StdString("nj" ).append(domid), nj); + } + catch (CNetCdfException& e) + { + StdString msg("On writing Local Attributes: "); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeLocalAttributes \ + (int ibegin, int ni, int jbegin, int nj, StdString domid)", << msg); + } + + } + + void CNc4DataOutput::writeLocalAttributes_IOIPSL + (int ibegin, int ni, int jbegin, int nj, int ni_glo, int nj_glo, int rank, int size) + { + CArray array(2) ; + + try + { + SuperClassWriter::addAttribute("DOMAIN_number_total",size ) ; + SuperClassWriter::addAttribute("DOMAIN_number", rank) ; + array=1,2 ; + SuperClassWriter::addAttribute("DOMAIN_dimensions_ids",array) ; + array=ni_glo,nj_glo ; + SuperClassWriter::addAttribute("DOMAIN_size_global", array) ; + array=ni,nj ; + SuperClassWriter::addAttribute("DOMAIN_size_local", array) ; + array=ibegin,jbegin ; + SuperClassWriter::addAttribute("DOMAIN_position_first", array) ; + array=ibegin+ni-1,jbegin+nj-1 ; + SuperClassWriter::addAttribute("DOMAIN_position_last",array) ; + array=0,0 ; + SuperClassWriter::addAttribute("DOMAIN_halo_size_start", array) ; + SuperClassWriter::addAttribute("DOMAIN_halo_size_end", array); + SuperClassWriter::addAttribute("DOMAIN_type",string("box")) ; + /* + SuperClassWriter::addAttribute("DOMAIN_DIM_N001",string("x")) ; + SuperClassWriter::addAttribute("DOMAIN_DIM_N002",string("y")) ; + SuperClassWriter::addAttribute("DOMAIN_DIM_N003",string("axis_A")) ; + SuperClassWriter::addAttribute("DOMAIN_DIM_N004",string("time_counter")) ; + */ + } + catch (CNetCdfException& e) + { + StdString msg("On writing Local Attributes IOI PSL \n"); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeLocalAttributes_IOIPSL \ + (int ibegin, int ni, int jbegin, int nj, int ni_glo, int nj_glo, int rank, int size)", << msg); + } + } + //--------------------------------------------------------------- + + void CNc4DataOutput:: writeFileAttributes(const StdString & name, + const StdString & description, + const StdString & conventions, + const StdString & production, + const StdString & timeStamp) + { + try + { + SuperClassWriter::addAttribute("name" , name); + SuperClassWriter::addAttribute("description", description); + SuperClassWriter::addAttribute("conventions", conventions); + SuperClassWriter::addAttribute("production" , production); + SuperClassWriter::addAttribute("timeStamp" , timeStamp); + } + catch (CNetCdfException& e) + { + StdString msg("On writing File Attributes \n "); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput:: writeFileAttributes(const StdString & name, \ + const StdString & description, \ + const StdString & conventions, \ + const StdString & production, \ + const StdString & timeStamp)", << msg); + } + } + + //--------------------------------------------------------------- + + void CNc4DataOutput::writeMaskAttributes(const StdString & mask_name, + int data_dim, + int data_ni, + int data_nj, + int data_ibegin, + int data_jbegin) + { + try + { + SuperClassWriter::addAttribute("data_dim" , data_dim , &mask_name); + SuperClassWriter::addAttribute("data_ni" , data_ni , &mask_name); + SuperClassWriter::addAttribute("data_nj" , data_nj , &mask_name); + SuperClassWriter::addAttribute("data_ibegin", data_ibegin, &mask_name); + SuperClassWriter::addAttribute("data_jbegin", data_jbegin, &mask_name); + } + catch (CNetCdfException& e) + { + StdString msg("On writing Mask Attributes \n "); + msg.append("In the context : "); + CContext* context = CContext::getCurrent() ; + msg.append(context->getId()); msg.append("\n"); + msg.append(e.what()); + ERROR("CNc4DataOutput::writeMaskAttributes(const StdString & mask_name, \ + int data_dim, \ + int data_ni, \ + int data_nj, \ + int data_ibegin, \ + int data_jbegin)", << msg); + } + } + + ///-------------------------------------------------------------- + +} // namespace xios diff --git a/src/output/nc4_data_output.hpp b/src/output/nc4_data_output.hpp new file mode 100644 index 0000000..22f6dff --- /dev/null +++ b/src/output/nc4_data_output.hpp @@ -0,0 +1,101 @@ +#ifndef __XMLIO_NC4_DATA_OUTPUT__ +#define __XMLIO_NC4_DATA_OUTPUT__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "onetcdf4.hpp" +#include "data_output.hpp" + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + + class CNc4DataOutput + : protected CONetCDF4 + , public virtual CDataOutput + { + public : + + /// Définition de type /// + typedef CONetCDF4 SuperClassWriter; + typedef CDataOutput SuperClass; + + /// Constructeurs /// + CNc4DataOutput + (const StdString & filename, bool exist); + CNc4DataOutput + (const StdString & filename, bool exist, MPI_Comm comm_file, bool multifile, bool isCollective=true); + + CNc4DataOutput(const CNc4DataOutput & dataoutput); // Not implemented. + CNc4DataOutput(const CNc4DataOutput * const dataoutput); // Not implemented. + + /// Accesseur /// + const StdString & getFileName(void) const; + + /// Destructeur /// + virtual ~CNc4DataOutput(void); + bool singleDomain ; + bool isCollective ; + protected : + + /// Ecriture /// + virtual void writeDomain_ (CDomain* domain); + virtual void writeAxis_ (CAxis* axis); + virtual void writeTimeDimension_(void); + virtual void writeField_ (CField* field); + virtual void writeAttribute_ (CVariable* var); + virtual void writeAttribute_ (CVariable* var, const string& fieldId); + virtual void writeFieldData_ (CField* field); + virtual void writeFile_ (CFile* file); + virtual void closeFile_ (void); + virtual void syncFile_ (void); + virtual void writeTimeAxis_ (CField* field, + const boost::shared_ptr cal); + + protected : + void writeUnstructuredDomain (CDomain* domain); + void writeLocalAttributes(int ibegin, int ni, int jbegin, int nj, StdString domid); + void writeLocalAttributes_IOIPSL(int ibegin, int ni, int jbegin, int nj, int ni_glo, int nj_glo, int rank, int size) ; + void writeTimeAxisAttributes(const StdString & axis_name, + const StdString & calendar, + const StdString & units, + const StdString & time_origin, + const StdString & time_bounds = StdString("bounds"), + const StdString & standard_name = StdString("time"), + const StdString & long_name = StdString("Time axis"), + const StdString & title = StdString("Time")); + + void writeFileAttributes(const StdString & name, + const StdString & description, + const StdString & conventions, + const StdString & production, + const StdString & timeStamp); + + void writeMaskAttributes(const StdString & mask_name, + int data_dim, + int data_ni = 0, + int data_nj = 0, + int data_ibegin = 0, + int data_jbegin = 0); + + void writeAxisAttributes(const StdString & axis_name, + const StdString & axis, + const StdString & standard_name, + const StdString & long_name, + const StdString & units, + const StdString & nav_model); + + private : + + /// Traitement /// + StdString getTimeStamp(void) const; + + /// Propriétés privées /// + MPI_Comm comm_file; + const StdString filename; + + }; // class CNc4DataOutput + +} // namespace xios + +#endif //__XMLIO_NC4_DATA_OUTPUT__ diff --git a/src/output/netCdfException.hpp b/src/output/netCdfException.hpp new file mode 100644 index 0000000..15e9aba --- /dev/null +++ b/src/output/netCdfException.hpp @@ -0,0 +1,34 @@ +/*! + \file netCdfException.hpp + \author Ha NGUYEN + \date 08 Oct 2014 + \since 07 Oct 2014 + + \brief Exception management. + */ +#ifndef __NETCDF_EXCEPTION_HPP__ +#define __NETCDF_EXCEPTION_HPP__ + +#include +#include + +namespace xios +{ +/*! +\class CNetCdfException + This class manages exceptions risen by CNetCdfInterface +*/ +class CNetCdfException : public virtual std::exception +{ +public: + CNetCdfException(const std::string& ss) : exStr_(ss) {} + CNetCdfException(const CNetCdfException& netEx) : exStr_(netEx.exStr_) {} + ~CNetCdfException() throw() {} + const char* what() const throw() { return exStr_.c_str();} +protected: + std::string exStr_; +}; + +} + +#endif // __NETCDF_EXCEPTION_HPP__ diff --git a/src/output/netCdfInterface.cpp b/src/output/netCdfInterface.cpp new file mode 100644 index 0000000..fa58a82 --- /dev/null +++ b/src/output/netCdfInterface.cpp @@ -0,0 +1,753 @@ +/*! + \file netCdfInterface.cpp + \author Ha NGUYEN + \date 08 Oct 2014 + \since 03 Oct 2014 + + \brief Wrapper of netcdf functions. + */ + + #include "netCdfInterface.hpp" + #include "netCdfException.hpp" + + namespace xios + { + /*! + This function creates a new netcdf file and return its id + \param [in] fileName Name of the file + \param [in] cMode create mode + \param [in/out] ncId id of the created file + \return Status code + */ + int CNetCdfInterface::create(const StdString& fileName, int cMode, int& ncId) + { + int status = nc_create((fileName.c_str()), cMode, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function : nc_create((fileName.c_str()), cMode, &ncId) " << std::endl + << errormsg << std::endl + << "Unable to create file, given its name : " << fileName + << "and its creation mode " << creationMode2String(cMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function creates a new netcdf file on parallel file system + \param [in] fileName Name of the file + \param [in] cMode create mode + \param [in] comm MPI communicator + \param [in] info MPI information + \param [in/out] ncId id of the created file + \return Status code + */ + int CNetCdfInterface::createPar(const StdString& fileName, int cMode, MPI_Comm comm, MPI_Info info, int& ncId) + { + int status = ::nc_create_par((fileName.c_str()), cMode, comm, info, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function : nc_create_par((fileName.c_str()), cMode, comm, info, &ncId) " << std::endl + << errormsg << std::endl + << "Unable to create file on parallel filesys, given its name : " << std::endl + << "and its creation mode " << creationMode2String(cMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function opens a netcdf file, given its name and open mode, return its id + \param [in] fileName Name of the file + \param [in] oMode open mode + \param [in/out] ncId id of the opening file + \return Status code + */ + int CNetCdfInterface::open(const StdString& fileName, int oMode, int& ncId) + { + int status = nc_open((fileName.c_str()), oMode, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function : nc_open((fileName.c_str()), oMode, &ncId) "<< std::endl + << errormsg << std::endl + << "Unable to open file, given its name : " << fileName + << "and its open mode " << openMode2String(oMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + + /*! + This function opens a new netcdf file on parallel file system + \param [in] fileName Name of the file + \param [in] oMode open mode + \param [in] comm MPI communicator + \param [in] info MPI information + \param [in/out] ncId id of the opened file + \return Status code + */ + int CNetCdfInterface::openPar(const StdString& fileName, int oMode, MPI_Comm comm, MPI_Info info, int& ncId) + { + int status = ::nc_open_par((fileName.c_str()), oMode, comm, info, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "nc_open_par((fileName.c_str()), oMode, comm, info, &ncId) " << std::endl + << errormsg << std::endl + << "Unable to open file on parallel filesys, given its name : " << fileName + << "and its open mode " << openMode2String(oMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function closes a netcdf file, given its id + \param [in] ncId id of the opening netcdf file + \return Status code + */ + int CNetCdfInterface::close(int ncId) + { + int status = nc_close(ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "nc_close(ncId)" << std::endl + << errormsg << std::endl + << "Unable to close file, given its id : " << ncId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function put a netcdf file into define mode, given its id + \param [in] ncId id of the opening netcdf file to be put into define mode + \return Status code + */ + int CNetCdfInterface::reDef(int ncId) + { + int status = nc_redef(ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "nc_redef(ncId)" << std::endl + << errormsg << std::endl + << "Unable to put this file into define mode given its id : " << ncId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function ends a netcdf file define mode, given its id + \param [in] ncId id of the opening netcdf file to be put into define mode + \return Status code + */ + int CNetCdfInterface::endDef(int ncId) + { + int status = nc_enddef(ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_enddef(ncId)" << std::endl + << errormsg << std::endl + << "Unable to end define mode of this file, given its id : " << ncId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with ncid and group name then return ncid of the named group + \param [in] ncid Groupd id (or File Id) + \param [in] grpName Name of the desired group (or file) + \param [in/out] grpId Group id if the group is found + \return Status code + */ + int CNetCdfInterface::inqNcId(int ncid, const StdString& grpName, int& grpId) + { + int status = nc_inq_ncid(ncid, (grpName.c_str()), &grpId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_ncid(ncid, (grpName.c_str()), &grpId)" << std::endl + << errormsg << std::endl + << "Unable to get id of a group (File), given its name : " << grpName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + + /*! + This function makes a request to netcdf with ncid and variable name then return ncid of the named variable + \param [in] ncid Groupd id (or File Id) + \param [in] varName Name of the desired variable + \param [in/out] varId Variable id if this variable is found + \return Status code + */ + int CNetCdfInterface::inqVarId(int ncid,const StdString& varName, int& varId) + { + int status = nc_inq_varid(ncid, (varName.c_str()), &varId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function : nc_inq_varid(ncid, (varName.c_str()), &varId)" << std::endl + << (errormsg) << std::endl + << "Unable to get id of variable with name : " << varName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with a netCdf dimension name then return ncid of the named dimension + \param [in] ncid Groupd id (or File Id) + \param [in] dimName Name of the desired dimension + \param [in/out] dimId Dimension id if this dimension is found + \return Status code + */ + int CNetCdfInterface::inqDimId(int ncid,const StdString& dimName, int& dimId) + { + int status = nc_inq_dimid(ncid, (dimName.c_str()), &dimId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimid(ncid, (dimName.c_str()), &dimId)" << std::endl + << errormsg << std::endl + << "Unable to get id of dimension, given its name : " << dimName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with a netCdf dimension name then return ncid of the named dimension + \param [in] ncid Groupd id (or File Id) + \param [in/out] dimId Dimension id if this dimension is found + \return Status code + */ + int CNetCdfInterface::inqUnLimDim(int ncid, int& dimId) + { + int status = nc_inq_unlimdim(ncid, &dimId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimid" << std::endl + << errormsg << std::endl + << "Unable to get id of unlimited dimension " << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf, returns name of a dimension, given its id + \param [in] ncid Groupd id (or File Id) + \param [in] dimId Id of desired dimension + \param [in/out] dimName Name of desired dimension + \return Status code + */ + int CNetCdfInterface::inqDimName(int ncid, int dimId, StdString& dimName) + { + char fullNameIn[NC_MAX_NAME +1]; + int status = nc_inq_dimname(ncid, dimId, fullNameIn); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimname(ncid, dimId, fullNameIn)" << std::endl + << errormsg << std::endl + << "Unable to get dimension name from its id : " << dimId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + dimName = StdString(fullNameIn); + return status; + } + + /*! + This function makes a request to netcdf, returns length of a dimension, given its id + \param [in] ncid Groupd id (or File Id) + \param [in] dimId Id of desired dimension + \param [in/out] dimLen Length of desired dimension + \return Status code + */ + int CNetCdfInterface::inqDimLen(int ncid, int dimId, StdSize& dimLen) + { + int status = nc_inq_dimlen(ncid, dimId, &dimLen); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimlen(ncid, dimId, &dimLen)" << std::endl + << errormsg << std::endl + << "Unable to get dimension length from its id: " << dimId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf, returns number of dimensions of a variable, given its id + \param [in] ncid Groupd id (or File Id) + \param [in] varId Id of variable + \param [in/out] ndims number of dimension of the variable + \return Status code + */ + int CNetCdfInterface::inqVarNDims(int ncid, int varId, int& nDims) + { + int status = nc_inq_varndims(ncid, varId, &nDims); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_varndims(ncid, varId, &nDims)" << std::endl + << errormsg << std::endl + << "Unable to get the number of dimension of variable with Id : " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf, returns a list of dimension ID describing the shape of the variable, given its id + \param [in] ncid Groupd id (or File Id) + \param [in] varId Id of variable + \param [in/out] dimIds list of dimension of the variable + \return Status code + */ + int CNetCdfInterface::inqVarDimId(int ncid, int varId, int* dimIds) + { + int status = nc_inq_vardimid(ncid, varId, dimIds); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_vardimid(ncid, varId, dimIds)" << std::endl + << errormsg << std::endl + << "Unable to get list of dimension id of the variable with id " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf, to find all dimension in a group + \param [in] ncid Groupd id (or File Id) + \param [in/out] nDims number of list of dimension + \param [in/out] dimIds list of dimension in a group or any of its parent + \param [in] includeParents number of parents + \return Status code + */ + int CNetCdfInterface::inqDimIds(int ncid, int& nDims, int* dimIds, int includeParents) + { + int status = nc_inq_dimids(ncid, &nDims, dimIds, includeParents); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimids(ncid, &nDims, dimIds, includeParents)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to retrieve number of dimension in the group with id : " << ncid << std::endl; + sstr << "With number of Parents " << includeParents << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with a id of a prent groupd and then return id of the created group, given its name + \param [in] parentNcid Id of parent groupd(or File Id) + \param [in] grpName Name of the desired group + \param [in/out] grpId Group id if this group is created sucessfully + \return Status code + */ + int CNetCdfInterface::defGrp(int parentNcid, const StdString& grpName, int& grpId) + { + int status = nc_def_grp(parentNcid, (grpName.c_str()), &grpId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_grp(parentNcid, (grpName.c_str()), &grpId)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to create group Id, given its name : " << grpName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf, add a new dimension to an open netcdf in define mode + \param [in] ncid Id of groupd(or File Id) + \param [in] dimName Name of the desired dimension + \param [in/out] grpId Group id if this group is created sucessfully + \return Status code + */ + int CNetCdfInterface::defDim(int ncid, const StdString& dimName, StdSize dimLen, int& dimId) + { + int status = nc_def_dim(ncid, (dimName.c_str()), dimLen, &dimId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_dim(ncid, (dimName.c_str()), dimLen, &dimId)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to create dimension with name : " << dimName + << " and with length " << dimLen << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with its id, to add a new variable to an open netCdf in define mode, + return a variable id, given its name, type, the number of dimensions and list of dimension id + \param [in] ncid Id of groupd(or File Id) + \param [in] varName Name of the desired dimension + \param [in] xtypes One of the set of predefined netCDF data types + \param [in] nDims Number of dimension for the variable + \param [in] dimIds List of ndims dimension ids corresponding to the variable dimensions + \param [in/out] varId Variable id if it is added sucessfully + \return Status code + */ + int CNetCdfInterface::defVar(int ncid,const StdString& varName, nc_type xtype, + int nDims, const int dimIds[], int& varId) + { + int status = nc_def_var(ncid, (varName.c_str()), xtype, nDims, dimIds, &varId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << " nc_def_var(ncid, (varName.c_str()), xtype, nDims, dimIds, &varId)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to add a new variable with name : " << varName + << " with type " << xtype + << " and number of dimension " << nDims << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with a ncid, to set the chunking size of a variable, + given variable id and type of storage + \param [in] ncid Id groupd(or File Id) + \param [in] varId Id of the variable + \param [in] storage Type of storage (It can be : NC_CONTIGUOUS, NC_CHUNKED) + \param [in/out] chunkSize array list of chunk sizes + \return Status code + */ + int CNetCdfInterface::defVarChunking(int ncid, int varId, int storage, StdSize chunkSize[]) + { + int status = nc_def_var_chunking(ncid, varId, storage, chunkSize); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_var_chunking(ncid, varId, storage, chunkSize)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set chunk size of the variable with id : " << varId + << " and storage type " << storage << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with a ncid, to set the fill parameters for a variable, + given variable id and type of fill + \param [in] ncid Id groupd(or File Id) + \param [in] varId Id of the variable + \param [in] noFill turn on/off nofill mode on a variable + \param [in/out] fillValue + \return Status code + */ + int CNetCdfInterface::defVarFill(int ncid, int varId, int noFill, void* fillValue) + { + int status = nc_def_var_fill(ncid, varId, noFill, fillValue); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_var_fill(ncid, varId, noFill, fillValue)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set fill parameters of the variable with id : " << varId + << " and fill option " << noFill << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with a ncid, to change the way read/write operations are performed + collectively or independently on the variable. + \param [in] ncid Id groupd(or File Id) + \param [in] varId Id of the variable + \param [in] noFill turn on/off nofill mode on a variable + \param [in/out] fillValue + \return Status code + */ + int CNetCdfInterface::varParAccess(int ncid, int varId, int access) + { + int status = nc_var_par_access(ncid, varId, access); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_var_par_access(ncid, varId, access)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to change read/write option of the variable with id : " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a synchronisation of the disk copy of a netCDF dataset. + \param [in] ncid Id groupd(or File Id) + \return Status code + */ + int CNetCdfInterface::sync(int ncid) + { + int status = nc_sync(ncid); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_sync(ncid)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to make a synchronization of a netCDF file with id : " << ncid << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with its id, to add or change a variable attribute or gloabl attribute, + given its name, type, number of values provided for attribute + \param [in] ncid Id of groupd(or File Id) + \param [in] varId Id of the variable + \param [in] attrName Name of the attribute + \param [in] xtypes One of the set of predefined netCDF data types + \param [in] numVal Number of values + \param [in] op Array of values provided for attribute + \return Status code + */ + int CNetCdfInterface::putAtt(int ncid, int varId, const StdString& attrName, nc_type xtype, + StdSize numVal, const void* op) + { + int status = nc_put_att(ncid, varId, (attrName.c_str()), xtype, numVal, op); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_put_att(ncid, varId, (attrName.c_str()), xtype, numVal, op)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set attribute " << attrName << " for a variable with id : " << varId + << " with number of attribute " << numVal + << " with type " << xtype << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + // Some specilization of putAttributeType + template<> + int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const double* op) + { + return (nc_put_att_double(ncid, varid, attrName, NC_DOUBLE, numVal, op)); + } + + template<> + int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const float* op) + { + return (nc_put_att_float(ncid, varid, attrName, NC_FLOAT, numVal, op)); + } + + template<> + int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const int* op) + { + return (nc_put_att_int(ncid, varid, attrName, NC_INT, numVal, op)); + } + + template<> + int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const long* op) + { + return (nc_put_att_long(ncid, varid, attrName, NC_LONG, numVal, op)); + } + + template<> + int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const short* op) + { + return (nc_put_att_short(ncid, varid, attrName, NC_SHORT, numVal, op)); + } + + + // Some specilization of putVariableType + template<> + int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const double* op) + { + return (nc_put_vara_double(ncid, varid, start, count, op)); + } + + template<> + int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const float* op) + { + return (nc_put_vara_float(ncid, varid, start, count, op)); + } + + template<> + int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const int* op) + { + return (nc_put_vara_int(ncid, varid, start, count, op)); + } + + /*! + This function verifies an existence of a variable by using its name. + Be careful, althoug false means variable doens't exist, it could show that netCDF file doesn't either + \param [in] ncid Id of groupd(or File Id) + \param [in] attrName Name of the variable + \return Existence of variable + */ + bool CNetCdfInterface::isVarExisted(int ncId, const StdString& varName) + { + int varId = 0; + return (NC_NOERR == (nc_inq_varid(ncId, varName.c_str(), &varId))); + } + + StdString CNetCdfInterface::openMode2String(int oMode) + { + StdString modeMes; + switch (oMode) + { + case NC_NOWRITE: + modeMes = StdString("NC_NOWRITE : Opening netCDF file with read-only access with buffering and caching access"); + break; + case NC_SHARE: + modeMes = StdString("NC_SHARE : Several processes can read the file concurrently"); + break; + case NC_WRITE: + modeMes = StdString("NC_WRITE : NetCDF file is readable and writable"); + break; + default: + modeMes = StdString("In the composed opening mode"); + break; + return modeMes; + } + } + + StdString CNetCdfInterface::creationMode2String(int cMode) + { + StdString modeMes; + switch (cMode) + { + case NC_NOCLOBBER: + modeMes = StdString("NC_NOCLOBBER : Not overwrite an exisiting netCDF file "); + break; + case NC_SHARE: + modeMes = StdString("NC_SHARE : Several processes can read from and write into the file concurrently"); + break; + case NC_64BIT_OFFSET: + modeMes = StdString("NC_64BIT_OFFSET : NetCDF file is 64-bit offset"); + break; + case NC_NETCDF4: + modeMes = StdString("NC_NETCDF4 : NetCDF file is HDF5/NetCDF-4"); + break; + case NC_CLASSIC_MODEL: + modeMes = StdString("NC_CLASSIC_MODEL : NetCDF file is classical model"); + break; + default: + modeMes = StdString("In the composed creation mode"); + break; + return modeMes; + } + } + + } diff --git a/src/output/netCdfInterface.hpp b/src/output/netCdfInterface.hpp new file mode 100644 index 0000000..e7779b5 --- /dev/null +++ b/src/output/netCdfInterface.hpp @@ -0,0 +1,132 @@ +/*! + \file netCdfInterface.hpp + \author Ha NGUYEN + \date 08 Oct 2014 + \since 03 Oct 2014 + + \brief Wrapper of netcdf functions. + */ +#ifndef __NETCDF_INTERFACE_HPP_ +#define __NETCDF_INTERFACE_HPP_ + +#include "xmlioserver_spl.hpp" +#include "mpi.hpp" +#include "netcdf.hpp" + +namespace xios +{ + /*! + \class CNetCdfInterface + This class is wrapper of some common used functions of netCdf in Xios + */ + class CNetCdfInterface + { + public: + //! Create a netcdf file + static int create(const StdString& path, int cmode, int& ncId); + + //! Create a netcdf file on a parallel file system + static int createPar(const StdString& path, int cmode, MPI_Comm comm, MPI_Info info, int& ncId); + + //! Open a netcdf file + static int open(const StdString& path, int oMode, int& ncId); + + //! Open a netcdf file + static int openPar(const StdString& path, int cmode, MPI_Comm comm, MPI_Info info, int& ncId); + + //! Close a netcdf file + static int close(int ncId); + + //! Put netcdf file into define mode + static int reDef(int ncId); + + //! End define mode of a netcdf file + static int endDef(int ncId); + + //! Query identity of a named group + static int inqNcId(int ncid, const StdString& grpName, int& grpId); + + //! Query identity of a named variable + static int inqVarId(int ncid, const StdString& varName, int& varId); + + //! Query identity of a named dimension + static int inqDimId(int ncid,const StdString& dimName, int& dimId); + + //! Query identity of unlimited dimension + static int inqUnLimDim(int ncid, int& dimId); + + //! Query name of a dimension with its id + static int inqDimName(int ncid, int dimId, StdString& dimName); + + //! Query length of dimension with its id + static int inqDimLen(int ncid, int dimId, StdSize& dimLen); + + //! Query number of dimension of a variable with its id + static int inqVarNDims(int ncid, int varId, int& nDims); + + //! Query list of dimension of a variable with its id + static int inqVarDimId(int, int, int*); + + //! Query dimensions of a group + static int inqDimIds(int ncid, int& nDims, int* dimIds, int includeParents); + + + //! Define a group + static int defGrp(int parentNcid,const StdString& grpName, int& grpId); + + //! Define a dimension + static int defDim(int ncid,const StdString& dimName, StdSize dimLen, int& dimId); + + //! Define a variable + static int defVar(int ncid,const StdString& varName, nc_type xtype, + int nDims, const int dimIds[], int& varId); + + //! Define variable chunking size + static int defVarChunking(int ncid, int varId, int storage, StdSize chunkSize[]); + + //! Define variable fill parameters + static int defVarFill(int ncid, int varId, int noFill, void* fillValue); + + + //! Change access type of a variable + static int varParAccess(int ncid, int varid, int access); + + //! Syn + static int sync(int ncId); + + //! Put attribute into variable + static int putAtt(int ncid, int varid, const StdString& attrName, nc_type xtype, + StdSize numVal, const void* op); + + + //! Put attribute into variable with specific type + template + static int putAttType(int ncid, int varid, const StdString& attrName, StdSize numVal, const T* op); + + //! Put value into a variable with a specific type + template + static int putVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const T* op); + + private: + template + static int ncPutAttType(int ncid, int varid, const char* attrName, StdSize numVal, const T* op); + + template + static int ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const T* op); + + private: + static StdString openMode2String(int oMode); + + static StdString creationMode2String(int cMode); + + + public: + // Some functions dedude from several special cases + //! Query the existence of a variable + static bool isVarExisted(int ncId, const StdString& varName); + + }; +} + + +#endif // NETCDFINTERFACE_HPP_ diff --git a/src/output/netCdfInterface_decl.cpp b/src/output/netCdfInterface_decl.cpp new file mode 100644 index 0000000..2fb39d6 --- /dev/null +++ b/src/output/netCdfInterface_decl.cpp @@ -0,0 +1,30 @@ +/*! + \file netCdfInterface_impl.hpp + \author Ha NGUYEN + \date 06 Oct 2014 + \since 06 Oct 2014 + + \brief Implemention of some templated functions in netCdfInterface + */ + +#include "netCdfInterface_impl.hpp" + +namespace xios +{ +#define macroPutAtt(type) \ + template int CNetCdfInterface::putAttType(int ncid, int varid, const StdString& attrName, \ + StdSize numVal, const type* op); + + macroPutAtt(double); + macroPutAtt(float); + macroPutAtt(int); + macroPutAtt(long); + macroPutAtt(short); + +#define macroPutVar(type) \ + template int CNetCdfInterface::putVaraType(int ncid, int varId, const StdSize* start, \ + const StdSize* count, const type* op); + macroPutVar(double); + macroPutVar(float); + macroPutVar(int); +} diff --git a/src/output/netCdfInterface_impl.hpp b/src/output/netCdfInterface_impl.hpp new file mode 100644 index 0000000..a397763 --- /dev/null +++ b/src/output/netCdfInterface_impl.hpp @@ -0,0 +1,77 @@ +/*! + \file netCdfInterface_impl.hpp + \author Ha NGUYEN + \date 08 Oct 2014 + \since 06 Oct 2014 + + \brief Implemention of some templated functions in netCdfInterface + */ + +#ifndef __NETCDF_INTERFACE_IMPL_HPP__ +#define __NETCDF_INTERFACE_IMPL_HPP__ + +#include "netCdfInterface.hpp" +#include "netCdfException.hpp" + +namespace xios +{ + /*! + This function makes a request to netcdf with its id, to add or change a variable attribute or gloabl attribute, + given its name, type, number of values provided for attribute + \param [in] ncid Id of groupd(or File Id) + \param [in] varId Id of the variable + \param [in] attrName Name of the attribute + \param [in] numVal Number of values + \param [in] op Array of values provided for attribute + \return Error code + */ + template + int CNetCdfInterface::putAttType(int ncid, int varId, const StdString& attrName, + StdSize numVal, const T* op) + { + int status = ncPutAttType(ncid, varId, attrName.c_str(), numVal, op); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "ncPutAttType(ncid, varId, attrName.c_str(), numVal, op)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set attribute " << attrName << " for a variable with id : " << varId + << " with number of attribute " << numVal << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + + /*! + This function makes a request to netcdf with its id, to write variable values into netcdf file, + \param [in] ncid Id of groupd(or File Id) + \param [in] varId Id of the variable + \param [in] start Array specifying the index in the variable where the first data value will be written + \param [in] count Array specifying the edge lengths along each dimension of block data + \param [in] op Array of values provided for attribute + \return Error code + */ + template + int CNetCdfInterface::putVaraType(int ncid, int varId, const StdSize* start, const StdSize* count, const T* op) + { + int status = ncPutVaraType(ncid, varId, start, count, op); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "ncPutVaraType(ncid, varId, start, count, op)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to write value of a variable with id : " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; + } + +} + +#endif // __NETCDF_INTERFACE_IMPL_HPP__ diff --git a/src/output/netcdf.hpp b/src/output/netcdf.hpp new file mode 100644 index 0000000..83625a6 --- /dev/null +++ b/src/output/netcdf.hpp @@ -0,0 +1,67 @@ +#ifndef __XIOS_NETCDF_HPP__ +#define __XIOS_NETCDF_HPP__ +#include "mpi.hpp" +#define MPI_INCLUDED +#include + +#if defined(USING_NETCDF_INTERNAL) + const bool using_netcdf_internal=true ; +#else + const bool using_netcdf_internal=false ; +#endif + +#include "netcdf_version.hpp" + +#if NETCDF_VERSION >= 4110 + +# if defined(USING_NETCDF_PAR) +extern "C" +{ +# include +} +# endif +#endif + +#if !defined(USING_NETCDF_PAR) + #define NC_INDEPENDENT 0 + #define NC_COLLECTIVE 1 +#endif + +namespace xios +{ + inline int nc_create_par(const char *path, int cmode, MPI_Comm comm, MPI_Info info,int *ncidp) + { +#if defined(USING_NETCDF_PAR) + return ::nc_create_par(path, cmode, comm, info, ncidp) ; +#else + ERROR("int nc_create_par(const char *path, int cmode, MPI_Comm comm, MPI_Info info,int *ncidp)", + << "must not be use with netcdf sequential version") ; + return -1 ; +#endif + } + + inline int nc_open_par(const char *path, int mode, MPI_Comm comm, MPI_Info info,int *ncidp) + { +#if defined(USING_NETCDF_PAR) + return ::nc_open_par(path, mode, comm, info, ncidp) ; +#else + ERROR("int nc_open_par(const char *path, int mode, MPI_Comm comm, MPI_Info info,int *ncidp)", + << "must not be use with netcdf sequential version") ; + return -1 ; +#endif + } + + inline int nc_var_par_access(int ncid, int varid, int par_access) + { +#if defined(USING_NETCDF_PAR) + return ::nc_var_par_access(ncid, varid, par_access) ; +#else + ERROR("int nc_var_par_access(int ncid, int varid, int par_access)", + << "must not be use with netcdf sequential version") ; + return -1 ; +#endif + } +} + + +#endif diff --git a/src/output/netcdf_version.hpp b/src/output/netcdf_version.hpp new file mode 100644 index 0000000..041b7be --- /dev/null +++ b/src/output/netcdf_version.hpp @@ -0,0 +1,34 @@ +#ifndef __XIOS_NETCDF_VERSION_HPP__ +#define __XIOS_NETCDF_VERSION_HPP__ + +#if defined(NC_DISKLESS) && defined (NC_MMAP) + +# define NETCDF_VERSION 4211 + +#elif defined(NC_ETRANSLATION) + +# define NETCDF_VERSION 4130 + +#elif defined(NC_EURL) && defined(NC_ECONSTRAINT) + +# define NETCDF_VERSION 4120 + +#elif defined (NC_PNETCDF) + +# define NETCDF_VERSION 4110 + +#elif defined(NC_CHUNKED) && defined(NC_CONTIGUOUS) + +# define NETCDF_VERSION 4010 + +#elif defined(NC_NETCDF4) + +# define NETCDF_VERSION 4000 + +#else + +# error "netcdf version prior 4.0 incompatible with XIOS" + +#endif + +#endif diff --git a/src/output/onetcdf4.cpp b/src/output/onetcdf4.cpp new file mode 100644 index 0000000..ee741e4 --- /dev/null +++ b/src/output/onetcdf4.cpp @@ -0,0 +1,522 @@ +#include "onetcdf4.hpp" +#include "group_template.hpp" +#include "mpi.hpp" +#include "netcdf.hpp" +#include "netCdfInterface.hpp" +#include "netCdfException.hpp" + +namespace xios +{ + /// ////////////////////// Définitions ////////////////////// /// + + CONetCDF4::CONetCDF4 + (const StdString & filename, bool exist, const MPI_Comm * comm, bool multifile) + : path() + { + this->wmpi = (comm != NULL) && !multifile; + this->initialize(filename, exist, comm,multifile); + } + + //--------------------------------------------------------------- + + + CONetCDF4::~CONetCDF4(void) + { +// CheckError(nc_close(this->ncidp)); + } + + ///-------------------------------------------------------------- + + void CONetCDF4::initialize + (const StdString & filename, bool exist, const MPI_Comm * comm, bool multifile) + { + if (!exist) + { + if (comm != NULL) + { + if (!multifile) (CNetCdfInterface::createPar(filename, NC_NETCDF4|NC_MPIIO, *comm, MPI_INFO_NULL, (this->ncidp))); + else (CNetCdfInterface::create(filename, NC_NETCDF4, this->ncidp)); + } + else (CNetCdfInterface::create(filename, NC_NETCDF4, this->ncidp)); + } + else + { + if (comm != NULL) + { + if (!multifile) (CNetCdfInterface::openPar(filename, NC_NETCDF4|NC_MPIIO, *comm, MPI_INFO_NULL, this->ncidp)); + else (CNetCdfInterface::open(filename, NC_NETCDF4, this->ncidp)); + } + else (CNetCdfInterface::open(filename, NC_NETCDF4, this->ncidp)); + } + } + + void CONetCDF4::close() + { + (CNetCdfInterface::close(this->ncidp)); + } + + //--------------------------------------------------------------- + + void CONetCDF4::definition_start(void) + { + (CNetCdfInterface::reDef(this->ncidp)); + } + + //--------------------------------------------------------------- + + void CONetCDF4::definition_end(void) + { + (CNetCdfInterface::endDef(this->ncidp)); + } + + //--------------------------------------------------------------- + +// Don't need it anymore? +// void CONetCDF4::CheckError(int status) +// { +// if (status != NC_NOERR) +// { +// StdString errormsg (nc_strerror(status)); // fuite mémoire ici ? +// ERROR("CONetCDF4::CheckError(int status)", +// << "[ status = " << status << " ] " << errormsg); +// } +// } + + //--------------------------------------------------------------- + + int CONetCDF4::getCurrentGroup(void) + { + return (this->getGroup(this->getCurrentPath())); + } + + //--------------------------------------------------------------- + + int CONetCDF4::getGroup(const CONetCDF4Path & path) + { + int retvalue = this->ncidp; + + CONetCDF4Path::const_iterator + it = path.begin(), end = path.end(); + + for (;it != end; it++) + { + const StdString & groupid = *it; + (CNetCdfInterface::inqNcId(retvalue, groupid, retvalue)); + } + return (retvalue); + } + + //--------------------------------------------------------------- + + int CONetCDF4::getVariable(const StdString & varname) + { + int varid = 0; + int grpid = this->getCurrentGroup(); + (CNetCdfInterface::inqVarId(grpid, varname, varid)); + return (varid); + } + + //--------------------------------------------------------------- + + int CONetCDF4::getDimension(const StdString & dimname) + { + int dimid = 0; + int grpid = this->getCurrentGroup(); + (CNetCdfInterface::inqDimId(grpid, dimname, dimid)); + return (dimid); + } + + //--------------------------------------------------------------- + + int CONetCDF4::getUnlimitedDimension(void) + { + int dimid = 0; + int grpid = this->getCurrentGroup(); + (CNetCdfInterface::inqUnLimDim(grpid, dimid)); + return (dimid); + } + + StdString CONetCDF4::getUnlimitedDimensionName(void) + { + int grpid = this->getGroup(path); + int dimid = this->getUnlimitedDimension(); + + if (dimid == -1) return (std::string()); + StdString dimname; + (CNetCdfInterface::inqDimName(grpid, dimid, dimname)); + + return (dimname); + } + + //--------------------------------------------------------------- + + std::vector CONetCDF4::getDimensions(const StdString & varname) + { + StdSize size = 0; + std::vector retvalue; + int grpid = this->getCurrentGroup(); + int varid = this->getVariable(varname); + int nbdim = 0, *dimid = NULL; + + (CNetCdfInterface::inqVarNDims(grpid, varid, nbdim)); + dimid = new int[nbdim](); + (CNetCdfInterface::inqVarDimId(grpid, varid, dimid)); + + for (int i = 0; i < nbdim; i++) + { + (CNetCdfInterface::inqDimLen(grpid, dimid[i], size)); + if (size == NC_UNLIMITED) + size = UNLIMITED_DIM; + retvalue.push_back(size); + } + delete [] dimid; + return (retvalue); + } + + std::vector CONetCDF4::getDimensionsIdList (const std::string * _varname) + { + int nDimNull = 0; + int nbdim = 0, *dimid = NULL; + int grpid = this->getCurrentGroup(); + int varid = (_varname != NULL) ? this->getVariable(*_varname) : NC_GLOBAL; + std::vector retvalue; + + if (_varname != NULL) + { + (CNetCdfInterface::inqVarNDims(grpid, varid, nbdim)); + dimid = new int[nbdim](); + (CNetCdfInterface::inqVarDimId(grpid, varid, dimid)); + } + else + { + (CNetCdfInterface::inqDimIds(grpid, nbdim, NULL, 1)); + dimid = new int[nbdim](); + (CNetCdfInterface::inqDimIds(grpid, nDimNull, dimid, 1)); + } + + for (int i = 0; i < nbdim; i++) + { + std::string dimname; + (CNetCdfInterface::inqDimName(grpid, dimid[i], dimname)); + retvalue.push_back(dimname); + } + delete [] dimid; + + return (retvalue); + } + + + //--------------------------------------------------------------- + + const CONetCDF4::CONetCDF4Path & CONetCDF4::getCurrentPath(void) const + { return (this->path); } + + void CONetCDF4::setCurrentPath(const CONetCDF4Path & path) + { this->path = path; } + + //--------------------------------------------------------------- + + int CONetCDF4::addGroup(const StdString & name) + { + int retvalue = 0; + int grpid = this->getCurrentGroup(); + (CNetCdfInterface::defGrp(grpid, name, retvalue)); + return (retvalue); + } + + //--------------------------------------------------------------- + + int CONetCDF4::addDimension(const StdString& name, const StdSize size) + { + int retvalue = 0; + int grpid = this->getCurrentGroup(); + if (size != UNLIMITED_DIM) + (CNetCdfInterface::defDim(grpid, name, size, retvalue)); + else + (CNetCdfInterface::defDim(grpid, name, NC_UNLIMITED, retvalue)); + return (retvalue); + } + + //--------------------------------------------------------------- + + int CONetCDF4::addVariable(const StdString & name, nc_type type, + const std::vector & dim) + { + int varid = 0; + std::vector dimids; + std::vector dimsizes ; + StdSize size ; + StdSize totalSize ; + StdSize maxSize=1024*1024*256 ; // == 2GB/8 if output double + + int grpid = this->getCurrentGroup(); + + std::vector::const_iterator + it = dim.begin(), end = dim.end(); + + for (;it != end; it++) + { + const StdString & dimid = *it; + dimids.push_back(this->getDimension(dimid)); + (CNetCdfInterface::inqDimLen(grpid, this->getDimension(dimid), size)); + if (size==NC_UNLIMITED) size=1 ; + dimsizes.push_back(size) ; + } + + (CNetCdfInterface::defVar(grpid, name, type, dimids.size(), &(dimids[0]), varid)); + +// set chunksize : size of one record +// but must not be > 2GB (netcdf or HDF5 problem) + totalSize=1 ; + for(vector::reverse_iterator it=dimsizes.rbegin(); it!=dimsizes.rend();++it) + { + totalSize*= *it ; + if (totalSize>=maxSize) *it=1 ; + } + + (CNetCdfInterface::defVarChunking(grpid, varid, NC_CHUNKED, &(dimsizes[0]))); + (CNetCdfInterface::defVarFill(grpid, varid, true, NULL)); + return (varid); + } + + //--------------------------------------------------------------- + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const StdString & value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAtt(grpid, varid, name, NC_CHAR, value.size(), value.c_str())); + //CheckError(nc_put_att_string(grpid, varid, name.c_str(), 1, &str)); + } + + //--------------------------------------------------------------- + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const double & value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, 1, &value)); + } + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const CArray& value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, value.numElements(), value.dataFirst())); + } + //--------------------------------------------------------------- + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const float & value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, 1, &value)); + } + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const CArray& value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, value.numElements(), value.dataFirst())); + } + + //--------------------------------------------------------------- + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const int & value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, 1, &value)); + } + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const CArray& value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, value.numElements(), value.dataFirst())); + } + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const short int & value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, 1, &value)); + } + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const CArray& value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, value.numElements(), value.dataFirst())); + } + + + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const long int & value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, 1, &value)); + } + + template <> + void CONetCDF4::addAttribute + (const StdString & name, const CArray& value, const StdString * varname ) + { + int grpid = this->getCurrentGroup(); + int varid = (varname == NULL) ? NC_GLOBAL : this->getVariable(*varname); + (CNetCdfInterface::putAttType(grpid, varid, name, value.numElements(), value.dataFirst())); + } + + + + //--------------------------------------------------------------- + + void CONetCDF4::getWriteDataInfos(const StdString & name, StdSize record, StdSize & array_size, + std::vector & sstart, + std::vector & scount, + const std::vector * start, + const std::vector * count) + { + std::vector sizes = this->getDimensions(name); + std::vector iddims = this->getDimensionsIdList (&name); + std::vector::const_iterator + it = sizes.begin(), end = sizes.end(); + int i = 0; + + if (iddims.begin()->compare(this->getUnlimitedDimensionName()) == 0) + { + sstart.push_back(record); + scount.push_back(1); + if ((start == NULL) && + (count == NULL)) i++; + it++; + } + + for (;it != end; it++) + { + if ((start != NULL) && (count != NULL)) + { + sstart.push_back((*start)[i]); + scount.push_back((*count)[i]); + array_size *= (*count)[i]; + i++; + } + else + { + sstart.push_back(0); + scount.push_back(sizes[i]); + array_size *= sizes[i]; + i++; + } + } + + } + + + + template <> + void CONetCDF4::writeData_(int grpid, int varid, + const std::vector & sstart, + const std::vector & scount, const double * data) + { + (CNetCdfInterface::putVaraType(grpid, varid, &(sstart[0]), &(scount[0]), data)); +// sync() ; + } + + //--------------------------------------------------------------- + + template <> + void CONetCDF4::writeData_(int grpid, int varid, + const std::vector & sstart, + const std::vector & scount, const int * data) + { + (CNetCdfInterface::putVaraType(grpid, varid, &(sstart[0]), &(scount[0]), data)); +// sync() ; + } + + //--------------------------------------------------------------- + + template <> + void CONetCDF4::writeData_(int grpid, int varid, + const std::vector & sstart, + const std::vector & scount, const float * data) + { + (CNetCdfInterface::putVaraType(grpid, varid, &(sstart[0]), &(scount[0]), data)); +// sync() ; + } + + //--------------------------------------------------------------- + + void CONetCDF4::writeData(const CArray& data, const StdString & name) + { + int grpid = this->getCurrentGroup(); + int varid = this->getVariable(name); + StdSize array_size = 1; + std::vector sstart, scount; + + this->getWriteDataInfos(name, 0, array_size, sstart, scount, NULL, NULL); + this->writeData_(grpid, varid, sstart, scount, data.dataFirst()); + } + + void CONetCDF4::writeTimeAxisData(const CArray& data, const StdString & name, + bool collective, StdSize record, bool isRoot) + { + int grpid = this->getCurrentGroup(); + int varid = this->getVariable(name); + + map::iterator it=timeAxis.find(varid) ; + if (it==timeAxis.end()) timeAxis[varid]=record ; + else + { + if (it->second >= record) return ; + else it->second =record ; + } + + StdSize array_size = 1; + std::vector sstart, scount; + + if (this->wmpi && collective) + (CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE)); + if (this->wmpi && !collective) + (CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT)); + + this->getWriteDataInfos(name, record, array_size, sstart, scount, NULL, NULL); + if (using_netcdf_internal) if (!isRoot) { sstart[0]=sstart[0]+1 ; scount[0]=0 ;} + this->writeData_(grpid, varid, sstart, scount, data.dataFirst()); + } + + //--------------------------------------------------------------- + + bool CONetCDF4::varExist(const StdString & varname) + { + int grpid = this->getCurrentGroup(); + return (CNetCdfInterface::isVarExisted(grpid, varname)); + } + + void CONetCDF4::sync(void) + { + (CNetCdfInterface::sync(this->ncidp)) ; + } + ///-------------------------------------------------------------- + } // namespace xios diff --git a/src/output/onetcdf4.hpp b/src/output/onetcdf4.hpp new file mode 100644 index 0000000..bd77e19 --- /dev/null +++ b/src/output/onetcdf4.hpp @@ -0,0 +1,125 @@ +#ifndef __XMLIO_INETCDF4__ +#define __XMLIO_INETCDF4__ + +/// xios headers /// +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "data_output.hpp" +#include "array_new.hpp" +#include "mpi.hpp" +#include "netcdf.hpp" + +#ifndef UNLIMITED_DIM + #define UNLIMITED_DIM (size_t)(-1) +#endif //UNLIMITED_DIM + +namespace xios +{ + /// ////////////////////// Déclarations ////////////////////// /// + class CONetCDF4 + : public virtual CDataOutput + { + public : + + /// Définition de type /// + typedef std::vector CONetCDF4Path; + + /// Constructeurs /// + CONetCDF4(const StdString & filename, bool exist, const MPI_Comm * comm = NULL, bool multifile=true); + + CONetCDF4(const CONetCDF4 & onetcdf4); // Not implemented. + CONetCDF4(const CONetCDF4 * const onetcdf4); // Not implemented. + + + /// Initialisation /// + void initialize(const StdString & filename, bool exist, const MPI_Comm * comm, bool multifile); + void close(void) ; + void sync(void) ; + void definition_start(void); + void definition_end(void); + + /// Mutateurs /// + void setCurrentPath(const CONetCDF4Path & path); + + int addGroup(const StdString & name); + int addDimension(const StdString& name, const StdSize size = UNLIMITED_DIM); + int addVariable(const StdString & name, nc_type type, + const std::vector & dim); + + //---------------------------------------------------------------- + public : + + template + void setDefaultValue(const StdString & varname, const T * value = NULL); + + template void addAttribute (const StdString & name, const T & value, const StdString * varname = NULL); + + /// Ecriture des données /// + template + void writeData(const CArray& data, const StdString & name, + bool collective, StdSize record, + const std::vector * start = NULL, + const std::vector * count = NULL); + + void writeData(const CArray& data, const StdString & name); + void writeTimeAxisData(const CArray& data, const StdString & name, + bool collective, StdSize record, bool Isroot) ; + /// Accesseur /// + const CONetCDF4Path & getCurrentPath(void) const; + + /// Destructeur /// + virtual ~CONetCDF4(void); + + //---------------------------------------------------------------- + + protected : + + /// Ecriture /// + virtual void writeField_ (CField* field) = 0; + virtual void writeDomain_(CDomain* domain) = 0; + virtual void writeAxis_ (CAxis* axis) = 0; + + /// Accesseurs /// + int getCurrentGroup(void); + int getGroup(const CONetCDF4Path & path); + int getVariable(const StdString & varname); + int getDimension(const StdString & dimname); + std::vector getDimensions (const StdString & varname); + std::vector getDimensionsIdList (const StdString * varname); + int getUnlimitedDimension(void); + StdString getUnlimitedDimensionName(void); + + bool varExist(const StdString & varname); + + //---------------------------------------------------------------- + + private : + + template + void writeData_(int grpid, int varid, + const std::vector & sstart, + const std::vector & scount, T * data); + + void getWriteDataInfos(const StdString & name, StdSize record, StdSize & array_size, + std::vector & sstart, + std::vector & scount, + const std::vector * start, + const std::vector * count); + + /// Vérification des erreurs NetCDF /// + void CheckError(int status); + + /// Propriétés privées /// + CONetCDF4Path path; + int ncidp; + bool wmpi; + map timeAxis ; + }; // class CONetCDF4 + + ///--------------------------------------------------------------- + + + +} // namespace xios + +#endif //__XMLIO_INETCDF4__ diff --git a/src/output/onetcdf4_decl.cpp b/src/output/onetcdf4_decl.cpp new file mode 100644 index 0000000..f9e8a54 --- /dev/null +++ b/src/output/onetcdf4_decl.cpp @@ -0,0 +1,17 @@ +#include "onetcdf4_impl.hpp" + +namespace xios +{ +# define macro(type,size) \ + template void CONetCDF4::writeData(const CArray& data, const StdString & name, \ + bool collective, StdSize record, \ + const std::vector * start, \ + const std::vector * count) ; + + macro(double,1) + macro(double,2) + macro(double,3) + + template void CONetCDF4::setDefaultValue(const StdString & varname, const double* value) ; + template void CONetCDF4::setDefaultValue(const StdString & varname, const float* value) ; +} diff --git a/src/output/onetcdf4_impl.hpp b/src/output/onetcdf4_impl.hpp new file mode 100644 index 0000000..1cff9fb --- /dev/null +++ b/src/output/onetcdf4_impl.hpp @@ -0,0 +1,60 @@ +#ifndef __ONETCDF4_IMPL_HPP__ +#define __ONETCDF4_IMPL_HPP__ + +#include "onetcdf4.hpp" +#include "netCdfInterface.hpp" + +namespace xios +{ + template + void CONetCDF4::writeData(const CArray& data, const StdString & name, + bool collective, StdSize record, + const std::vector * start, + const std::vector * count) + { + int grpid = this->getCurrentGroup(); + int varid = this->getVariable(name); + StdSize array_size = 1; + std::vector sstart, scount; + + if (this->wmpi && collective) + CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE); + if (this->wmpi && !collective) + CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT); + + this->getWriteDataInfos + (name, record, array_size, sstart, scount, start, count); + if (data.numElements() != array_size) + { + ERROR("CONetCDF4::writeData(...)", + << "[ input array size = " << data.numElements() + << ", intern array size = " << array_size + << " ] Invalid input data !" ); + } + + this->writeData_(grpid, varid, sstart, scount, data.dataFirst()); + } + +//---------------------------------------------------------------- + + template + void CONetCDF4::setDefaultValue(const StdString & varname, const T * value) + { + int grpid = this->getCurrentGroup(); + int varid = this->getVariable(varname); + + if (value != NULL) + { + CNetCdfInterface::defVarFill(grpid, varid, 0, (void*)value); + this->addAttribute(StdString("missing_value"), *value, &varname); + } + else CNetCdfInterface::defVarFill(grpid, varid, 1, NULL); + } + + ///--------------------------------------------------------------- + +} + + + +#endif diff --git a/src/parameters.cpp b/src/parameters.cpp new file mode 100644 index 0000000..3e52a5a --- /dev/null +++ b/src/parameters.cpp @@ -0,0 +1,6 @@ +namespace xmlioserver +{ + + + +} diff --git a/src/parse_expr/expr_node.cpp b/src/parse_expr/expr_node.cpp new file mode 100644 index 0000000..90c0b58 --- /dev/null +++ b/src/parse_expr/expr_node.cpp @@ -0,0 +1,65 @@ +#include "expr_node.hpp" +#include "field.hpp" + +namespace xios +{ + + CScalarNode* CScalarNode::newNode(CSimpleNodeExpr* simpleNode) + { + if (simpleNode->nodeType==CSimpleNodeExpr::scalarDouble) return new CScalarDouble(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::scalarVariable) return new CScalarVariable(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::opScalar) return new COperatorScalarNode(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::opScalarScalar) return new COperatorScalarScalarNode(simpleNode) ; + else + { + ERROR("CScalarNode* CScalarNode::allocateChild(CSimpleNodeExpr* simpleNode)",<<"Non coherent node") + return NULL; + } + }; + + + CFieldNode* CFieldNode::newNode(CSimpleNodeExpr* simpleNode) + { + if (simpleNode->nodeType==CSimpleNodeExpr::fieldInstant) return new CInstantFieldNode(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::fieldAverage) return new CAverageFieldNode(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::opFieldScalar) return new COperatorFieldScalarNode(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::opScalarField) return new COperatorScalarFieldNode(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::opFieldField) return new COperatorFieldFieldNode(simpleNode) ; + else if (simpleNode->nodeType==CSimpleNodeExpr::opField) return new COperatorFieldNode(simpleNode) ; + else + { + ERROR("CScalarNode* CScalarNode::allocateChild(CSimpleNodeExpr* simpleNode)",<<"Non coherent node") + return NULL; + } + }; + + void CInstantFieldNode::reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) + { + if (!reduced) + { + if (fieldId=="this") + { + field=thisField ; + array=thisField->getInstantData() ; + reduced=true ; + } + else + { + field=associatedInstantField[fieldId] ; + array=field->getInstantData() ; + reduced=true ; + } + } + } + + void CAverageFieldNode::reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) + { + if (!reduced) + { + field=associatedAverageField[fieldId] ; + array=field->getInstantData() ; + reduced=true ; + } + } + +} diff --git a/src/parse_expr/expr_node.hpp b/src/parse_expr/expr_node.hpp new file mode 100644 index 0000000..a6e5f2d --- /dev/null +++ b/src/parse_expr/expr_node.hpp @@ -0,0 +1,440 @@ +#ifndef __XIOS_EXPR_NODE_HPP__ +#define __XIOS_EXPR_NODE_HPP__ + +#include "variable.hpp" +#include "simple_node_expr.hpp" +#include "operator_expr.hpp" +#include "lex_parser.hpp" + +namespace xios +{ + class CField ; +/////////////////////////////////////// +// class CNodeExpr // +/////////////////////////////////////// + + class CNodeExpr + { + public: + CNodeExpr(void) : reduced(false) {}; + + bool reduced ; + bool isReduced(void) { return reduced ; } + virtual ~CNodeExpr() {} + } ; + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class CScalarNode // +/////////////////////////////////////// + + class CScalarNode : public CNodeExpr + { + public: + CScalarNode(void) : CNodeExpr() {} + static CScalarNode* newNode(CSimpleNodeExpr* simpleNode) ; + virtual void reduce(void)=0 ; + + double val ; + virtual ~CScalarNode() {} + } ; + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class CScalarDouble // +/////////////////////////////////////// + + class CScalarDouble : public CScalarNode + { + public : + + CScalarDouble(CSimpleNodeExpr* simpleNode) : CScalarNode() + { + strVal=simpleNode->id ; + } + + virtual void reduce(void) + { + if (!reduced) + { + CType tval ; + tval.fromString(strVal) ; + val=tval ; + reduced=true ; + } + } + + virtual ~CScalarDouble() {} + string strVal ; + } ; + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class CScalarVariable // +/////////////////////////////////////// + + + + class CScalarVariable : public CScalarNode + { + public : + CScalarVariable(CSimpleNodeExpr* simpleNode) : CScalarNode() + { + varId=simpleNode->id ; + } + + void reduce(void) + { + if (!reduced) + { + if (CVariable::has(varId)) + { + val=CVariable::get(varId)->getData() ; + reduced=true ; + } + else ERROR("void CScalarVariable::reduce(void)",<<" Variable "<id ; + child=newNode(simpleNode->children[0]) ; + } + + void reduce(void) + { + child->reduce() ; + op=operatorExpr.getOpScalar(opId) ; + if (child->isReduced()) + { + val=op(child->val) ; + reduced=true ; + } + } + + virtual ~COperatorScalarNode() { delete child; } + + CScalarNode* child ; + string opId ; + double (*op)(double) ; + } ; + +//////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////// +// class COperatorScalarScalarNode // +///////////////////////////////////////////// + + class COperatorScalarScalarNode : public CScalarNode + { + public : + COperatorScalarScalarNode(CSimpleNodeExpr* simpleNode) : CScalarNode() + { + opId=simpleNode->id ; + child1=newNode(simpleNode->children[0]) ; + child2=newNode(simpleNode->children[1]) ; + } + + void reduce(void) + { + child1->reduce() ; + child2->reduce() ; + op=operatorExpr.getOpScalarScalar(opId) ; + if (child1->isReduced() && child2->isReduced()) + { + op=operatorExpr.getOpScalarScalar(opId) ; + val=op(child1->val,child2->val) ; + reduced=true ; + } + } + + virtual ~COperatorScalarScalarNode() + { + delete child1 ; + delete child2 ; + } + + CScalarNode* child1 ; + CScalarNode* child2 ; + double (*op)(double,double) ; + string opId ; + } ; + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class CFieldNode // +/////////////////////////////////////// + + + class CFieldNode : public CNodeExpr + { + public: + CFieldNode(void) : CNodeExpr() {} + static CFieldNode* newNode(CSimpleNodeExpr* simpleNode) ; + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) =0 ; + virtual CArray compute(void)=0 ; + virtual void getFieldIds(set& fieldIds)=0 ; + virtual void getInstantFieldIds(set& fieldIds)=0 ; + virtual void getAverageFieldIds(set& fieldIds)=0 ; + virtual void getFields(set& fields)=0 ; + virtual void getInstantFields(set& fields)=0 ; + virtual void getAverageFields(set& fields)=0 ; + + virtual ~CFieldNode() {} + } ; + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class CInstantFieldNode // +/////////////////////////////////////// + + class CInstantFieldNode : public CFieldNode + { + public: + CInstantFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), fieldId(simpleNode->id) {} + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) ; + virtual CArray compute(void) { return CArray(*array);} + virtual ~CInstantFieldNode() { } + virtual void getFieldIds(set& fieldIds) { fieldIds.insert(fieldId) ;} + virtual void getInstantFieldIds(set& fieldIds) { fieldIds.insert(fieldId) ;} + virtual void getAverageFieldIds(set& fieldIds) { } + virtual void getFields(set& fields) { fields.insert(field) ;} + virtual void getInstantFields(set& fields) { fields.insert(field) ;} + virtual void getAverageFields(set& fields) { } + + string fieldId; + CField* field ; + CArray* array ; + }; + + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class CAverageFieldNode // +/////////////////////////////////////// + + + class CAverageFieldNode : public CFieldNode + { + public: + + CAverageFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), fieldId(simpleNode->id) {} + + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) ; + virtual CArray compute(void) { return CArray(*array); } + virtual void getFieldIds(set& fieldIds) { fieldIds.insert(fieldId) ;} + virtual void getInstantFieldIds(set& fieldIds) { } + virtual void getAverageFieldIds(set& fieldIds) { fieldIds.insert(fieldId) ;} + virtual void getFields(set& fields) { fields.insert(field) ;} + virtual void getInstantFields(set& fields) { } + virtual void getAverageFields(set& fields) { fields.insert(field) ;} + virtual ~CAverageFieldNode() {} + string fieldId; + CField* field ; + CArray* array ; + }; + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// class COperatorFieldNode // +/////////////////////////////////////// + + class COperatorFieldNode : public CFieldNode + { + public: + + COperatorFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), opId(simpleNode->id) + { + child=newNode(simpleNode->children[0]) ; + } + + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) + { + child->reduce(thisField, associatedInstantField, associatedAverageField) ; + op=operatorExpr.getOpField(opId) ; + reduced=true ; + } + + virtual void getFieldIds(set& fieldIds) {child-> getFieldIds(fieldIds);} + virtual void getInstantFieldIds(set& fieldIds) {child-> getInstantFieldIds(fieldIds) ;} + virtual void getAverageFieldIds(set& fieldIds) {child-> getAverageFieldIds(fieldIds) ;} + virtual void getFields(set& fields) { child-> getFields(fields) ;} + virtual void getInstantFields(set& fields) {child-> getInstantFields(fields) ; } + virtual void getAverageFields(set& fields) {child-> getAverageFields(fields) ; } + virtual CArray compute(void) + { + return op(child->compute()) ; + } + virtual ~COperatorFieldNode() { delete child; } + + CFieldNode* child ; + string opId ; + CArray (*op)( const CArray&) ; + }; + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// COperatorFieldFieldNode // +/////////////////////////////////////// + + + class COperatorFieldFieldNode : public CFieldNode + { + public: + + COperatorFieldFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(),opId(simpleNode->id) + { + child1=newNode(simpleNode->children[0]) ; + child2=newNode(simpleNode->children[1]) ; + } + + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) + { + child1->reduce(thisField, associatedInstantField, associatedAverageField) ; + child2->reduce(thisField, associatedInstantField, associatedAverageField) ; + op=operatorExpr.getOpFieldField(opId) ; + reduced=true ; + } + + virtual void getFieldIds(set& fieldIds) {child1-> getFieldIds(fieldIds); child2-> getFieldIds(fieldIds);} + virtual void getInstantFieldIds(set& fieldIds) {child1-> getInstantFieldIds(fieldIds); child2-> getInstantFieldIds(fieldIds);} + virtual void getAverageFieldIds(set& fieldIds) {child1-> getAverageFieldIds(fieldIds); child2-> getAverageFieldIds(fieldIds);} + virtual void getFields(set& fields) {child1-> getFields(fields); child2-> getFields(fields);} + virtual void getInstantFields(set& fields) {child1-> getInstantFields(fields); child2-> getInstantFields(fields);} + virtual void getAverageFields(set& fields) {child1-> getAverageFields(fields); child2-> getAverageFields(fields);} + + virtual CArray compute(void) + { + return op(child1->compute(),child2->compute()) ; + } + + virtual ~COperatorFieldFieldNode() { delete child1; delete child2 ; } + + CFieldNode* child1 ; + CFieldNode* child2 ; + string opId ; + CArray (*op)( const CArray&,const CArray&) ; + }; + + +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////// +// class COperatorScalarFieldNode // +//////////////////////////////////////////// + + class COperatorScalarFieldNode : public CFieldNode + { + public: + + COperatorScalarFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), opId(simpleNode->id) + { + child1=CScalarNode::newNode(simpleNode->children[0]) ; + child2=newNode(simpleNode->children[1]) ; + } + + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) + { + child1->reduce() ; + child2->reduce(thisField, associatedInstantField, associatedAverageField) ; + op=operatorExpr.getOpScalarField(opId) ; + reduced=true ; + } + + virtual void getFieldIds(set& fieldIds) {child2-> getFieldIds(fieldIds);} + virtual void getInstantFieldIds(set& fieldIds) {child2-> getInstantFieldIds(fieldIds);} + virtual void getAverageFieldIds(set& fieldIds) {child2-> getAverageFieldIds(fieldIds);} + virtual void getFields(set& fields) {child2-> getFields(fields);} + virtual void getInstantFields(set& fields) {child2-> getInstantFields(fields);} + virtual void getAverageFields(set& fields) {child2-> getAverageFields(fields);} + + virtual CArray compute(void) + { + return op(child1->val,child2->compute()) ; + } + + ~COperatorScalarFieldNode() { delete child1 ; delete child2 ; } + + CScalarNode* child1 ; + CFieldNode* child2 ; + string opId ; + CArray (*op)(double,const CArray&) ; + }; + + +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////// +// class COperatorFieldScalarNode // +/////////////////////////////////////////// + + class COperatorFieldScalarNode : public CFieldNode + { + public: + + COperatorFieldScalarNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), opId(simpleNode->id) + { + child1=newNode(simpleNode->children[0]) ; + child2=CScalarNode::newNode(simpleNode->children[1]) ; + } + + virtual void reduce(CField* thisField, map& associatedInstantField, map& associatedAverageField) + { + child1->reduce(thisField, associatedInstantField, associatedAverageField) ; + child2->reduce() ; + op=operatorExpr.getOpFieldScalar(opId) ; + reduced=true ; + } + + virtual CArray compute(void) + { + return op(child1->compute(),child2->val) ; + } + + virtual void getFieldIds(set& fieldIds) {child1-> getFieldIds(fieldIds);} + virtual void getInstantFieldIds(set& fieldIds) {child1-> getInstantFieldIds(fieldIds);} + virtual void getAverageFieldIds(set& fieldIds) {child1-> getAverageFieldIds(fieldIds);} + virtual void getFields(set& fields) {child1-> getFields(fields);} + virtual void getInstantFields(set& fields) {child1-> getInstantFields(fields);} + virtual void getAverageFields(set& fields) {child1-> getAverageFields(fields);} + + ~COperatorFieldScalarNode() {delete child1, delete child2; } + + CFieldNode* child1 ; + CScalarNode* child2 ; + string opId ; + CArray (*op)( const CArray&, double) ; + }; + +} + +#endif diff --git a/src/parse_expr/generate_lex_yacc.sh b/src/parse_expr/generate_lex_yacc.sh new file mode 100755 index 0000000..e3f04db --- /dev/null +++ b/src/parse_expr/generate_lex_yacc.sh @@ -0,0 +1,2 @@ +bison -d yacc_parser.yacc -o yacc_parser.cpp +flex -o lex_parser.cpp -f lex_parser.lex diff --git a/src/parse_expr/lex_parser.cpp b/src/parse_expr/lex_parser.cpp new file mode 100644 index 0000000..65fa922 --- /dev/null +++ b/src/parse_expr/lex_parser.cpp @@ -0,0 +1,2257 @@ +#line 2 "lex_parser.cpp" + +#line 4 "lex_parser.cpp" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#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. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +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 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +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; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* 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 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* 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". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* 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 = 0; /* 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 (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +#define yywrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +extern int yylineno; + +int yylineno = 1; + +extern char *yytext; +#define yytext_ptr yytext +static yyconst flex_int16_t yy_nxt[][128] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + + { + 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 5, 4, 4, 4, 6, 4, 4, 4, + 7, 8, 9, 10, 4, 11, 4, 12, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, + 4, 4, 4, 4, 14, 15, 15, 15, 15, 15, + + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 4, 4, 4, 16, 4, 4, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 4, 4, 4, 4, 4 + }, + + { + 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 5, 4, 4, 4, 6, 4, 4, 4, + + 7, 8, 9, 10, 4, 11, 4, 12, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, + 4, 4, 4, 4, 14, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 4, 4, 4, 16, 4, 4, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 4, 4, 4, 4, 4 + }, + + { + -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, + -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, + -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, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4 + }, + + { + 3, -5, -5, -5, -5, -5, -5, -5, -5, 18, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, 18, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, + -5, -5, -5, -5, -5, -5, -5, -5 + }, + + { + 3, -6, -6, -6, -6, -6, -6, -6, -6, -6, + -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, + + -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, + -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, + -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, + -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, + -6, -6, -6, -6, -6, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, -6, -6, -6, -6, -6, -6, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + + 19, 19, 19, -6, -6, -6, -6, -6 + }, + + { + 3, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, + -7, -7, -7, -7, -7, -7, -7, -7 + }, + + { + 3, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, + -8, -8, -8, -8, -8, -8, -8, -8 + }, + + { + 3, -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, -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, -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, -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, -9, -9, -9, -9, -9, + -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, + -9, -9, -9, -9, -9, -9, -9, -9 + + }, + + { + 3, -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, -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, -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, -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, -10, -10, -10, -10, -10, + -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, + -10, -10, -10, -10, -10, -10, -10, -10 + }, + + { + 3, -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, -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, -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, -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, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11 + }, + + { + 3, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12 + }, + + { + 3, -13, -13, -13, -13, -13, -13, -13, -13, -13, + + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, 20, -13, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, 22, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, 22, -13, -13, -13, -13, -13, -13, -13, -13, + + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13 + }, + + { + 3, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, -14, -14, -14, -14, -14, -14, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, -14, -14, -14, -14, -14 + }, + + { + 3, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, + -15, -15, -15, -15, -15, -15, -15, -15, 24, 24, + + 24, 24, 24, 24, 24, 24, 24, 24, -15, -15, + -15, -15, -15, -15, -15, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, -15, -15, -15, -15, 24, -15, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, -15, -15, -15, -15, -15 + }, + + { + 3, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + + -16, -16, -16, -16, -16, -16, -16, -16 + }, + + { + 3, -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, -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, -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, -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, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17 + }, + + { + 3, -18, -18, -18, -18, -18, -18, -18, -18, 18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, 18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -18 + }, + + { + 3, -19, -19, -19, -19, -19, -19, -19, -19, -19, + -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, + -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, + + -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, + -19, -19, -19, -19, -19, -19, -19, -19, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, -19, -19, + -19, -19, -19, -19, -19, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, -19, -19, -19, -19, 25, -19, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, -19, -19, -19, -19, -19 + + }, + + { + 3, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20, -20 + }, + + { + 3, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, 20, -21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, 22, + + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, 22, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, -21, -21, -21, -21, -21 + }, + + { + 3, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + + -22, -22, -22, 27, -22, 27, -22, -22, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, -22, -22, -22, -22, -22 + }, + + { + 3, -23, -23, -23, -23, -23, -23, -23, -23, -23, + + -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23, -23, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, -23, -23, + -23, -23, -23, -23, -23, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, -23, -23, -23, -23, 29, -23, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, -23, -23, -23, -23, -23 + }, + + { + 3, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, -24, -24, + -24, -24, -24, -24, -24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, -24, -24, -24, -24, 24, -24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, -24, -24, -24, -24, -24 + }, + + { + 3, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, -25, -25, -25, -25, -25, 25, 25, + + 25, 25, 25, 25, 25, 25, 25, 25, -25, -25, + -25, -25, -25, -25, -25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, -25, -25, -25, -25, 25, -25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, -25, -25, -25, -25, -25 + }, + + { + 3, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, 22, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, 22, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, + + -26, -26, -26, -26, -26, -26, -26, -26 + }, + + { + 3, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27, -27 + }, + + { + 3, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, -28, -28, + + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, -28, -28, -28, -28 + }, + + { + 3, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, + + -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29, -29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, -29, -29, + -29, -29, -29, -29, -29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, -29, -29, -29, -29, 29, -29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, -29, -29, -29, -29, -29 + + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (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 = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 14 +#define YY_END_OF_BUFFER 15 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[30] = + { 0, + 0, 0, 15, 14, 1, 14, 11, 12, 8, 6, + 7, 9, 2, 14, 5, 10, 13, 1, 4, 0, + 2, 0, 3, 5, 4, 2, 0, 2, 3 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +static yyconst yy_state_type yy_NUL_trans[30] = + { 0, + 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + } ; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* 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 "lex_parser.lex" +#line 3 "lex_parser.lex" + +extern "C" +{ + int yylex(void); +} +#undef YY_INPUT +#define YY_INPUT(b,r,s) readInputForLexer(b,&r,s) +#include + +int readInputForLexer( char *buffer, int *numBytesRead, int maxBytesToRead ) ; + + +#include "simple_node_expr.hpp" +#include "yacc_parser.hpp" + +#line 941 "lex_parser.cpp" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (void ); + +int yyget_debug (void ); + +void yyset_debug (int debug_flag ); + +YY_EXTRA_TYPE yyget_extra (void ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in (void ); + +void yyset_in (FILE * in_str ); + +FILE *yyget_out (void ); + +void yyset_out (FILE * out_str ); + +int yyget_leng (void ); + +char *yyget_text (void ); + +int yyget_lineno (void ); + +void yyset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#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 do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#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) \ + errno=0; \ + while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + }\ +\ + +#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 + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* 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 + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 29 "lex_parser.lex" + + +#line 1110 "lex_parser.cpp" + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#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 ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + 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: + while ( (yy_current_state = yy_nxt[yy_current_state][ YY_SC_TO_UI(*yy_cp) ]) > 0 ) + { + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + + ++yy_cp; + } + + yy_current_state = -yy_current_state; + +yy_find_action: + 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) + 1; + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 31 "lex_parser.lex" +{ /* We ignore white characters */ } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 33 "lex_parser.lex" +{ + yylval.str=new std::string(yytext); + return NUMBER ; + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 38 "lex_parser.lex" +{ + yylval.str=new std::string(yytext+1) ; + return AVERAGE ; + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 43 "lex_parser.lex" +{ + yylval.str=new std::string(yytext+1) ; + return VAR ; + } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 48 "lex_parser.lex" +{ + yylval.str=new std::string(yytext) ; + return ID ; + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 54 "lex_parser.lex" +return(PLUS); + YY_BREAK +case 7: +YY_RULE_SETUP +#line 55 "lex_parser.lex" +return(MINUS); + YY_BREAK +case 8: +YY_RULE_SETUP +#line 57 "lex_parser.lex" +return(TIMES); + YY_BREAK +case 9: +YY_RULE_SETUP +#line 58 "lex_parser.lex" +return(DIVIDE); + YY_BREAK +case 10: +YY_RULE_SETUP +#line 60 "lex_parser.lex" +return(POWER); + YY_BREAK +case 11: +YY_RULE_SETUP +#line 62 "lex_parser.lex" +return(LEFT_PARENTHESIS); + YY_BREAK +case 12: +YY_RULE_SETUP +#line 63 "lex_parser.lex" +return(RIGHT_PARENTHESIS); + YY_BREAK +case 13: +YY_RULE_SETUP +#line 65 "lex_parser.lex" +{ + return(END); + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 68 "lex_parser.lex" +ECHO; + YY_BREAK +#line 1265 "lex_parser.cpp" +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_LVALUE->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_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->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_LVALUE->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_LVALUE->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 (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->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_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->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_LVALUE->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_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* 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. */ + yyrealloc((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_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->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_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->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 (void) +{ + 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 ) + { + if ( *yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][YY_SC_TO_UI(*yy_cp)]; + } + else + yy_current_state = yy_NUL_trans[yy_current_state]; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + } + + 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 ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + yy_current_state = yy_NUL_trans[yy_current_state]; + yy_is_jam = (yy_current_state == 0); + + if ( ! yy_is_jam ) + { + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + } + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->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_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->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; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#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_LVALUE->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 ); + + /*FALLTHROUGH*/ + + 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 /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + 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_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = 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; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(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 *) yyalloc(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; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + 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( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + 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) yyalloc(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; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +{ + + return yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_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; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (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. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* 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 ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 68 "lex_parser.lex" diff --git a/src/parse_expr/lex_parser.hpp b/src/parse_expr/lex_parser.hpp new file mode 100644 index 0000000..a6cb25b --- /dev/null +++ b/src/parse_expr/lex_parser.hpp @@ -0,0 +1,10 @@ +#ifndef __XIOS_LEX_PARSER_HPP__ +#define __XIOS_LEX_PARSER_HPP__ + +#include +namespace xios +{ + CSimpleNodeExpr* parseExpr(const std::string& strExpr) ; +} + +#endif diff --git a/src/parse_expr/lex_parser.lex b/src/parse_expr/lex_parser.lex new file mode 100644 index 0000000..0a5278d --- /dev/null +++ b/src/parse_expr/lex_parser.lex @@ -0,0 +1,67 @@ +%option noyywrap +%{ + +extern "C" +{ + int yylex(void); +} +#undef YY_INPUT +#define YY_INPUT(b,r,s) readInputForLexer(b,&r,s) +#include + +int readInputForLexer( char *buffer, int *numBytesRead, int maxBytesToRead ) ; + + +#include "simple_node_expr.hpp" +#include "yacc_parser.hpp" + +%} + +white [ \t]+ + +digit [0-9] +integer {digit}+ +exponant [eE][+-]?{integer} +real {integer}("."{integer})?{exponant}? +id [a-zA-Z][a-zA-Z0-9_]* +average @{id} +var \${id} +%% + +{white} { /* We ignore white characters */ } + +{real} { + yylval.str=new std::string(yytext); + return NUMBER ; + } + +{average} { + yylval.str=new std::string(yytext+1) ; + return AVERAGE ; + } + +{var} { + yylval.str=new std::string(yytext+1) ; + return VAR ; + } + +{id} { + yylval.str=new std::string(yytext) ; + return ID ; + } + + +"+" return(PLUS); +"-" return(MINUS); + +"*" return(TIMES); +"/" return(DIVIDE); + +"^" return(POWER); + +"(" return(LEFT_PARENTHESIS); +")" return(RIGHT_PARENTHESIS); + +"\0" { + return(END); + } diff --git a/src/parse_expr/operator_expr.cpp b/src/parse_expr/operator_expr.cpp new file mode 100644 index 0000000..eacca55 --- /dev/null +++ b/src/parse_expr/operator_expr.cpp @@ -0,0 +1,6 @@ +#include "operator_expr.hpp" + +namespace xios +{ + COperatorExpr operatorExpr ; +} diff --git a/src/parse_expr/operator_expr.hpp b/src/parse_expr/operator_expr.hpp new file mode 100644 index 0000000..a8bd933 --- /dev/null +++ b/src/parse_expr/operator_expr.hpp @@ -0,0 +1,172 @@ +#ifndef __XIOS_OPERATOR_EXPR_HPP__ +#define __XIOS_OPERATOR_EXPR_HPP__ + +#include +#include +#include +#include "exception.hpp" +#include "array_new.hpp" + +using namespace std ; + +namespace xios +{ + class COperatorExpr + { + public: + typedef double (*functionScalar)(double) ; + typedef double (*functionScalarScalar)(double, double) ; + typedef CArray (*functionField)(const CArray&) ; + typedef CArray (*functionFieldField)(const CArray&, const CArray&) ; + typedef CArray (*functionFieldScalar)(const CArray&, double) ; + typedef CArray (*functionScalarField)(double, const CArray&) ; + + COperatorExpr(void) + { + opScalar[string("neg")]=neg_s ; + opScalar[string("cos")]=cos_s ; + opScalar[string("sin")]=sin_s ; + opScalar[string("tan")]=tan_s ; + opScalar[string("exp")]=exp_s ; + opScalar[string("log")]=log_s ; + opScalar[string("log10")]=log10_s ; + opScalar[string("sqrt")]=sqrt_s ; + + opScalarScalar[string("add")]=add_ss ; + opScalarScalar[string("minus")]=minus_ss ; + opScalarScalar[string("mult")]=mult_ss ; + opScalarScalar[string("div")]=div_ss ; + opScalarScalar[string("pow")]=pow_ss ; + + opField[string("neg")]=neg_f ; + opField[string("cos")]=cos_f ; + opField[string("sin")]=sin_f ; + opField[string("tan")]=tan_f ; + opField[string("exp")]=exp_f ; + opField[string("log")]=log_f ; + opField[string("log10")]=log10_f ; + opField[string("sqrt")]=sqrt_f ; + + opFieldField[string("add")]=add_ff ; + opFieldField[string("minus")]=minus_ff ; + opFieldField[string("mult")]=mult_ff ; + opFieldField[string("div")]=div_ff ; + opFieldField[string("pow")]=pow_ff ; + + opFieldScalar[string("add")]=add_fs ; + opFieldScalar[string("minus")]=minus_fs ; + opFieldScalar[string("mult")]=mult_fs ; + opFieldScalar[string("div")]=div_fs ; + opFieldScalar[string("pow")]=pow_fs ; + + opScalarField[string("add")]=add_sf ; + opScalarField[string("minus")]=minus_sf ; + opScalarField[string("mult")]=mult_sf ; + opScalarField[string("div")]=div_sf ; + } + + functionScalar getOpScalar(const string& id) + { + map::iterator it ; + it=opScalar.find(id) ; + if (it==opScalar.end()) ERROR("double (*)(double) COperatorExpr::getOpScalar(const string& id)",<<"unknown operator : "<second ; + } + + functionScalarScalar getOpScalarScalar(const string& id) + { + map::iterator it ; + it=opScalarScalar.find(id) ; + if (it==opScalarScalar.end()) ERROR("double (*)(double) COperatorExpr::getOpScalarScalar(const string& id)",<<"unknown operator : "<second ; + } + + functionField getOpField(const string& id) + { + map::iterator it ; + it=opField.find(id) ; + if (it==opField.end()) ERROR("functionField COperatorExpr::getOpField(const string& id)",<<"unknown operator : "<second ; + } + + functionFieldField getOpFieldField(const string& id) + { + map::iterator it ; + it=opFieldField.find(id) ; + if (it==opFieldField.end()) ERROR("dfunctionFieldField COperatorExpr::getOpFieldField(const string& id)",<<"unknown operator : "<second ; + } + + functionFieldScalar getOpFieldScalar(const string& id) + { + map::iterator it ; + it=opFieldScalar.find(id) ; + if (it==opFieldScalar.end()) ERROR("functionFieldScalar COperatorExpr::getOpFieldScalar(const string& id)",<<"unknown operator : "<second ; + } + + functionScalarField getOpScalarField(const string& id) + { + map::iterator it ; + it=opScalarField.find(id) ; + if (it==opScalarField.end()) ERROR("functionScalarField COperatorExpr::getOpFieldField(const string& id)",<<"unknown operator : "<second ; + } + + map opScalar ; + map opScalarScalar ; + map opField ; + map opFieldField ; + map opFieldScalar ; + map opScalarField ; + + static inline double neg_s(double x) {return -x;} + static inline double cos_s(double x) {return std::cos(x);} + static inline double sin_s(double x) {return std::sin(x);} + static inline double tan_s(double x) {return std::tan(x);} + static inline double exp_s(double x) {return std::exp(x);} + static inline double log_s(double x) {return std::log(x);} + static inline double log10_s(double x) {return std::log10(x);} + static inline double sqrt_s(double x) {return std::sqrt(x);} + + static inline double add_ss(double x, double y) {return x+y;} + static inline double minus_ss(double x, double y) {return x-y;} + static inline double mult_ss(double x, double y) {return x*y;} + static inline double div_ss(double x, double y) {return x/y;} + static inline double pow_ss(double x, double y) {return std::pow(x,y);} + + static inline CArray neg_f(const CArray& x) {return Array(-x);} + static inline CArray cos_f(const CArray& x) {return Array(cos(x));} + static inline CArray sin_f(const CArray& x) {return Array(sin(x));} + static inline CArray tan_f(const CArray& x) {return Array(tan(x));} + static inline CArray exp_f(const CArray& x) {return Array(exp(x));} + static inline CArray log_f(const CArray& x) {return Array(log(x));} + static inline CArray log10_f(const CArray& x) {return Array(log10(x));} + static inline CArray sqrt_f(const CArray& x) {return Array(sqrt(x));} + + static inline CArray add_ff(const CArray& x, const CArray& y) {return Array(x+y);} + static inline CArray minus_ff(const CArray& x, const CArray& y) {return Array(x-y);} + static inline CArray mult_ff(const CArray& x, const CArray& y) {return Array(x*y);} + static inline CArray div_ff(const CArray& x, const CArray& y) {return Array(x/y);} + static inline CArray pow_ff(const CArray& x, const CArray& y) {return Array(pow(x,y));} + + static inline CArray add_fs(const CArray& x, double y) {return Array(x+y);} + static inline CArray minus_fs(const CArray& x, double y) {return Array(x-y);} + static inline CArray mult_fs(const CArray& x, double y) {return Array(x*y);} + static inline CArray div_fs(const CArray& x, double y) {return Array(x/y);} + static inline CArray pow_fs(const CArray& x, double y) {return Array(pow(x,y));} + + static inline CArray add_sf(double x, const CArray& y) {return Array(x+y);} + static inline CArray minus_sf(double x, const CArray& y) {return Array(x-y);} + static inline CArray mult_sf(double x, const CArray& y) {return Array(x*y);} + static inline CArray div_sf(double x, const CArray& y) {return Array(x/y);} + + + } ; + + extern COperatorExpr operatorExpr ; + +} + +#endif + diff --git a/src/parse_expr/simple_node_expr.hpp b/src/parse_expr/simple_node_expr.hpp new file mode 100644 index 0000000..8635398 --- /dev/null +++ b/src/parse_expr/simple_node_expr.hpp @@ -0,0 +1,52 @@ +#ifndef __XIOS_SIMPLE_NODE_EXPR_HPP__ +#define __XIOS_SIMPLE_NODE_EXPR_HPP__ + +#include +#include + +class CSimpleNodeExpr +{ + public : + + enum ENodeType + { + scalarDouble, scalarVariable, opScalar, opScalarScalar, + fieldInstant, fieldAverage, opFieldScalar, opScalarField, opFieldField, opField + } ; + + CSimpleNodeExpr(ENodeType nodeType, const std::string* str) : nodeType(nodeType) + { + id=*str ; + } + + CSimpleNodeExpr(ENodeType nodeType, const char* str) : nodeType(nodeType) + { + id=std::string(str) ; + } + + void addChild(CSimpleNodeExpr* child) + { + children.push_back(child) ; + } + + std::string print(void) + { + if (nodeType==scalarDouble) return id ; + else if (nodeType==scalarVariable) return "$"+id ; + else if (nodeType==fieldInstant) return id ; + else if (nodeType==fieldAverage) return "@"+id ; + else if (nodeType==opScalar || nodeType==opField) return id+"("+children[0]->print()+")" ; + else return "("+children[0]->print()+id+children[1]->print()+")" ; + } + ~CSimpleNodeExpr() + { + for(std::vector::iterator it=children.begin();it!=children.end();++it) delete *it ; + } + + ENodeType nodeType ; + std::string id ; + + std::vector children ; +} ; + +#endif diff --git a/src/parse_expr/yacc_parser.cpp b/src/parse_expr/yacc_parser.cpp new file mode 100644 index 0000000..7a4310e --- /dev/null +++ b/src/parse_expr/yacc_parser.cpp @@ -0,0 +1,1878 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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.4.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 1 "yacc_parser.yacc" + +#include "simple_node_expr.hpp" +#include +#include +#include "exception.hpp" + +using namespace std ; +using namespace xios ; + +extern "C" +{ + int yyparse(void); + int yylex(void); + int yyerror(const char *s) ; +} + + CSimpleNodeExpr* parsed ; + std::string globalInputText; + int globalReadOffset=0; + + int readInputForLexer( char *buffer, int *numBytesRead, int maxBytesToRead ) + { + int numBytesToRead = maxBytesToRead; + int bytesRemaining = globalInputText.length()-globalReadOffset; + int i; + if ( numBytesToRead > bytesRemaining ) numBytesToRead = bytesRemaining; + for ( i = 0; i < numBytesToRead; i++ ) buffer[i] = globalInputText.c_str()[globalReadOffset+i]; + *numBytesRead = numBytesToRead; + globalReadOffset += numBytesToRead; + return 0; + } + + + +/* Line 189 of yacc.c */ +#line 108 "yacc_parser.cpp" + +/* 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 + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + NUMBER = 258, + VAR = 259, + ID = 260, + AVERAGE = 261, + PLUS = 262, + MINUS = 263, + TIMES = 264, + DIVIDE = 265, + POWER = 266, + LEFT_PARENTHESIS = 267, + RIGHT_PARENTHESIS = 268, + END = 269, + NEG = 270 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 36 "yacc_parser.yacc" + + std::string* str ; /* symbol table index */ + CSimpleNodeExpr* node ; + + + +/* Line 214 of yacc.c */ +#line 166 "yacc_parser.cpp" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 264 of yacc.c */ +#line 178 "yacc_parser.cpp" + +#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 /* 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 /* 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 yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#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 /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* 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 /* 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 /* 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_alloc; + YYSTYPE yyvs_alloc; +}; + +/* 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_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 16 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 134 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 16 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 4 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 32 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 68 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 270 + +#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, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 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 yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 8, 10, 12, 16, 20, 24, + 28, 31, 35, 39, 44, 46, 48, 52, 56, 60, + 64, 67, 71, 75, 79, 83, 87, 91, 95, 99, + 103, 107, 111 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 17, 0, -1, 14, -1, 19, 14, -1, 3, -1, + 4, -1, 18, 7, 18, -1, 18, 8, 18, -1, + 18, 9, 18, -1, 18, 10, 18, -1, 8, 18, + -1, 18, 11, 18, -1, 12, 18, 13, -1, 5, + 12, 18, 13, -1, 5, -1, 6, -1, 19, 7, + 19, -1, 19, 8, 19, -1, 19, 9, 19, -1, + 19, 10, 19, -1, 8, 19, -1, 19, 11, 19, + -1, 12, 19, 13, -1, 19, 7, 18, -1, 18, + 7, 19, -1, 19, 8, 18, -1, 18, 8, 19, + -1, 19, 9, 18, -1, 18, 9, 19, -1, 19, + 10, 18, -1, 18, 10, 19, -1, 19, 11, 18, + -1, 5, 12, 19, 13, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 58, 58, 59, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94 +}; +#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", "NUMBER", "VAR", "ID", "AVERAGE", "PLUS", + "MINUS", "TIMES", "DIVIDE", "POWER", "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", "END", "NEG", "$accept", "Line", "Expression", + "Field_expr", 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, 267, 268, 269, 270 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 16, 17, 17, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 2, 1, 1, 3, 3, 3, 3, + 2, 3, 3, 4, 1, 1, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 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 yytype_uint8 yydefact[] = +{ + 0, 4, 5, 14, 15, 0, 0, 2, 0, 0, + 0, 0, 10, 20, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 12, 22, 6, 24, 7, 26, 8, 28, 9, 30, + 0, 0, 0, 11, 23, 16, 25, 17, 27, 18, + 29, 19, 31, 21, 13, 32, 0, 10, 0, 0, + 0, 0, 0, 0, 6, 7, 8, 9 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 8, 9, 10 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -6 +static const yytype_int8 yypact[] = +{ + 55, -6, -6, -4, -6, -1, -1, -6, 9, 123, + 73, -1, 14, 20, 81, 88, -6, -1, -1, -1, + -1, 67, -1, -1, -1, -1, -1, -6, 95, 102, + -6, -6, 13, 19, 13, 19, 14, 20, 14, 20, + -2, 67, 67, 14, 13, 19, 13, 19, 14, 20, + 14, 20, 14, 20, -6, -6, 67, 14, 109, 67, + 67, 67, 67, 116, 24, 24, 14, 14 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -6, -6, -5, 21 +}; + +/* 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[] = +{ + 12, 14, 1, 2, 3, 4, 28, 5, 11, 16, + 56, 6, 32, 34, 36, 38, 43, 44, 46, 48, + 50, 52, 19, 20, 21, 21, 13, 15, 24, 25, + 26, 26, 29, 61, 62, 21, 57, 58, 33, 35, + 37, 39, 0, 45, 47, 49, 51, 53, 0, 0, + 0, 63, 0, 0, 64, 65, 66, 67, 1, 2, + 3, 4, 0, 5, 0, 0, 0, 6, 0, 7, + 1, 2, 40, 0, 0, 41, 0, 0, 0, 42, + 22, 23, 24, 25, 26, 0, 0, 27, 17, 18, + 19, 20, 21, 0, 30, 22, 23, 24, 25, 26, + 0, 31, 17, 18, 19, 20, 21, 0, 54, 22, + 23, 24, 25, 26, 0, 55, 59, 60, 61, 62, + 21, 0, 30, 59, 60, 61, 62, 21, 0, 54, + 17, 18, 19, 20, 21 +}; + +static const yytype_int8 yycheck[] = +{ + 5, 6, 3, 4, 5, 6, 11, 8, 12, 0, + 12, 12, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 9, 10, 11, 11, 5, 6, 9, 10, + 11, 11, 11, 9, 10, 11, 41, 42, 17, 18, + 19, 20, -1, 22, 23, 24, 25, 26, -1, -1, + -1, 56, -1, -1, 59, 60, 61, 62, 3, 4, + 5, 6, -1, 8, -1, -1, -1, 12, -1, 14, + 3, 4, 5, -1, -1, 8, -1, -1, -1, 12, + 7, 8, 9, 10, 11, -1, -1, 14, 7, 8, + 9, 10, 11, -1, 13, 7, 8, 9, 10, 11, + -1, 13, 7, 8, 9, 10, 11, -1, 13, 7, + 8, 9, 10, 11, -1, 13, 7, 8, 9, 10, + 11, -1, 13, 7, 8, 9, 10, 11, -1, 13, + 7, 8, 9, 10, 11 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 3, 4, 5, 6, 8, 12, 14, 17, 18, + 19, 12, 18, 19, 18, 19, 0, 7, 8, 9, + 10, 11, 7, 8, 9, 10, 11, 14, 18, 19, + 13, 13, 18, 19, 18, 19, 18, 19, 18, 19, + 5, 8, 12, 18, 18, 19, 18, 19, 18, 19, + 18, 19, 18, 19, 13, 13, 12, 18, 18, 7, + 8, 9, 10, 18, 18, 18, 18, 18 +}; + +#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 /* 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 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + 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++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (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 + + + +#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 */ + + +/*-----------------------------------------------. +| 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; + } +} + +/* 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 or yypush_parse. | +`-------------------------*/ + +#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; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + 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_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, 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)); + + if (yystate == YYFINAL) + YYACCEPT; + + 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. */ + + /* 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); + 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; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + 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 1455 of yacc.c */ +#line 58 "yacc_parser.yacc" + { ;} + break; + + case 3: + +/* Line 1455 of yacc.c */ +#line 59 "yacc_parser.yacc" + { parsed=(yyvsp[(1) - (2)].node) ;;} + break; + + case 4: + +/* Line 1455 of yacc.c */ +#line 63 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::scalarDouble,(yyvsp[(1) - (1)].str)); delete (yyvsp[(1) - (1)].str) ;} + break; + + case 5: + +/* Line 1455 of yacc.c */ +#line 64 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::scalarVariable,(yyvsp[(1) - (1)].str)) ; delete (yyvsp[(1) - (1)].str);} + break; + + case 6: + +/* Line 1455 of yacc.c */ +#line 65 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"add") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 66 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"minus") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 8: + +/* Line 1455 of yacc.c */ +#line 67 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"mult") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 9: + +/* Line 1455 of yacc.c */ +#line 68 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"div") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 10: + +/* Line 1455 of yacc.c */ +#line 69 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalar,"neg") ; (yyval.node)->addChild((yyvsp[(2) - (2)].node)); ;} + break; + + case 11: + +/* Line 1455 of yacc.c */ +#line 70 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"pow") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 12: + +/* Line 1455 of yacc.c */ +#line 71 "yacc_parser.yacc" + { (yyval.node)=(yyvsp[(2) - (3)].node) ; ;} + break; + + case 13: + +/* Line 1455 of yacc.c */ +#line 72 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalar,(yyvsp[(1) - (4)].str)) ; (yyval.node)->addChild((yyvsp[(3) - (4)].node)) ; delete (yyvsp[(1) - (4)].str) ;} + break; + + case 14: + +/* Line 1455 of yacc.c */ +#line 76 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::fieldInstant,(yyvsp[(1) - (1)].str)); delete (yyvsp[(1) - (1)].str);} + break; + + case 15: + +/* Line 1455 of yacc.c */ +#line 77 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::fieldAverage,(yyvsp[(1) - (1)].str)); delete (yyvsp[(1) - (1)].str);} + break; + + case 16: + +/* Line 1455 of yacc.c */ +#line 78 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"add") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 17: + +/* Line 1455 of yacc.c */ +#line 79 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"minus") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 18: + +/* Line 1455 of yacc.c */ +#line 80 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"mult") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 19: + +/* Line 1455 of yacc.c */ +#line 81 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"div") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 20: + +/* Line 1455 of yacc.c */ +#line 82 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opField,"neg") ; (yyval.node)->addChild((yyvsp[(2) - (2)].node));;} + break; + + case 21: + +/* Line 1455 of yacc.c */ +#line 83 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"pow") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 22: + +/* Line 1455 of yacc.c */ +#line 84 "yacc_parser.yacc" + { (yyval.node)=(yyvsp[(2) - (3)].node) ;;} + break; + + case 23: + +/* Line 1455 of yacc.c */ +#line 85 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"add") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 24: + +/* Line 1455 of yacc.c */ +#line 86 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"add") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 25: + +/* Line 1455 of yacc.c */ +#line 87 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"minus") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 26: + +/* Line 1455 of yacc.c */ +#line 88 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"minus") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 27: + +/* Line 1455 of yacc.c */ +#line 89 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"mult") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 28: + +/* Line 1455 of yacc.c */ +#line 90 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"mult") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 29: + +/* Line 1455 of yacc.c */ +#line 91 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"div") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 30: + +/* Line 1455 of yacc.c */ +#line 92 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"div") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 31: + +/* Line 1455 of yacc.c */ +#line 93 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"pow") ; (yyval.node)->addChild((yyvsp[(1) - (3)].node)) ; (yyval.node)->addChild((yyvsp[(3) - (3)].node)); ;} + break; + + case 32: + +/* Line 1455 of yacc.c */ +#line 94 "yacc_parser.yacc" + { (yyval.node)=new CSimpleNodeExpr(CSimpleNodeExpr::opField,(yyvsp[(1) - (4)].str)) ; (yyval.node)->addChild((yyvsp[(3) - (4)].node)) ; delete (yyvsp[(1) - (4)].str);} + break; + + + +/* Line 1455 of yacc.c */ +#line 1644 "yacc_parser.cpp" + 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 lookahead 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 lookahead 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); + } + + *++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; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (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 1675 of yacc.c */ +#line 96 "yacc_parser.yacc" + + +extern "C" +{ + int yyerror(const char *s) + { + ERROR("int yyerror(const char *s)", <<"Parsing error :"<. */ + +/* 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 { + NUMBER = 258, + VAR = 259, + ID = 260, + AVERAGE = 261, + PLUS = 262, + MINUS = 263, + TIMES = 264, + DIVIDE = 265, + POWER = 266, + LEFT_PARENTHESIS = 267, + RIGHT_PARENTHESIS = 268, + END = 269, + NEG = 270 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c */ +#line 36 "yacc_parser.yacc" + + std::string* str ; /* symbol table index */ + CSimpleNodeExpr* node ; + + + +/* Line 1676 of yacc.c */ +#line 74 "yacc_parser.hpp" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +extern YYSTYPE yylval; + + diff --git a/src/parse_expr/yacc_parser.yacc b/src/parse_expr/yacc_parser.yacc new file mode 100644 index 0000000..c485dae --- /dev/null +++ b/src/parse_expr/yacc_parser.yacc @@ -0,0 +1,117 @@ +%{ +#include "simple_node_expr.hpp" +#include +#include +#include "exception.hpp" + +using namespace std ; +using namespace xios ; + +extern "C" +{ + int yyparse(void); + int yylex(void); + int yyerror(const char *s) ; +} + + CSimpleNodeExpr* parsed ; + std::string globalInputText; + int globalReadOffset=0; + + int readInputForLexer( char *buffer, int *numBytesRead, int maxBytesToRead ) + { + int numBytesToRead = maxBytesToRead; + int bytesRemaining = globalInputText.length()-globalReadOffset; + int i; + if ( numBytesToRead > bytesRemaining ) numBytesToRead = bytesRemaining; + for ( i = 0; i < numBytesToRead; i++ ) buffer[i] = globalInputText.c_str()[globalReadOffset+i]; + *numBytesRead = numBytesToRead; + globalReadOffset += numBytesToRead; + return 0; + } + +%} + +%union +{ + std::string* str ; /* symbol table index */ + CSimpleNodeExpr* node ; +}; + +%token NUMBER +%token VAR ID AVERAGE +%token PLUS MINUS TIMES DIVIDE POWER +%token LEFT_PARENTHESIS RIGHT_PARENTHESIS +%token END + +%left PLUS MINUS +%left TIMES DIVIDE +%nonassoc NEG +%right POWER + +%type Line Expression Field_expr +%start Line +%% + + +Line: + END { } + | Field_expr END { parsed=$1 ;} + ; + +Expression: + NUMBER { $$=new CSimpleNodeExpr(CSimpleNodeExpr::scalarDouble,$1); delete $1 } + | VAR { $$=new CSimpleNodeExpr(CSimpleNodeExpr::scalarVariable,$1) ; delete $1} + | Expression PLUS Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"add") ; $$->addChild($1) ; $$->addChild($3); } + | Expression MINUS Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"minus") ; $$->addChild($1) ; $$->addChild($3); } + | Expression TIMES Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"mult") ; $$->addChild($1) ; $$->addChild($3); } + | Expression DIVIDE Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"div") ; $$->addChild($1) ; $$->addChild($3); } + | MINUS Expression %prec NEG { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalar,"neg") ; $$->addChild($2); } + | Expression POWER Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarScalar,"pow") ; $$->addChild($1) ; $$->addChild($3); } + | LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$=$2 ; } + | ID LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalar,$1) ; $$->addChild($3) ; delete $1 } + ; + +Field_expr: + ID { $$=new CSimpleNodeExpr(CSimpleNodeExpr::fieldInstant,$1); delete $1} + | AVERAGE { $$=new CSimpleNodeExpr(CSimpleNodeExpr::fieldAverage,$1); delete $1} + | Field_expr PLUS Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"add") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr MINUS Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"minus") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr TIMES Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"mult") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr DIVIDE Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"div") ; $$->addChild($1) ; $$->addChild($3); } + | MINUS Field_expr %prec NEG { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opField,"neg") ; $$->addChild($2);} + | Field_expr POWER Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldField,"pow") ; $$->addChild($1) ; $$->addChild($3); } + | LEFT_PARENTHESIS Field_expr RIGHT_PARENTHESIS { $$=$2 ;} + | Field_expr PLUS Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"add") ; $$->addChild($1) ; $$->addChild($3); } + | Expression PLUS Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"add") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr MINUS Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"minus") ; $$->addChild($1) ; $$->addChild($3); } + | Expression MINUS Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"minus") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr TIMES Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"mult") ; $$->addChild($1) ; $$->addChild($3); } + | Expression TIMES Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"mult") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr DIVIDE Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"div") ; $$->addChild($1) ; $$->addChild($3); } + | Expression DIVIDE Field_expr { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opScalarField,"div") ; $$->addChild($1) ; $$->addChild($3); } + | Field_expr POWER Expression { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opFieldScalar,"pow") ; $$->addChild($1) ; $$->addChild($3); } + | ID LEFT_PARENTHESIS Field_expr RIGHT_PARENTHESIS { $$=new CSimpleNodeExpr(CSimpleNodeExpr::opField,$1) ; $$->addChild($3) ; delete $1} + ; +%% + +extern "C" +{ + int yyerror(const char *s) + { + ERROR("int yyerror(const char *s)", <<"Parsing error :"< +#include +#include "mpi.hpp" +#include "tracer.hpp" +#include "timer.hpp" +#include "event_scheduler.hpp" + +namespace xios +{ + MPI_Comm CServer::intraComm ; + list CServer::interComm ; + bool CServer::isRoot ; + int CServer::rank = INVALID_RANK; + StdOFStream CServer::m_infoStream; + map CServer::contextList ; + bool CServer::finished=false ; + bool CServer::is_MPI_Initialized ; + CEventScheduler* CServer::eventScheduler ; + + void CServer::initialize(void) + { + int initialized ; + MPI_Initialized(&initialized) ; + if (initialized) is_MPI_Initialized=true ; + else is_MPI_Initialized=false ; + + // Not using OASIS + if (!CXios::usingOasis) + { + + if (!is_MPI_Initialized) + { + int argc=0; + char** argv=NULL; + MPI_Init(&argc,&argv) ; + } + CTimer::get("XIOS").resume() ; + + boost::hash hashString ; + + unsigned long hashServer=hashString(CXios::xiosCodeId) ; + unsigned long* hashAll ; + +// int rank ; + int size ; + int myColor ; + int i,c ; + MPI_Comm newComm ; + + MPI_Comm_size(CXios::globalComm,&size) ; + MPI_Comm_rank(CXios::globalComm,&rank); + hashAll=new unsigned long[size] ; + + MPI_Allgather(&hashServer,1,MPI_LONG,hashAll,1,MPI_LONG,CXios::globalComm) ; + + map colors ; + map leaders ; + map::iterator it ; + + for(i=0,c=0;ifirst!=hashServer) + { + clientLeader=it->second ; + int intraCommSize, intraCommRank ; + MPI_Comm_size(intraComm,&intraCommSize) ; + MPI_Comm_rank(intraComm,&intraCommRank) ; + info(50)<<"intercommCreate::server "<("oasis_codes_id") ; + + vector splitted ; + boost::split( splitted, codesId, boost::is_any_of(","), boost::token_compress_on ) ; + vector::iterator it ; + + MPI_Comm newComm ; + int globalRank ; + MPI_Comm_rank(CXios::globalComm,&globalRank); + + for(it=splitted.begin();it!=splitted.end();it++) + { + oasis_get_intercomm(newComm,*it) ; + if (rank==0) MPI_Send(&globalRank,1,MPI_INT,0,0,newComm) ; + MPI_Comm_remote_size(newComm,&size); + interComm.push_back(newComm) ; + } + oasis_enddef() ; + } + +// int rank; + MPI_Comm_rank(intraComm,&rank) ; + if (rank==0) isRoot=true; + else isRoot=false; + + eventScheduler = new CEventScheduler(intraComm) ; + } + + void CServer::finalize(void) + { + CTimer::get("XIOS").suspend() ; + + delete eventScheduler ; + + if (!is_MPI_Initialized) + { + if (CXios::usingOasis) oasis_finalize(); + else MPI_Finalize() ; + } + report(0)<<"Performance report : Time spent for XIOS : "<checkEvent() ; + } + CTimer::get("XIOS server").suspend() ; + } + + void CServer::listenFinalize(void) + { + list::iterator it; + int msg ; + int flag ; + + for(it=interComm.begin();it!=interComm.end();it++) + { + MPI_Status status ; + traceOff() ; + MPI_Iprobe(0,0,*it,&flag,&status) ; + traceOn() ; + if (flag==true) + { + MPI_Recv(&msg,1,MPI_INT,0,0,*it,&status) ; + info(20)<<" CServer : Receive client finalize"< recvContextId ; + map::iterator it ; + + CBufferIn buffer(buff,count) ; + string id ; + int clientLeader ; + int nbMessage ; + + buffer>>id>>nbMessage>>clientLeader ; + + it=recvContextId.find(id) ; + if (it==recvContextId.end()) + { + contextMessage msg={0,0} ; + pair::iterator,bool> ret ; + ret=recvContextId.insert(pair(id,msg)) ; + it=ret.first ; + } + it->second.nbRecv+=1 ; + it->second.leaderRank+=clientLeader ; + + if (it->second.nbRecv==nbMessage) + { + int size ; + MPI_Comm_size(intraComm,&size) ; + MPI_Request* requests= new MPI_Request[size-1] ; + MPI_Status* status= new MPI_Status[size-1] ; + + for(int i=1;isecond.leaderRank) ; + + recvContextId.erase(it) ; + delete [] requests ; + delete [] status ; + + } + } + + void CServer::listenRootContext(void) + { + + MPI_Status status ; + int flag ; + static void* buffer ; + static MPI_Request request ; + static bool recept=false ; + int rank ; + int count ; + const int root=0 ; + + if (recept==false) + { + traceOff() ; + MPI_Iprobe(root,2,intraComm, &flag, &status) ; + traceOn() ; + if (flag==true) + { + MPI_Get_count(&status,MPI_CHAR,&count) ; + buffer=new char[count] ; + MPI_Irecv(buffer,count,MPI_CHAR,root,2,intraComm,&request) ; + recept=true ; + } + } + else + { + MPI_Test(&request,&flag,&status) ; + if (flag==true) + { + MPI_Get_count(&status,MPI_CHAR,&count) ; + registerContext(buffer,count) ; + delete [] buffer ; + recept=false ; + } + } + } + + + + void CServer::registerContext(void* buff,int count, int leaderRank) + { + + string contextId; + CBufferIn buffer(buff,count) ; + + buffer>>contextId ; + MPI_Comm contextIntercomm ; + MPI_Intercomm_create(intraComm,0,CXios::globalComm,leaderRank,10+leaderRank,&contextIntercomm) ; + + info(20)<<"CServer : Register new Context : "<initServer(intraComm,contextIntercomm) ; + + } + + + void CServer::contextEventLoop(void) + { + bool finished ; + map::iterator it ; + for(it=contextList.begin();it!=contextList.end();it++) + { + finished=it->second->eventLoop() ; + if (finished) + { + contextList.erase(it) ; + break ; + } + } + + } + + //! Get rank of the current process + int CServer::getRank() + { + return rank; + } + + /*! + * \brief Open file stream to write in + * Opening a file stream with a specific file name suffix-server+rank + * \param [in] protype file name + */ + void CServer::openInfoStream(const StdString& fileName) + { + std::filebuf* fb = m_infoStream.rdbuf(); + StdStringStream fileNameServer; + int numDigit = 0; + int size = 0; + MPI_Comm_size(CXios::globalComm, &size); + while (size) + { + size /= 10; + ++numDigit; + } + + fileNameServer << fileName <<"_" << std::setfill('0') << std::setw(numDigit) << getRank() << ".out"; + fb->open(fileNameServer.str().c_str(), std::ios::out); + if (!fb->is_open()) + ERROR("void CServer::openInfoStream(const StdString& fileName)", + < file to write" ); + + info.write2File(fb); + report.write2File(fb); + } + + //! Open stream for standard output + void CServer::openInfoStream() + { + info.write2StdOut(); + report.write2StdOut(); + } + + //! Close opening stream + void CServer::closeInfoStream() + { + if (m_infoStream.is_open()) m_infoStream.close(); + } + +} diff --git a/src/server.hpp b/src/server.hpp new file mode 100644 index 0000000..73d351f --- /dev/null +++ b/src/server.hpp @@ -0,0 +1,61 @@ +#ifndef __SERVER_HPP__ +#define __SERVER_HPP__ + +#include "xmlioserver_spl.hpp" +#include "context.hpp" +#include "mpi.hpp" +#include "event_scheduler.hpp" + +namespace xios +{ + class CServer + { + public: + + static void initialize(void) ; + static void finalize(void) ; + static void eventLoop(void) ; + static void contextEventLoop(void) ; + static void listenContext(void) ; + static void listenFinalize(void) ; + static void recvContextMessage(void* buff,int count) ; + static void listenRootContext(void) ; + static void listenRootFinalize(void) ; + static void registerContext(void* buff,int count, int leaderRank=0) ; + + static MPI_Comm intraComm ; + static list interComm ; + static CEventScheduler* eventScheduler ; + + struct contextMessage + { + int nbRecv ; + int leaderRank ; + } ; + + static bool isRoot ; + + static map contextList ; + static bool finished ; + static bool is_MPI_Initialized ; + + public: + //! Get rank of the current process + static int getRank(); + + //! Print Information into a file + static void openInfoStream(const StdString& fileName); + + //! Print information to standard output + static void openInfoStream(); + + //! Close Info stream (closing file) + static void closeInfoStream(); + + private: + static StdOFStream m_infoStream; + static int rank ; + } ; +} + +#endif diff --git a/src/test/parse_xml.cpp b/src/test/parse_xml.cpp new file mode 100644 index 0000000..bf8f541 --- /dev/null +++ b/src/test/parse_xml.cpp @@ -0,0 +1,10 @@ +#include "cxios.hpp" + + +using namespace std ; +using namespace xios ; + +int main (int argc, char ** argv, char ** UNUSED (env)) +{ + CXios::initialize() ; +} diff --git a/src/test/test.cpp b/src/test/test.cpp new file mode 100644 index 0000000..0d46d60 --- /dev/null +++ b/src/test/test.cpp @@ -0,0 +1,155 @@ +#include +#include +#include + +#include +#include +#include "calendar_type.hpp" +#include "date.hpp" +#include "calendar_util.hpp" +//#include "test_enum.hpp" +#include "type.hpp" +//#include "axis.hpp" +//#include "field.hpp" +#include "declare_attribute.hpp" +#include "attribute_map.hpp" +#include "array_new.hpp" +#include "attribute_array.hpp" +#include "attribute_array_impl.hpp" + + + +using namespace std ; +using namespace boost::posix_time ; +using namespace boost::gregorian ; +using namespace xios; +using namespace blitz; + + class CEnum_color + { + public: + enum t_enum { rouge=0, vert, bleu} ; + static const char** getStr(void) { static const char * enumStr[] = { "rouge", "vert", "bleu" } ; return enumStr ; } + int getSize(void) { return 3 ; } + } ; + +#include "enum.hpp" +#include "enum_impl.hpp" +#include "enum_ref_impl.hpp" +#include "attribute_enum.hpp" +#include "attribute_enum_impl.hpp" + +template class CEnum ; +template class CAttributeEnum ; + + +int main(void) +{ +// ptime t(time_from_string("2012-02-30 15:24")) ; +// std::cout << to_simple_string(t) << std::endl; + CGregorianCalendar MyCalendar("2011-03-01 00:00") ; + cout< MyEnum ; + //MyEnum.val=CEnum::rouge ; + + CEnum_color::t_enum y; + + CType a(10) ; + CType b ; + + a=5 ; + b=10.5 ; + a=a+b ; + cout< c(a); + cout< xx("toto") ; +// test::totoatt toto ; +// test::titiatt titi ; +// CAxis A ; +// CTest A ; +// CAxis B ; +// CField A ; +// cout< color,color1 ; + color=CEnum::rouge ; + color1=color ; + + if (color1==CEnum::rouge) cout<<"Rouge !!"<::bleu ; + + if (color1==color) cout<<"Rouge !!"< toto("toto",CEnum_color::rouge) ; + CAttributeEnum titi("titi",CEnum_color::vert) ; + cout< A(2,2) ; + CArray B(2,2) ; + A=1,2,3,4 ; + B = 1 ; + B+=A ; + cout< C ; + CBufferOut out(B.size()) ; + + B.toBuffer(out) ; + + CBufferIn in(out.begin,B.size()) ; + C.fromBuffer(in) ; + + cout< attr("toto") ; + attr.resize(2,2) ; + attr=C ; + cout<<"attr "<=0) + j2=MAX(j1-ncell_x+1,1) + j=(j1+j2)/2 + n=NINT(COS(Pi/2-(j-0.5)*PI/nlat)*nlon) + np = MIN(n/ncell_x,rank+1) ; + if (j2==1) np=rank+1 + + PRINT *,"domain ",j2,j1,rank,np ; + DO j=j2,j1 + n=NINT(COS(Pi/2-(j-0.5)*PI/nlat)*nlon) + IF (n<8) n=8 + DO i=1,n + ind=list_ind(i,j) + IF ( (i-1) < MOD(n,np)*(n/np+1)) THEN + i_index_glo(ind) = rank - (i-1)/(n/np+1) + ELSE + i_index_glo(ind) = rank-(MOD(n,np)+ (i-1-MOD(n,np)*(n/np+1))/(n/np)) + ENDIF + ENDDO + ENDDO + rank=rank-np + j1=j2-1 + ENDDO + + rank=(mpi_size-1)/2+1 + ncell_x=sqrt(ncell_glo*1./mpi_size) + + j1=nlat/2+1 + DO WHILE(rank<=mpi_size-1) + j2=MIN(j1+ncell_x-1,nlat) + j=(j1+j2)/2 + n=NINT(COS(Pi/2-(j-0.5)*PI/nlat)*nlon) + np = MIN(n/ncell_x,mpi_size-rank) ; + if (j2==nlat) np=mpi_size-rank + + PRINT *,"domain ",j2,j1,rank,np ; + DO j=j1,j2 + n=NINT(COS(Pi/2-(j-0.5)*PI/nlat)*nlon) + IF (n<8) n=8 + DO i=1,n + ind=list_ind(i,j) + IF ( (i-1) < MOD(n,np)*(n/np+1)) THEN + i_index_glo(ind) = rank + (i-1)/(n/np+1) + ELSE + i_index_glo(ind) = rank+(MOD(n,np)+ (i-1-MOD(n,np)*(n/np+1))/(n/np)) + ENDIF + ENDDO + ENDDO + rank=rank+np + j1=j2+1 + ENDDO + + ncell=0 + DO ind=1,ncell_glo + IF (i_index_glo(ind)==mpi_rank) ncell=ncell+1 + ENDDO + ALLOCATE(i_index(ncell)) + ALLOCATE(lon(ncell)) + ALLOCATE(lat(ncell)) + ALLOCATE(bounds_lon(4,ncell)) + ALLOCATE(bounds_lat(4,ncell)) + ALLOCATE(field_A_srf(ncell,llm)) + ALLOCATE(mask(ncell)) + ncell=0 + data_n_index=0 + DO ind=1,ncell_glo + IF (i_index_glo(ind)==mpi_rank) THEN + ncell=ncell+1 + i_index(ncell)=ind-1 + lon(ncell)=lon_glo(ind) + lat(ncell)=lat_glo(ind) + bounds_lon(:,ncell)=bounds_lon_glo(:,ind) + bounds_lat(:,ncell)=bounds_lat_glo(:,ind) + field_A_srf(ncell,:)=i_index_glo(ind) + IF (MOD(ind,8)>=0 .AND. MOD(ind,8)<2) THEN + mask(ncell)=.FALSE. + ELSE + mask(ncell)=.TRUE. + data_n_index=data_n_index+1 + ENDIF + ENDIF + ENDDO + + ALLOCATE(field_A_compressed(data_n_index,llm)) + ALLOCATE(data_i_index(data_n_index)) + data_n_index=0 + DO ind=1,ncell + IF (mask(ind)) THEN + data_n_index=data_n_index+1 + data_i_index(data_n_index)=ind + field_A_compressed(data_n_index,:)=field_A_srf(ind,:) + ENDIF + ENDDO + + + + CALL xios_context_initialize("surface",comm) + CALL xios_get_handle("surface",ctx_hdl) + CALL xios_set_current_context(ctx_hdl) + + CALL xios_set_axis_attr("axis_srf",size=llm ,value=lval) ; + CALL xios_set_domain_attr("domain_srf",ni_glo=ncell_glo, ni=ncell, ibegin=1, i_index=RESHAPE(i_index,(/ncell,1/) )) + CALL xios_set_domain_attr("domain_srf",data_dim=1, data_ni=data_n_index, data_n_index=data_n_index, data_i_index=data_i_index, type='unstructured') + CALL xios_set_domain_attr("domain_srf",lonvalue=lon,latvalue=lat) + CALL xios_set_domain_attr("domain_srf", nvertex=4, bounds_lon=bounds_lon, bounds_lat=bounds_lat ) + + + dtime%second=3600 + CALL xios_set_timestep(dtime) + CALL xios_close_context_definition() + + DO ts=1,24*10 + CALL xios_update_calendar(ts) + CALL xios_send_field("field_A_srf",field_A_compressed) + ENDDO + + CALL xios_context_finalize() + CALL xios_finalize() + + END PROGRAM test_unstruct_complete + + + + + diff --git a/src/test/test_xios.cpp b/src/test/test_xios.cpp new file mode 100644 index 0000000..2be1574 --- /dev/null +++ b/src/test/test_xios.cpp @@ -0,0 +1,118 @@ +#include "xmlioserver.hpp" +#include "attribute_template.hpp" +#include "buffer_out.hpp" +#include "buffer_in.hpp" +#include "type.hpp" +#include "cxios.hpp" +#include "client.hpp" +#include "event_client.hpp" +#include "context.hpp" +#include "context_client.hpp" +#include "context_server.hpp" +#include "object_template.hpp" +#include "array_new.hpp" +#include "mpi.hpp" + + +using namespace std ; + +int main (int argc, char ** argv, char ** UNUSED (env)) +{ + + int a=3 ; + int b=2 ; + int c=1 ; + int buff[100] ; + string str("titi") ; + CBufferOut bufferOut(&buff,sizeof(buff)) ; + CBufferIn bufferIn(&buff,sizeof(buff)) ; + CMessage msg ; + + CAttributeArray tabIn("in") ; + CAttributeArray tabOut("out") ; + + CArray tab(5) + tab=0,1,2,3,4 ; + tabIn=tab ; + tab= 4,3,2,1,0 + tabOut=tab ; +// tabOut=1 ; + tabIn.toBuffer(bufferOut) ; + tabOut.fromBuffer(bufferIn) ; + + cout<<"attribut>="<=0 && rank<=1) + { + CXios::initClientSide("test1") ; + CClient::registerContext("toto",CClient::intraComm) ; +// CClient::registerContext("tata",CClient::intraComm) ; + CClient::registerContext("tutu",CClient::intraComm) ; + CContext::setCurrent("tutu") ; + CContext* tutu=CContext::get("tutu").get() ; + + + CContext::setCurrent("toto") ; + CContext* toto=(CContext::get("toto").get() ; + toto->calendar_type.setValue("NoLeap") ; + toto->sendAttributToServer("calendar_type" ); + + + for(int i=0;i<0;i++) + { + CMessage msg ; + int count ; + int msgSize; + CEventClient event(1,1) ; + count=rand()%32 ; + msg<client->sendEvent(event) ; + cout<<"Send Event from toto : size "<client->finalize() ; + tutu->client->finalize() ; + CXios::clientFinalize() ; + } + else if (rank>=2 && rank<=3) CXios::initServerSide(); + else if (rank>=4 && rank<=6) + { + CXios::initClientSide("test2") ; + CClient::registerContext("tito",CClient::intraComm) ; + CContext::setCurrent("tito") ; + CContext* tito=CContext::get("tito").get() ; + + CClient::registerContext("tete",CClient::intraComm) ; + CContext::setCurrent("tete") ; + CContext* tete=CContext::get("tete").get() ; + + tito->client->finalize() ; + tete->client->finalize() ; + CXios::clientFinalize() ; + } + else if (rank>=7 && rank<=7) + { + CXios::initClientSide("test3") ; + CClient::registerContext("turlututu",CClient::intraComm) ; + CContext::setCurrent("turlututu") ; + CContext* turlututu=CContext::get("turlututu").get() ; + turlututu->client->finalize() ; + CXios::clientFinalize() ; + } + + + + MPI_Barrier(MPI_COMM_WORLD); + MPI_Finalize() ; + + return EXIT_SUCCESS ; + +} diff --git a/src/test/test_xios_interface.f90 b/src/test/test_xios_interface.f90 new file mode 100644 index 0000000..60d5735 --- /dev/null +++ b/src/test/test_xios_interface.f90 @@ -0,0 +1,358 @@ +PROGRAM test_xios_interface + + ! This test is based on test_complete + USE xios + USE mod_wait + IMPLICIT NONE + INCLUDE "mpif.h" + INTEGER :: rank + INTEGER :: size_loc + INTEGER :: ierr + + CHARACTER(len=*),PARAMETER :: id="client" + INTEGER :: comm + TYPE(xios_time) :: dtime + TYPE(xios_context) :: ctx_hdl + INTEGER,PARAMETER :: ni_glo=100 + INTEGER,PARAMETER :: nj_glo=100 + INTEGER,PARAMETER :: llm=5 + DOUBLE PRECISION :: lval(llm)=1 + TYPE(xios_field) :: field_hdl + TYPE(xios_fieldgroup) :: fieldgroup_hdl + TYPE(xios_file) :: file_hdl + LOGICAL :: ok + CHARACTER(len=256) :: crname + + DOUBLE PRECISION,DIMENSION(ni_glo,nj_glo) :: lon_glo,lat_glo + DOUBLE PRECISION :: field_A_glo(ni_glo,nj_glo,llm) + DOUBLE PRECISION,ALLOCATABLE :: lon(:,:),lat(:,:),field_A_atm(:,:,:), field_A_srf(:,:), lonvalue(:) + INTEGER, ALLOCATABLE :: kindex(:) + INTEGER :: ni,ibegin,iend,nj,jbegin,jend + INTEGER :: i,j,l,ts,n, nb_pt + + INTEGER :: var_val_int + REAL :: var_val_float + DOUBLE PRECISION :: var_val_double + LOGICAL :: var_val_bool + CHARACTER(len=256) :: var_val_char ="" + CHARACTER(len=256) :: var_id + +!!! MPI Initialization + + CALL MPI_INIT(ierr) + + CALL init_wait + +!!! XIOS Initialization (get the local communicator) + + CALL xios_initialize(id,return_comm=comm) + + CALL MPI_COMM_RANK(comm,rank,ierr) + CALL MPI_COMM_SIZE(comm,size_loc,ierr) + +!------------------------------------------------------------------------------- +! +! Define all neccessary values for test +! +!------------------------------------------------------------------------------- +!########################################################################### +! Contexte ATM +!########################################################################### + +!!! Initialisation des coordonnées globales et locales pour la grille régulière + + DO j=1,nj_glo + DO i=1,ni_glo + lon_glo(i,j)=(i-1)+(j-1)*ni_glo + lat_glo(i,j)=1000+(i-1)+(j-1)*ni_glo + DO l=1,llm + field_A_glo(i,j,l)=(i-1)+(j-1)*ni_glo+10000*l + ENDDO + ENDDO + ENDDO + ni=ni_glo ; ibegin=1 + + jbegin=1 + DO n=0,size_loc-1 + nj=nj_glo/size_loc + IF (n + class CEnum : public CEnumType + { + public : +// typedef CEnum::t_enum myEnum; + } ; +} + diff --git a/src/timer.cpp b/src/timer.cpp new file mode 100644 index 0000000..80d3ddf --- /dev/null +++ b/src/timer.cpp @@ -0,0 +1,61 @@ +#include "timer.hpp" +#include "mpi.hpp" +#include +#include +#include "tracer.hpp" + +namespace xios +{ + using namespace std; + + map CTimer::allTimer ; + + CTimer::CTimer(const string& name_) : name(name_) + { + reset() ; + } + + double CTimer::getTime(void) + { + return MPI_Wtime(); + } + + void CTimer::suspend(void) + { + if (!suspended) + { + traceEnd(name) ; + cumulatedTime+=getTime()-lastTime ; + } + suspended=true ; + } + + void CTimer::resume(void) + { + if (suspended) + { + lastTime=getTime() ; + traceBegin(name) ; + } + suspended=false ; + } + + void CTimer::reset(void) + { + cumulatedTime=0. ; + suspended=true ; + } + + double CTimer::getCumulatedTime(void) + { + return cumulatedTime ; + } + + CTimer& CTimer::get(const string name) + { + map::iterator it ; + it=allTimer.find(name) ; + if (it==allTimer.end()) it=allTimer.insert(pair(name,new CTimer(name))).first ; + return *(it->second) ; + } +} diff --git a/src/timer.hpp b/src/timer.hpp new file mode 100644 index 0000000..b59d20d --- /dev/null +++ b/src/timer.hpp @@ -0,0 +1,35 @@ +#ifndef __TIMER_HPP__ +#define __TIMER_HPP__ + +#include +#include + +namespace xios +{ + using namespace std ; + + + class CTimer + { + public : + + double cumulatedTime ; + double lastTime ; + bool suspended ; + string name ; + + CTimer(const string& name) ; + void suspend(void) ; + void resume(void) ; + void reset(void) ; + double getCumulatedTime(void) ; + static map allTimer ; + static double getTime(void) ; + static CTimer& get(string name) ; + } ; + +} + + + +#endif diff --git a/src/tracer.cpp b/src/tracer.cpp new file mode 100644 index 0000000..fbc5489 --- /dev/null +++ b/src/tracer.cpp @@ -0,0 +1,42 @@ +#include "tracer.hpp" +#ifdef VTRACE +#include +#endif +#include + +namespace xios +{ + using namespace std ; + + void traceOn(void) + { +#ifdef VTRACE + VT_ON() ; +#endif + } + + void traceOff(void) + { +#ifdef VTRACE + VT_OFF() ; +#endif + } + + void traceBegin(const string& name) + { +#ifdef VTRACE + VT_USER_START(name.c_str()) ; +#endif + } + + void traceEnd(const string& name) + { +#ifdef VTRACE + VT_USER_END(name.c_str()) ; +#endif + } + +// void marker(const string& name,const string& text) ; + + +} diff --git a/src/tracer.hpp b/src/tracer.hpp new file mode 100644 index 0000000..b96f338 --- /dev/null +++ b/src/tracer.hpp @@ -0,0 +1,22 @@ +#ifndef __TRACER_HPP__ +#define __TRACER_HPP__ + +#include + +namespace xios +{ + using namespace std ; + + void traceOn(void) ; + void traceOff(void) ; + + void traceBegin(const string& name) ; + void traceEnd(const string& name) ; + + void marker(const string& name,const string& text) ; + +} + + + +#endif diff --git a/src/type/base_type.hpp b/src/type/base_type.hpp new file mode 100644 index 0000000..e25f7e1 --- /dev/null +++ b/src/type/base_type.hpp @@ -0,0 +1,30 @@ +#ifndef __BASE_TYPE_HPP__ +#define __BASE_TYPE_HPP__ + +#include "xmlioserver_spl.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" + +namespace xios +{ + + class CBaseType + { + public: + + CBaseType(void) {} + virtual ~CBaseType() {} + virtual void fromString(const string& str) =0 ; + virtual string toString(void) const =0; + + virtual bool fromBuffer(CBufferIn& buffer) =0; + virtual bool toBuffer(CBufferOut& buffer) const =0; + virtual CBaseType* clone(void) const =0; + virtual size_t size(void) const =0; + virtual bool isEmpty(void) const =0; + virtual void reset(void) =0; + } ; + +} + +#endif diff --git a/src/type/enum.hpp b/src/type/enum.hpp new file mode 100644 index 0000000..3a39243 --- /dev/null +++ b/src/type/enum.hpp @@ -0,0 +1,154 @@ +#ifndef __XIOS_ENUM__ +#define __XIOS_ENUM__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "base_type.hpp" +#include "message.hpp" + +#define __INLINE__ inline + + +namespace xios +{ + class CEnumBase + { + } ; + + template class CEnum_ref ; + + template + class CEnum : public virtual CBaseType, public T + { + public: + typedef typename T::t_enum T_enum ; + CEnum(void) ; + __INLINE__ CEnum(const T_enum& val) ; + __INLINE__ CEnum(const CEnum& type) ; + __INLINE__ CEnum(const CEnum_ref& type) ; + virtual ~CEnum() { _reset() ; } + + __INLINE__ T_enum& get(void) ; + __INLINE__ const T_enum& get(void) const; + + __INLINE__ void set(const T_enum& val) ; + __INLINE__ void set(const CEnum& val) ; + __INLINE__ void set(const CEnum_ref& val) ; + __INLINE__ CEnum& operator = (const T_enum& val) ; + __INLINE__ CEnum& operator = (const CEnum& val) ; + __INLINE__ CEnum& operator = (const CEnum_ref& val) ; + __INLINE__ operator T_enum&() ; + + inline virtual CBaseType* clone(void) const { return _clone(); } + virtual void fromString(const string& str) { _fromString(str); } + virtual string toString(void) const { return _toString(); } + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer) ; } + virtual bool toBuffer(CBufferOut& buffer) const { return _toBuffer(buffer); } + virtual void reset(void) { _reset(); } + virtual bool isEmpty() const { return _isEmpty(); } + virtual size_t size(void) const { return _size(); } + + __INLINE__ void allocate(void) ; + __INLINE__ void checkEmpty(void) const; + + T_enum* ptrValue ; + bool empty ; + + friend class CEnum_ref ; + + private : + + __INLINE__ CEnum* _clone(void) const; + __INLINE__ void _fromString(const string& str) ; + __INLINE__ string _toString(void) const; + __INLINE__ bool _fromBuffer(CBufferIn& buffer) ; + __INLINE__ bool _toBuffer(CBufferOut& buffer) const; + __INLINE__ void _reset(void) ; + __INLINE__ bool _isEmpty() const ; + __INLINE__ size_t _size(void) const ; + + } ; + + + + template + class CEnum_ref : public virtual CBaseType, public T + { + public: + + typedef typename T::t_enum T_enum ; + __INLINE__ CEnum_ref(void) ; + __INLINE__ CEnum_ref(T_enum& val) ; + __INLINE__ CEnum_ref(CEnum& type) ; + __INLINE__ CEnum_ref(const CEnum_ref& type) ; + virtual ~CEnum_ref() {}; + + __INLINE__ T_enum& get(void) const; + + __INLINE__ void set(const T_enum& val) const ; + __INLINE__ void set(const CEnum& val) const ; + __INLINE__ void set(const CEnum_ref& val) const ; + + __INLINE__ void set_ref(T_enum& val) ; + __INLINE__ void set_ref(CEnum& val) ; + __INLINE__ void set_ref(const CEnum_ref& val) ; + + __INLINE__ const CEnum_ref& operator = (T_enum& val) const ; + __INLINE__ const CEnum_ref& operator = (CEnum& val) const ; + __INLINE__ const CEnum_ref& operator = (const CEnum_ref& val) const; + __INLINE__ operator T_enum&() const; + bool operator == (const CEnum_ref &other) {return this->get()==other.get() ;} + + inline virtual CBaseType* clone(void) const { return _clone(); } + virtual void fromString(const string& str) { _fromString(str); } + virtual void fromString(const string& str) const { _fromString(str); } + virtual string toString(void) const { return _toString(); } + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer) ; } + virtual bool fromBuffer(CBufferIn& buffer) const { return _fromBuffer(buffer); } + virtual bool toBuffer(CBufferOut& buffer) const { return _toBuffer(buffer); } + virtual void reset(void) { _reset(); } + virtual bool isEmpty() const { return _isEmpty(); } + virtual size_t size(void) const { return _size(); } + + __INLINE__ void checkEmpty(void) const; + + + T_enum mutable * ptrValue ; + bool empty ; + friend class CEnum ; + + private : + + __INLINE__ CEnum_ref* _clone(void) const; + __INLINE__ void _fromString(const string& str) ; + __INLINE__ void _fromString(const string& str) const; + __INLINE__ string _toString(void) const; + __INLINE__ bool _fromBuffer(CBufferIn& buffer) ; + __INLINE__ bool _fromBuffer(CBufferIn& buffer) const ; + __INLINE__ bool _toBuffer(CBufferOut& buffer) const; + __INLINE__ void _reset(void) ; + __INLINE__ bool _isEmpty() const ; + __INLINE__ size_t _size(void) const ; + } ; + + template __INLINE__ CBufferOut& operator<<(CBufferOut& buffer, const CEnum& type) ; + template __INLINE__ CBufferOut& operator<<(CBufferOut& buffer, const typename T::t_enum & type) ; + template __INLINE__ CBufferIn& operator>>(CBufferIn& buffer, CEnum& type) ; +// template __INLINE__ CMessage& operator<<(CMessage& msg, const CEnum& type) ; + template __INLINE__ CMessage& operator<<(CMessage& msg, const typename T::t_enum & type) ; + + template __INLINE__ CBufferOut& operator<<(CBufferOut& buffer, const CEnum& type) ; + template __INLINE__ CBufferOut& operator<<(CBufferOut& buffer, const typename T::t_enum & type); + template __INLINE__ CBufferIn& operator>>(CBufferIn& buffer, CEnum& type); +// template __INLINE__ CMessage& operator<<(CMessage& msg, const CEnum& type); + template __INLINE__ CMessage& operator<<(CMessage& msg, const typename T::t_enum & type); +} + +# ifdef __INLINE__ +# include "enum_impl.hpp" +# include "enum_ref_impl.hpp" +# endif + +#endif diff --git a/src/type/enum_impl.hpp b/src/type/enum_impl.hpp new file mode 100644 index 0000000..c6d1eda --- /dev/null +++ b/src/type/enum_impl.hpp @@ -0,0 +1,295 @@ +#ifndef __XIOS_ENUM_IMPL__ +#define __XIOS_ENUM_IMPL__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "message.hpp" +#include +#include + +namespace xios +{ + + using namespace std; + + template + CEnum::CEnum(void) + { + empty=true ; + } + + template + CEnum::CEnum(const T_enum& val) + { + empty=true ; + set(val) ; + } + + template + CEnum::CEnum(const CEnum& type) + { + empty=true ; + set(type) ; + } + + template + CEnum::CEnum(const CEnum_ref& type) + { + empty=true ; + set(type) ; + } + + template + void CEnum::set(const T_enum& val) + { + if (empty) + { + ptrValue = new T_enum(val) ; + empty=false ; + } + else *ptrValue = val ; + } + + template + void CEnum::set(const CEnum& type) + { + if (type.isEmpty()) reset() ; + else + { + if (empty) + { + ptrValue = new T_enum(*type.ptrValue) ; + empty=false ; + } + else *ptrValue = *type.ptrValue ; + } + } + + template + void CEnum::set(const CEnum_ref& type) + { + if (type.isEmpty()) reset() ; + else + { + if (empty) + { + ptrValue = new T_enum(*type.ptrValue) ; + empty=false ; + } + else *ptrValue = *type.ptrValue ; + } + } + + + template + typename T::t_enum & CEnum::get(void) + { + checkEmpty(); + return *ptrValue ; + } + + template + const typename T::t_enum& CEnum::get(void) const + { + checkEmpty(); + return *ptrValue ; + } + + template + CEnum& CEnum::operator = (const T_enum& val) + { + set(val) ; + return *this ; + } + + template + CEnum& CEnum::operator = (const CEnum& type) + { + set(type) ; + return *this ; + } + + template + CEnum& CEnum::operator = (const CEnum_ref& type) + { + set(type) ; + return *this ; + } + + + template + CEnum::operator T_enum&() + { + checkEmpty(); + return *ptrValue ; + } + + template + CEnum* CEnum::_clone(void) const + { + checkEmpty(); + return new CEnum(*this) ; + } + + + template + void CEnum::_fromString(const string& str) + { + string tmpStr=boost::to_lower_copy(boost::trim_copy(str)) ; + + bool found=false ; + for(int i=0;i0) strList<<", " ; + strList< void CEnum::_fromString(const string& str)", + << tmpStr << " cannot be converted in a valid enumeration, possibilities are : "< + size_t CEnum::_size(void) const + { + return sizeof(T_enum) ; + } + + template + bool CEnum::_isEmpty(void) const + { + return empty ; + } + + template + string CEnum::_toString(void) const + { + if (empty) return string("empty") ; + return string((T::getStr())[(int)(*ptrValue)]) ; + } + + template + bool CEnum::_toBuffer(CBufferOut& buffer) const + { + checkEmpty(); + if (sizeof(*ptrValue)==sizeof(short int)) return buffer.put((short int) *ptrValue) ; + else if (sizeof(*ptrValue)==sizeof(int)) return buffer.put((int) *ptrValue) ; + else if (sizeof(*ptrValue)==sizeof(long int)) return buffer.put((long int) *ptrValue) ; + else ERROR("template bool CEnum::_toBuffer(CBufferOut& buffer) const", + <<"incompatibility between enumeration and standard integer type") ; + return false ; + } + + template + bool CEnum::_fromBuffer(CBufferIn& buffer) + { + bool ret ; + allocate() ; + if (sizeof(*ptrValue)==sizeof(short int)) + { + short int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else if (sizeof(*ptrValue)==sizeof(int)) + { + int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else if (sizeof(*ptrValue)==sizeof(long int)) + { + long int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else ERROR("template bool CEnum::_fromBuffer(CBufferIn& buffer)", + <<"incompatibility between enumeration and standard integer type") ; + return ret ; + } + + + template + void CEnum::allocate(void) + { + if (empty) + { + ptrValue = new T_enum ; + empty=false ; + } + } + + template + void CEnum::_reset(void) + { + if (!empty) + { + delete ptrValue ; + empty=true ; + } + } + + template + void CEnum::checkEmpty(void) const + { + if (empty) ERROR("template void CEnum::checkEmpty(void) const", <<"Type is not initialized") ; + } + + + template + CBufferOut& operator<<(CBufferOut& buffer, const CEnum& type) + { + if (!type.toBuffer(buffer)) ERROR("template CBufferOut& operator<<(CBufferOut& buffer, const CEnum& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferOut& operator<<(CBufferOut& buffer, const typename T::t_enum & type) + { + if (!CEnum(type).toBuffer(buffer)) ERROR("template CBufferOut& operator<<(CBufferOut& buffer, const typename T::t_enum & type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferIn& operator>>(CBufferIn& buffer, CEnum& type) + { + if (! type.fromBuffer(buffer)) ERROR("template CBufferIn& operator>>(CBufferIn& buffer, CEnum& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + +/* + template + CMessage& operator<<(CMessage& msg, const CEnum& type) + { + msg.push(*type.clone()) ; + return msg ; + } +*/ + + template + CMessage& operator<<(CMessage& msg, const typename T::t_enum & type) + { + msg.push(*CEnum(type).clone()) ; + return msg ; + } + +} + +#endif + diff --git a/src/type/enum_ref_impl.hpp b/src/type/enum_ref_impl.hpp new file mode 100644 index 0000000..9c7eca3 --- /dev/null +++ b/src/type/enum_ref_impl.hpp @@ -0,0 +1,319 @@ +#ifndef __XIOS_ENUM_REF_IMPL__ +#define __XIOS_ENUM_REF_IMPL__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "message.hpp" +#include +#include + +namespace xios +{ + + + using namespace std; + + template + CEnum_ref::CEnum_ref(void) + { + empty=true ; + } + + template + CEnum_ref::CEnum_ref(T_enum& val) + { + empty=true ; + set_ref(val) ; + } + + template + CEnum_ref::CEnum_ref(CEnum& type) + { + empty=true ; + set_ref(type) ; + } + + template + CEnum_ref::CEnum_ref(const CEnum_ref& type) + { + empty=true ; + set_ref(type) ; + } + + + template + void CEnum_ref::set_ref(T_enum& val) + { + ptrValue=&val ; + empty=false ; + } + + template + void CEnum_ref::set_ref(CEnum& type) + { + ptrValue=&type.get() ; + empty=false ; + } + + template + void CEnum_ref::set_ref(const CEnum_ref& type) + { + ptrValue=type.ptrValue ; + empty=type.empty ; + } + + template + void CEnum_ref::set(const T_enum& val) const + { + checkEmpty() ; + *ptrValue=val ; + } + + template + void CEnum_ref::set(const CEnum& type) const + { + checkEmpty() ; + *ptrValue=type.get() ; + } + + template + void CEnum_ref::set(const CEnum_ref& type) const + { + checkEmpty() ; + *ptrValue=type.get() ; + } + + template + typename T::t_enum & CEnum_ref::get(void) const + { + checkEmpty() ; + return *ptrValue ; + } + + template + const CEnum_ref& CEnum_ref::operator = (T_enum& val) const + { + set(val) ; + return *this ; + } + + template + const CEnum_ref& CEnum_ref::operator = (CEnum& type) const + { + set(type) ; + return *this ; + } + + template + const CEnum_ref& CEnum_ref::operator = (const CEnum_ref& type) const + { + set(type) ; + return *this ; + } + + template + CEnum_ref::operator T_enum&() const + { + checkEmpty() ; + return *ptrValue ; + } + + template + CEnum_ref* CEnum_ref::_clone(void) const + { + checkEmpty() ; + return new CEnum_ref(*this) ; + } + + template + void CEnum_ref::_fromString(const string& str) const + { + istringstream iss(str); + checkEmpty() ; + iss>>*ptrValue ; + } + + template + void CEnum_ref::_fromString(const string& str) + { + checkEmpty() ; + string tmpStr=boost::to_lower_copy(boost::trim_copy(str)) ; + + bool found=false ; + for(int i=0;i0) strList<<", " ; + strList< void CEnum_ref::_fromString(const string& str)", + << tmpStr << " cannot be converted in a valid enumeration, possibilities are : "< + string CEnum_ref::_toString(void) const + { + if (empty) return string("empty"); + return string((T::getStr())[(int)(*ptrValue)]) ; + } + + + template + bool CEnum_ref::_toBuffer(CBufferOut& buffer) const + { + checkEmpty() ; + if (sizeof(*ptrValue)==sizeof(short int)) return buffer.put((short int) *ptrValue) ; + else if (sizeof(*ptrValue)==sizeof(int)) return buffer.put((int) *ptrValue) ; + else if (sizeof(*ptrValue)==sizeof(long int)) return buffer.put((long int) *ptrValue) ; + else ERROR("template bool CEnum_ref::_toBuffer(CBufferOut& buffer) const", + <<"incompatibility between enumeration and standard integer type") ; + return false ; + } + + template + bool CEnum_ref::_fromBuffer(CBufferIn& buffer) + { + checkEmpty() ; + bool ret ; + if (sizeof(*ptrValue)==sizeof(short int)) + { + short int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else if (sizeof(*ptrValue)==sizeof(int)) + { + int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else if (sizeof(*ptrValue)==sizeof(long int)) + { + long int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else ERROR("template bool CEnum_ref::_fromBuffer(CBufferIn& buffer)", + <<"incompatibility between enumeration and standard integer type") ; + return ret ; + } + + template + bool CEnum_ref::_fromBuffer(CBufferIn& buffer) const + { + checkEmpty() ; + bool ret ; + if (sizeof(*ptrValue)==sizeof(short int)) + { + short int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else if (sizeof(*ptrValue)==sizeof(int)) + { + int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else if (sizeof(*ptrValue)==sizeof(long int)) + { + long int val ; + ret=buffer.get(val) ; + if (ret) *ptrValue = (T_enum) val ; + } + else ERROR("template bool CEnum_ref::_fromBuffer(CBufferIn& buffer)", + <<"incompatibility between enumeration and standard integer type") ; + } + + template + size_t CEnum_ref::_size(void) const + { + return sizeof(T_enum) ; + } + + template + bool CEnum_ref::_isEmpty(void) const + { + return empty ; + } + + template + void CEnum_ref::_reset(void) + { + empty=true ; + } + + template + void CEnum_ref::checkEmpty(void) const + { + if (empty) ERROR("template void CEnum_ref::checkEmpty(void)", + <<"Type_ref reference is not assigned") ; + } + + + + template + CBufferOut& operator<<(CBufferOut& buffer, const CEnum_ref& type) + { + if (!type.toBuffer(buffer)) ERROR("template CBufferOut& operator<<(CBufferOut& buffer, const CEnum_ref& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferOut& operator<<(CBufferOut& buffer, typename T::t_enum& type) + { + if (!CEnum_ref(type).toBuffer(buffer)) ERROR("template CBufferOut& operator<<(CBufferOut& buffer, const typename T::t_enum& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferIn& operator>>(CBufferIn& buffer, typename T::t_enum& type) + { + if (! CEnum_ref(type).fromBuffer(buffer)) ERROR("template CBufferIn& operator>>(CBufferIn& buffer, typename T::t_enum& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferIn& operator>>(CBufferIn& buffer, const CEnum_ref& type) + { + if (! type.fromBuffer(buffer) ) ERROR(" template CBufferIn& operator>>(CBufferIn& buffer, const CEnum_ref& type) ", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + +/* + template + CMessage& operator<<(CMessage& msg, const CEnum_ref& type) + { + msg.push(*type.clone()) ; + return msg ; + } +*/ + + template + CMessage& operator<<(CMessage& msg, typename T::t_enum & type) + { + msg.push(*CEnum_ref(type).clone()) ; + return msg ; + } + +} + +#endif + diff --git a/src/type/message.cpp b/src/type/message.cpp new file mode 100644 index 0000000..adb9fa6 --- /dev/null +++ b/src/type/message.cpp @@ -0,0 +1,105 @@ +#include "xmlioserver_spl.hpp" +#include "message.hpp" +#include "base_type.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" + +namespace xios +{ + + CMessage::CMessage(void) {} + + CMessage& CMessage::push(const CBaseType& type) + { + typeList.push_back(type.clone()); + return *this ; + } + +// CMessage& CMessage::push(CBaseType& type) +// { +// typeList.push_back(&type); +// return *this ; +// } + + size_t CMessage::size(void) const + { + list::const_iterator it; + size_t retSize=0 ; + + for(it=typeList.begin();it!=typeList.end();it++) retSize+=(*it)->size() ; + return retSize ; + } + + bool CMessage::fromBuffer(CBufferIn& buffer) const + { + list::const_iterator it; + + if (buffer.remain()>=size()) + { + for(it=typeList.begin();it!=typeList.end();it++) (*it)->fromBuffer(buffer) ; + return true ; + } + else + { + return false ; + } + } + + + bool CMessage::toBuffer(CBufferOut& buffer) const + { + list::const_iterator it; + if (buffer.remain()>=size()) + { + for(it=typeList.begin();it!=typeList.end();it++) (*it)->toBuffer(buffer) ; + return true ; + } + else + { + return false ; + } + + } + + + void CMessage::clear() + { + list::iterator it; + for(it=typeList.begin();it!=typeList.end();it++) delete *it ; + typeList.clear() ; + } + + CMessage::~CMessage() + { + clear() ; + } + + + CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg) + { + if (!msg.toBuffer(buffer)) ERROR("CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + + CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg) + { + if (!msg.fromBuffer(buffer)) ERROR("CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + CMessage& operator<<(CMessage& msg,const CBaseType& type) + { + msg.push(type) ; + return msg ; + } + +// CMessage& operator<<(CMessage& msg, const CBaseType& type) +// { +// msg.push(*type.clone()) ; +// return msg ; +// } + +} diff --git a/src/type/message.hpp b/src/type/message.hpp new file mode 100644 index 0000000..2d74036 --- /dev/null +++ b/src/type/message.hpp @@ -0,0 +1,39 @@ +#ifndef __MESSAGE_HPP__ +#define __MESSAGE_HPP__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "base_type.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" + + +namespace xios +{ + + class CMessage + { + public: + + CMessage(void) ; + list typeList ; + virtual bool fromBuffer(CBufferIn& buffer) const; + virtual bool toBuffer(CBufferOut& buffer) const; + virtual size_t size(void) const; + + CMessage& push(const CBaseType& type) ; +// CMessage& push(CBaseType& type) ; + void clear(void) ; + ~CMessage() ; + } ; + + CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg) ; + CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg) ; + +// CMessage& operator<<(CMessage& msg,CBaseType& type) ; + CMessage& operator<<(CMessage& msg,const CBaseType& type) ; + +} + +#endif + diff --git a/src/type/type.hpp b/src/type/type.hpp new file mode 100644 index 0000000..eac9e3f --- /dev/null +++ b/src/type/type.hpp @@ -0,0 +1,175 @@ +#ifndef __XIOS_TYPE__ +#define __XIOS_TYPE__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "base_type.hpp" + + +namespace xios +{ + + template class CType_ref ; + + template + class CType : public virtual CBaseType + { + public: + + CType(void) ; + CType(const T& val) ; + CType(const CType& type) ; + CType(const CType_ref& type) ; + virtual ~CType() { _reset() ; } + + T& get(void) ; + const T& get(void) const; + + void set(const T& val) ; + void set(const CType& val) ; + void set(const CType_ref& val) ; + CType& operator = (const T& val) ; + CType& operator = (const CType& val) ; + CType& operator = (const CType_ref& val) ; + operator T&() ; + + inline virtual CBaseType* clone(void) const { return _clone(); } + virtual void fromString(const string& str) { _fromString(str); } + virtual string toString(void) const { return _toString(); } + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer) ; } + virtual bool toBuffer(CBufferOut& buffer) const { return _toBuffer(buffer); } + virtual void reset(void) { _reset(); } + virtual bool isEmpty() const { return _isEmpty(); } + virtual size_t size(void) const { return _size(); } + + void allocate(void) ; + void checkEmpty(void) const; + + T* ptrValue ; + bool empty ; + + friend class CType_ref ; + + private : + + CType* _clone(void) const; + void _fromString(const string& str) ; + string _toString(void) const; + bool _fromBuffer(CBufferIn& buffer) ; + bool _toBuffer(CBufferOut& buffer) const; + void _reset(void) ; + bool _isEmpty() const ; + size_t _size(void) const ; + + } ; + + + template class CType ; + + template + class CType_ref : public virtual CBaseType + { + public: + + CType_ref(void) ; + CType_ref(T& val) ; + CType_ref(CType& type) ; + CType_ref(const CType_ref& type) ; + virtual ~CType_ref() {}; + + T& get(void) const; + + void set(const T& val) const ; + void set(const CType& val) const ; + void set(const CType_ref& val) const ; + + void set_ref(T& val) ; + void set_ref(CType& val) ; + void set_ref(const CType_ref& val) ; + + const CType_ref& operator = (T& val) const ; + const CType_ref& operator = (CType& val) const ; + const CType_ref& operator = (const CType_ref& val) const; + operator T&() const; + + inline virtual CBaseType* clone(void) const { return _clone(); } + virtual void fromString(const string& str) { _fromString(str); } + virtual void fromString(const string& str) const { _fromString(str); } + virtual string toString(void) const { return _toString(); } + virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer) ; } + virtual bool fromBuffer(CBufferIn& buffer) const { return _fromBuffer(buffer); } + virtual bool toBuffer(CBufferOut& buffer) const { return _toBuffer(buffer); } + virtual void reset(void) { _reset(); } + virtual bool isEmpty() const { return _isEmpty(); } + virtual size_t size(void) const { return _size(); } + + void checkEmpty(void) const; + + + T mutable * ptrValue ; + bool empty ; + friend class CType ; + + private : + + CType_ref* _clone(void) const; + void _fromString(const string& str) ; + void _fromString(const string& str) const; + string _toString(void) const; + bool _fromBuffer(CBufferIn& buffer) ; + bool _fromBuffer(CBufferIn& buffer) const ; + bool _toBuffer(CBufferOut& buffer) const; + void _reset(void) ; + bool _isEmpty() const ; + size_t _size(void) const ; + } ; + + + class CMessage ; + + template + CBufferOut& operator<<(CBufferOut& buffer, const CType& type) ; + + template + CBufferOut& operator<<(CBufferOut& buffer, const CType_ref& type) ; + + template + CBufferOut& operator<<(CBufferOut& buffer, const T& type) ; + + template + CBufferOut& operator<<(CBufferOut& buffer, T& type) ; + + + template + CBufferIn& operator>>(CBufferIn& buffer, CType& type) ; + + template + CBufferIn& operator>>(CBufferIn& buffer, const CType_ref& type) ; + + template + CBufferIn& operator>>(CBufferIn& buffer, T& type) ; + +/* + template + CMessage& operator<<(CMessage& msg, const CType& type) ; + + template + CMessage& operator<<(CMessage& msg, const CType_ref& type) ; +*/ + + template + CMessage& operator<<(CMessage& msg, const T& type) ; + + template + CMessage& operator<<(CMessage& msg, T& type) ; + +} + + +//#include "test_type_impl.hpp" +//#include "test_type_specialisation.hpp" + +#endif + diff --git a/src/type/type_decl.cpp b/src/type/type_decl.cpp new file mode 100644 index 0000000..b48c56d --- /dev/null +++ b/src/type/type_decl.cpp @@ -0,0 +1,31 @@ +#include "type.hpp" +#include "type_impl.hpp" +#include "type_ref_impl.hpp" +#include "type_specialisation.hpp" +#include ; +#include "xmlioserver_spl.hpp" + +namespace xios +{ +#define macro(decl_type) \ + template class CType ; \ + template class CType_ref ; \ + template CBufferOut& operator<< (CBufferOut& buffer, const CType& type) ; \ + template CBufferOut& operator<< (CBufferOut& buffer, const CType_ref& type) ; \ + template CBufferOut& operator<< (CBufferOut& buffer, decl_type& type) ; \ + template CBufferOut& operator<< (CBufferOut& buffer, const decl_type& type) ; \ + template CBufferIn& operator>> (CBufferIn& buffer, CType& type) ; \ + template CBufferIn& operator>> (CBufferIn& buffer, const CType_ref& type) ; \ + template CBufferIn& operator>> (CBufferIn& buffer, decl_type& type) ; \ +/* template CMessage& operator<< (CMessage& msg, const CType& type) ;*/ \ +/* template CMessage& operator<< (CMessage& msg, const CType_ref& type) ;*/ \ + template CMessage& operator<< (CMessage& msg, const decl_type& type) ; \ + template CMessage& operator<< (CMessage& msg, decl_type& type) ; + + macro(string) + macro(int) + macro(double) + macro(bool) + macro(StdSize) + +} diff --git a/src/type/type_impl.hpp b/src/type/type_impl.hpp new file mode 100644 index 0000000..be936d5 --- /dev/null +++ b/src/type/type_impl.hpp @@ -0,0 +1,249 @@ +#ifndef __XIOS_TYPE_IMPL__ +#define __XIOS_TYPE_IMPL__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "message.hpp" + + + + +namespace xios +{ + + using namespace std; + + template + CType::CType(void) + { + empty=true ; + } + + template + CType::CType(const T& val) + { + empty=true ; + set(val) ; + } + + template + CType::CType(const CType& type) + { + empty=true ; + set(type) ; + } + + template + CType::CType(const CType_ref& type) + { + empty=true ; + set(type) ; + } + + template + void CType::set(const T& val) + { + if (empty) + { + ptrValue = new T(val) ; + empty=false ; + } + else *ptrValue = val ; + } + + template + void CType::set(const CType& type) + { + if (type.isEmpty()) reset() ; + else + { + if (empty) + { + ptrValue = new T(*type.ptrValue) ; + empty=false ; + } + else *ptrValue = *type.ptrValue ; + } + } + + template + void CType::set(const CType_ref& type) + { + if (type.isEmpty()) reset() ; + else + { + if (empty) + { + ptrValue = new T(*type.ptrValue) ; + empty=false ; + } + else *ptrValue = *type.ptrValue ; + } + } + + template + T& CType::get(void) + { + checkEmpty(); + return *ptrValue ; + } + + template + const T& CType::get(void) const + { + checkEmpty(); + return *ptrValue ; + } + + template + CType& CType::operator = (const T& val) + { + set(val) ; + return *this ; + } + + template + CType& CType::operator = (const CType& type) + { + set(type) ; + return *this ; + } + + template + CType& CType::operator = (const CType_ref& type) + { + set(type) ; + return *this ; + } + + template + CType::operator T&() + { + checkEmpty(); + return *ptrValue ; + } + + template + CType* CType::_clone(void) const + { + checkEmpty(); + return new CType(*this) ; + } + + + template + void CType::_fromString(const string& str) + { + istringstream iss(str); + allocate() ; + iss>>*ptrValue ; + } + + template + size_t CType::_size(void) const + { + return sizeof(T) ; + } + + template + bool CType::_isEmpty(void) const + { + return empty ; + } + + template + string CType::_toString(void) const + { + ostringstream oss; + checkEmpty(); + oss<<*ptrValue ; + return oss.str() ; + } + + template + bool CType::_toBuffer(CBufferOut& buffer) const + { + checkEmpty(); + return buffer.put(*ptrValue) ; + } + + template + bool CType::_fromBuffer(CBufferIn& buffer) + { + allocate() ; + return buffer.get(*ptrValue) ; + } + + + template + void CType::allocate(void) + { + if (empty) + { + ptrValue = new T ; + empty=false ; + } + } + + template + void CType::_reset(void) + { + if (!empty) + { + delete ptrValue ; + empty=true ; + } + } + + template + void CType::checkEmpty(void) const + { + if (empty) ERROR("template void CTypef::checkEmpty(void) const", <<"Type is not initialized") ; + } + + + template + CBufferOut& operator<<(CBufferOut& buffer, const CType& type) + { + if (!type.toBuffer(buffer)) ERROR("CBuffer& operator<<(CBuffer& buffer, CType& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + + template + CBufferOut& operator<<(CBufferOut& buffer, const T& type) + { + if (!CType(type).toBuffer(buffer)) ERROR("operator<<(CBuffer& buffer, const T& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferIn& operator>>(CBufferIn& buffer, CType& type) + { + if (! type.fromBuffer(buffer)) ERROR("CBuffer& operator<<(CBuffer& buffer, CType& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + +/* + template + CMessage& operator<<(CMessage& msg, const CType& type) + { + msg.push(*type.clone()) ; + return msg ; + } +*/ + template + CMessage& operator<<(CMessage& msg, const T& type) + { + msg.push(CType(type)) ; + return msg ; + } + +} + +#endif diff --git a/src/type/type_ref_impl.hpp b/src/type/type_ref_impl.hpp new file mode 100644 index 0000000..07977bf --- /dev/null +++ b/src/type/type_ref_impl.hpp @@ -0,0 +1,256 @@ + +#ifndef __XIOS_TYPE_REF_IMPL__ +#define __XIOS_TYPE_REF_IMPL__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "message.hpp" +#include "type.hpp" + + + +namespace xios +{ + + using namespace std; + + template + CType_ref::CType_ref(void) + { + empty=true ; + } + + template + CType_ref::CType_ref(T& val) + { + empty=true ; + set_ref(val) ; + } + + template + CType_ref::CType_ref(CType& type) + { + empty=true ; + set_ref(type) ; + } + + template + CType_ref::CType_ref(const CType_ref& type) + { + empty=true ; + set_ref(type) ; + } + + + template + void CType_ref::set_ref(T& val) + { + ptrValue=&val ; + empty=false ; + } + + template + void CType_ref::set_ref(CType& type) + { + ptrValue=&type.get() ; + empty=false ; + } + + template + void CType_ref::set_ref(const CType_ref& type) + { + ptrValue=type.ptrValue ; + empty=type.empty ; + } + + template + void CType_ref::set(const T& val) const + { + checkEmpty() ; + *ptrValue=val ; + } + + template + void CType_ref::set(const CType& type) const + { + checkEmpty() ; + *ptrValue=type.get() ; + } + + template + void CType_ref::set(const CType_ref& type) const + { + checkEmpty() ; + *ptrValue=type.get() ; + } + + template + T& CType_ref::get(void) const + { + checkEmpty() ; + return *ptrValue ; + } + + template + const CType_ref& CType_ref::operator = (T& val) const + { + set(val) ; + return *this ; + } + + template + const CType_ref& CType_ref::operator = (CType& type) const + { + set(type) ; + return *this ; + } + + template + const CType_ref& CType_ref::operator = (const CType_ref& type) const + { + set(type) ; + return *this ; + } + + template + CType_ref::operator T&() const + { + checkEmpty() ; + return *ptrValue ; + } + + template + CType_ref* CType_ref::_clone(void) const + { + checkEmpty() ; + return new CType_ref(*this) ; + } + + template + void CType_ref::_fromString(const string& str) const + { + istringstream iss(str); + checkEmpty() ; + iss>>*ptrValue ; + } + + template + void CType_ref::_fromString(const string& str) + { + istringstream iss(str); + checkEmpty() ; + iss>>*ptrValue ; + } + + template + string CType_ref::_toString(void) const + { + ostringstream oss; + checkEmpty() ; + oss<<*ptrValue ; + return oss.str() ; + } + + + template + bool CType_ref::_toBuffer(CBufferOut& buffer) const + { + checkEmpty() ; + return buffer.put(*ptrValue) ; + } + + template + bool CType_ref::_fromBuffer(CBufferIn& buffer) + { + checkEmpty() ; + return buffer.get(*ptrValue) ; + } + + template + bool CType_ref::_fromBuffer(CBufferIn& buffer) const + { + checkEmpty() ; + return buffer.get(*ptrValue) ; + } + + template + size_t CType_ref::_size(void) const + { + return sizeof(T) ; + } + + template + bool CType_ref::_isEmpty(void) const + { + return empty ; + } + + template + void CType_ref::_reset(void) + { + empty=true ; + } + + template + void CType_ref::checkEmpty(void) const + { + if (empty) ERROR("template void CType_ref::checkEmpty(void)", + <<"Type_ref reference is not assigned") ; + } + + + + template + CBufferOut& operator<<(CBufferOut& buffer, const CType_ref& type) + { + if (!type.toBuffer(buffer)) ERROR("CBuffer& operator<<(CBuffer& buffer, CType& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferOut& operator<<(CBufferOut& buffer, T& type) + { + if (!CType_ref(type).toBuffer(buffer)) ERROR("CBufferOut& operator<<(CBufferOut& buffer, T& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferIn& operator>>(CBufferIn& buffer, T& type) + { + if (! CType_ref(type).fromBuffer(buffer)) ERROR(" template CBufferIn& operator>>(CBufferIn& buffer, T& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + template + CBufferIn& operator>>(CBufferIn& buffer, const CType_ref& type) + { + if (! type.fromBuffer(buffer) ) ERROR("CBuffer& operator<<(CBuffer& buffer, CType& type)", + <<"Buffer remain size is to low for size type") ; + return buffer ; + } + + +/* + template + CMessage& operator<<(CMessage& msg, const CType_ref& type) + { + msg.push(type) ; + return msg ; + } +*/ + + template + CMessage& operator<<(CMessage& msg, T& type) + { + msg.push(CType_ref(type)) ; + return msg ; + } + +} + +#endif diff --git a/src/type/type_specialisation.hpp b/src/type/type_specialisation.hpp new file mode 100644 index 0000000..d9cae9d --- /dev/null +++ b/src/type/type_specialisation.hpp @@ -0,0 +1,317 @@ +#ifndef __XIOS_TYPE_SPECIALISATION_HPP__ +#define __XIOS_TYPE_SPECIALISATION_HPP__ + +#include "xmlioserver_spl.hpp" +#include "exception.hpp" +#include "buffer_in.hpp" +#include "buffer_out.hpp" +#include "type.hpp" +#include +#include + +namespace xios +{ + +// template specialization for bool + + template <> void CType::_fromString(const string& str) + { + string tmpStr=boost::to_lower_copy(boost::trim_copy(str)) ; + if (tmpStr=="true" || tmpStr==".true." || tmpStr=="yes" || tmpStr=="y") set(true) ; + else if (tmpStr=="false" || tmpStr==".false." || tmpStr=="no" || tmpStr=="n") set(false) ; + else ERROR("template <> CType::fromString(const string& str)",<< tmpStr << " cannot be converted in a boolean value") ; + } + + template <> string CType::_toString(void) const + { + if (get()) return string("true") ; + else return string("false") ; + } + + template <> void CType_ref::_fromString(const string& str) const + { + string tmpStr=boost::to_lower_copy(boost::trim_copy(str)) ; + if (tmpStr=="true" || tmpStr==".true." || tmpStr=="yes" || tmpStr=="y") set(true) ; + else if (tmpStr=="false" || tmpStr==".false." || tmpStr=="no" || tmpStr=="n") set(false) ; + else ERROR("template <> CType::fromString(const string& str)",<< tmpStr << " cannot be converted in a boolean value") ; + } + + template <> void CType_ref::_fromString(const string& str) + { + string tmpStr=boost::to_lower_copy(boost::trim_copy(str)) ; + if (tmpStr=="true" || tmpStr==".true." || tmpStr=="yes" || tmpStr=="y") set(true) ; + else if (tmpStr=="false" || tmpStr==".false." || tmpStr=="no" || tmpStr=="n") set(false) ; + else ERROR("template <> CType::fromString(const string& str)",<< tmpStr << " cannot be converted in a boolean value") ; + } + + template <> string CType_ref::_toString(void) const + { + if (get()) return string("true") ; + else return string("false") ; + } + +// template specialization for string + + template <> + size_t CType::_size() const + { + size_t typeSize=0 ; + typeSize+=sizeof(size_t) ; + typeSize+=ptrValue->size() ; + return typeSize ; + } + + template <> + size_t CType_ref::_size() const + { + size_t typeSize=0 ; + typeSize+=sizeof(size_t) ; + typeSize+=ptrValue->size() ; + return typeSize ; + } + + template <> + void CType::_fromString(const string& str) + { + allocate() ; + *ptrValue=str ; + } + + template <> + void CType_ref::_fromString(const string& str) + { + checkEmpty() ; + *ptrValue=str ; + } + + template <> + void CType_ref::_fromString(const string& str) const + { + checkEmpty() ; + *ptrValue=str ; + } + + template <> + bool CType::_toBuffer(CBufferOut& buffer) const + { + if (buffer.remain()size()) ; + if (ret) ret&=buffer.put(ptrValue->data(),ptrValue->size()) ; + return ret ; + } + } + + template <> + bool CType_ref::_toBuffer(CBufferOut& buffer) const + { + if (buffer.remain()size()) ; + if (ret) ret&=buffer.put(ptrValue->data(),ptrValue->size()) ; + return ret ; + } + } + + + + template <> + bool CType::_fromBuffer(CBufferIn& buffer) + { + allocate() ; + bool ret=true ; + size_t typeSize ; + if (ret) ret&=buffer.get(typeSize) ; + + char* str; + str= (char*) buffer.ptr() ; + if (ret) buffer.advance(typeSize) ; + if (ret) *ptrValue=string(str,typeSize) ; + + return ret ; + } + + template <> + bool CType_ref::_fromBuffer(CBufferIn& buffer) const + { + bool ret=true ; + size_t typeSize ; + if (ret) ret&=buffer.get(typeSize) ; + + char* str; + str= (char*) buffer.ptr() ; + if (ret) buffer.advance(typeSize) ; + if (ret) *ptrValue=string(str,typeSize) ; + + return ret ; + } + + template <> + bool CType_ref::_fromBuffer(CBufferIn& buffer) + { + bool ret=true ; + size_t typeSize ; + if (ret) ret&=buffer.get(typeSize) ; + + char* str; + str= (char*) buffer.ptr() ; + if (ret) buffer.advance(typeSize) ; + if (ret) *ptrValue=string(str,typeSize) ; + + return ret ; + } + // template specialisation for CArray +/* + template<> + size_t CType< ARRAY(int, 1)>::size() const + { + return (*(this->ptrValue))->getSize() ; + } + + template <> + bool CType::toBuffer(CBufferOut& buffer) const + { + return (*(this->ptrValue))->toBuffer(buffer) ; + } + + template <> + bool CType::fromBuffer(CBufferIn& buffer) const + { + return (*(this->ptrValue))->fromBuffer(buffer) ; + } + + template <> + void CType::fromString(const string& str) const + { + // to implement + } + + template <> + string CType::toString(void) const + { + // to implement + return string("") ; + + } +*/ + + +/* +template +boost::detail::multi_array::extent_gen getExtentNull(void) { return getExtentNull()[0];} + +template<> +boost::detail::multi_array::extent_gen<1> getExtentNull<1>(void) { return extents[0]; } +*/ +/* +#define CTYPE_ARRAY(ValueType,NumsDims) \ + \ + template <> \ + void CType::allocate(void) \ + { \ + if (empty) ptrValue=new shared_ptr >(new CArray()) ;\ + empty=false ; \ + } \ + \ + template<> \ + size_t CType< ARRAY(ValueType,NumsDims)>::_size() const \ + { \ + return (*(this->ptrValue))->getSize() ; \ + } \ + \ + template<> \ + size_t CType_ref< ARRAY(ValueType,NumsDims)>::_size() const \ + { \ + return (*(this->ptrValue))->getSize() ; \ + } \ + \ + template <> \ + bool CType::_toBuffer(CBufferOut& buffer) const \ + { \ + return (*(this->ptrValue))->toBuffer(buffer) ; \ + } \ + \ + template <> \ + bool CType_ref::_toBuffer(CBufferOut& buffer) const \ + { \ + return (*(this->ptrValue))->toBuffer(buffer) ; \ + } \ + \ + template <> \ + bool CType::_fromBuffer(CBufferIn& buffer) \ + { \ + allocate(); \ + return (*(ptrValue))->fromBuffer(buffer) ; \ + } \ + \ + template <> \ + bool CType_ref::_fromBuffer(CBufferIn& buffer) const \ + { \ + checkEmpty() ; \ + return (*(this->ptrValue))->fromBuffer(buffer) ; \ + } \ + \ + template <> \ + bool CType_ref::_fromBuffer(CBufferIn& buffer) \ + { \ + shared_ptr > tmp(new CArray() ) ; \ + *(this->ptrValue)=tmp ;\ + return (*(this->ptrValue))->fromBuffer(buffer) ; \ + } \ + \ + \ + template <> \ + void CType::_fromString(const string& str) \ + { \ + \ + } \ + \ + template <> \ + void CType_ref::_fromString(const string& str) const \ + { \ + \ + } \ + template <> \ + void CType_ref::_fromString(const string& str) \ + { \ + \ + } \ + \ + template <> \ + string CType::_toString(void) const \ + { \ + \ + return string("") ; \ + } \ + \ + template <> \ + string CType_ref::_toString(void) const \ + { \ + \ + return string("") ; \ + } +//CTYPE_ARRAY(double,1) + +//CTYPE_ARRAY(double,2) + + +CTYPE_ARRAY(int,1) +CTYPE_ARRAY(int,2) +CTYPE_ARRAY(int,3) +CTYPE_ARRAY(bool,1) +CTYPE_ARRAY(bool,2) +CTYPE_ARRAY(bool,3) +CTYPE_ARRAY(double,1) +CTYPE_ARRAY(double,2) +CTYPE_ARRAY(double,3) +CTYPE_ARRAY(float,1) +CTYPE_ARRAY(float,2) +CTYPE_ARRAY(float,3) +*/ +} + +#endif diff --git a/src/type/type_util.hpp b/src/type/type_util.hpp new file mode 100644 index 0000000..837023b --- /dev/null +++ b/src/type/type_util.hpp @@ -0,0 +1,63 @@ +#ifndef __TYPE_UTIL_HPP__ +#define __TYPE_UTIL_HPP__ + +#include +namespace xios +{ + class CDomain ; + class CDomainGroup; + class CField; + class CFieldGroup; + class CGrid; + class CGridGroup; + class CAxis; + class CAxisGroup; + class CFile; + class CFileGroup; + class CContext; + class CContextGroup; + class CVariable ; + class CVariableGroup ; + + template inline string getStrType(void) ; + +#define macro(T) template <> inline string getStrType(void) { return std::string(#T) ; } + + macro(short) + macro(unsigned short) + macro(int) + macro(unsigned int) + macro(long) + macro(unsigned long) + macro(float) + macro(double) + macro(long double) + macro(char) + macro(unsigned char) + macro(wchar_t) + macro(bool) +#undef macro + +#define macro(T) template <> inline string getStrType(void) { return std::string(#T) ; } + macro(CDomain) + macro(CDomainGroup) + macro(CField) + macro(CFieldGroup) + macro(CGrid) + macro(CGridGroup) + macro(CAxis) + macro(CAxisGroup) + macro(CFile) + macro(CFileGroup) + macro(CContext) + macro(CContextGroup) + macro(CVariable) + macro(CVariableGroup) + + +#undef macro + +} + + +#endif diff --git a/src/wait.f90 b/src/wait.f90 new file mode 100644 index 0000000..87ffac6 --- /dev/null +++ b/src/wait.f90 @@ -0,0 +1,68 @@ +MODULE mod_wait + INTEGER, SAVE :: wait_param=10 + REAL, SAVE :: opt_param + + + INTEGER, SAVE :: last_count + +CONTAINS + + + FUNCTION Top() + IMPLICIT NONE + DOUBLE PRECISION :: Top + INTEGER :: count,count_rate,count_max + LOGICAL, SAVE :: first=.TRUE. + + + CALL system_clock(count,count_rate,count_max) + IF (first) THEN + Top=0. + ELSE + IF (Count>=Last_Count) THEN + Top=(1.*(Count-last_Count))/count_rate + ELSE + Top=(1.*(Count-last_Count+Count_max))/count_rate + ENDIF + ENDIF + Last_Count=Count + first=.FALSE. + END FUNCTION Top + + SUBROUTINE Init_wait + IMPLICIT NONE + INTEGER :: i,j + LOGICAL :: out_ok + DOUBLE PRECISION :: time + INTEGER :: last_param + + out_ok=.FALSE. + + DO WHILE (.NOT. out_ok) + opt_param=0. + + time=top() +!CDIR NOVECTOR + DO i=1,1000000*wait_param + opt_param=opt_param+(i/(i+opt_param)) + ENDDO + time=top() + last_param=wait_param + wait_param=wait_param*(1./time) + IF (ABS(wait_param-last_param)/(0.5*(wait_param+last_param)) <0.01) out_ok=.TRUE. + END DO + END SUBROUTINE Init_wait + + SUBROUTINE Wait_us(n) + IMPLICIT NONE + INTEGER :: n + INTEGER :: i + +!CDIR NOVECTOR + DO i=1,n*wait_param + opt_param=opt_param+(i/(i+opt_param)) + ENDDO + + END SUBROUTINE Wait_us + +END MODULE mod_wait diff --git a/src/xios_server.f90 b/src/xios_server.f90 new file mode 100644 index 0000000..09180f5 --- /dev/null +++ b/src/xios_server.f90 @@ -0,0 +1,9 @@ +PROGRAM server_main + USE xios + IMPLICIT NONE + INCLUDE "mpif.h" + INTEGER :: ierr + + CALL xios_init_server + + END PROGRAM server_main diff --git a/src/xml_node.cpp b/src/xml_node.cpp new file mode 100644 index 0000000..a0168d6 --- /dev/null +++ b/src/xml_node.cpp @@ -0,0 +1,101 @@ +#include "xml_node.hpp" + +namespace xios +{ + namespace xml + { + /// ////////////////////// Définitions ////////////////////// /// + + StdString CXMLNode::RootName("simulation"); + + CXMLNode::CXMLNode(rapidxml::xml_node * const root) + : node(root) + , level(0) + { /* Ne rien faire de plus */ } + + CXMLNode::~CXMLNode(void) + { /* Ne rien faire de plus */ } + + StdString CXMLNode::getElementName(void) const + { + return (this->node->name()); + } + + bool CXMLNode::goToNextElement(void) + { + bool retvalue = false; + for(rapidxml::xml_node * nextElement = this->node->next_sibling(); + ; nextElement = this->node->next_sibling()) + { + if (nextElement == NULL) break; + else if (nextElement->type() == rapidxml::node_element) + { + node = nextElement; + return (!retvalue); + } + } + return (retvalue); + } + + bool CXMLNode::goToChildElement(void) + { + bool retvalue = false; + rapidxml::xml_node * nextElement = this->node->first_node(); + if (nextElement != NULL) + { + for(;;nextElement = this->node->next_sibling()) + { + if (nextElement == NULL) break; + else if (nextElement->type() == rapidxml::node_element) + { + node = nextElement; + level++; + return (!retvalue); + } + } + } + return (retvalue); + } + + bool CXMLNode::goToParentElement(void) + { + bool retvalue = false; + if (!(this->getElementName().compare(CXMLNode::RootName)) || (level == 0)) + return (retvalue); + node = node->parent(); + level--; + return (!retvalue); + } + + bool CXMLNode::getContent(StdString & content) + { + if (this->node->value_size() == 0) return (false); + content.assign(this->node->value(), this->node->value_size()); + return (true); + } + + const StdString & CXMLNode::GetRootName(void) + { + return (CXMLNode::RootName); + } + + THashAttributes CXMLNode::getAttributes(void) const + { + THashAttributes attributes; + rapidxml::xml_attribute *currentAttr = NULL; + + if ((currentAttr = this->node->first_attribute()) != NULL) + { + do + { + attributes.insert(std::pair + (StdString(currentAttr->name()), + StdString(currentAttr->value()))); + } while ((currentAttr = currentAttr->next_attribute()) != NULL); + } + + return (attributes) ; + } + + }// namespace xml +} // namespace xmlioserve diff --git a/src/xml_node.hpp b/src/xml_node.hpp new file mode 100644 index 0000000..3c5bbbe --- /dev/null +++ b/src/xml_node.hpp @@ -0,0 +1,57 @@ +#ifndef __XMLIO_CXMLNode__ +#define __XMLIO_CXMLNode__ + +/// rapidXML headers /// +#include + +/// xios headers /// +#include "xmlioserver_spl.hpp" + +namespace xios +{ + namespace xml + { + /// ////////////////////// Déclarations ////////////////////// /// + typedef xios_map THashAttributes; + + class CXMLNode + { + public : + + /// Constructeurs /// + CXMLNode(rapidxml::xml_node * const root); + + /// Destructeur /// + ~CXMLNode(void); + + /// Accesseurs /// + StdString getElementName(void) const; + THashAttributes getAttributes(void) const; + + /// Mutateurs /// + bool goToNextElement(void); + bool goToChildElement(void); + bool goToParentElement(void); + bool getContent(StdString & content); + + /// Accesseurs statiques /// + static const StdString & GetRootName(void); + + private : + + /// Constructeurs /// + CXMLNode(void); // Not implemented yet. + CXMLNode(const CXMLNode & node); // Not implemented yet. + CXMLNode(const CXMLNode * const node); // Not implemented yet. + + rapidxml::xml_node * node; + int level; + + static StdString RootName; + + }; //class CXMLParser + + }// namespace xml +} // namespace xios + +#endif // __XMLIO_CXMLNode__ diff --git a/src/xml_parser.cpp b/src/xml_parser.cpp new file mode 100644 index 0000000..e7c9d1b --- /dev/null +++ b/src/xml_parser.cpp @@ -0,0 +1,109 @@ +#include "xml_parser.hpp" + +#include "context.hpp" + +#include "attribute_template.hpp" +#include "object_template.hpp" +#include "group_template.hpp" + +namespace xios +{ + namespace xml + { + /// ////////////////////// Définitions ////////////////////// /// + + void CXMLParser::ParseFile(const StdString & filename) + { + StdIFStream ifs ( filename.c_str() , StdIFStream::in ); + if ( (ifs.rdstate() & std::ifstream::failbit ) != 0 ) + ERROR("void CXMLParser::ParseFile(const StdString & filename)", + < file" ); + + CXMLParser::ParseStream(ifs, filename); + } + + void CXMLParser::ParseString(const StdString & xmlContent) + { + StdIStringStream iss ( xmlContent /*, StdIStringStream::in*/ ); + CXMLParser::ParseStream(iss,"string"); + } + + void CXMLParser::ParseStream(StdIStream & stream, const string& fluxId) + { + if (!stream.good()) + ERROR("CXMLParser::ParseStream(const StdIStream & stream)", + << "Bad xml stream !"); + StdOStringStream oss; + while(!stream.eof() && !stream.fail ()) oss.put(stream.get()); + const StdString xmlcontent( oss.str(), 0, oss.str().size()-1 ); + try + { + rapidxml::xml_document doc; + doc.parse<0>(const_cast(xmlcontent.c_str())); + + CXMLNode node(doc.first_node()); + THashAttributes attributes; + + if (node.getElementName().compare(CXMLNode::GetRootName()) != 0) + ERROR("CXMLParser::ParseStream(StdIStream & stream)", + << "Root element should be named simulation (actual = \'" + << node.getElementName() << "\')!"); + + if (node.goToChildElement()) + { + do + { + CContextGroup* group_context = CContext::getRoot() ; + + attributes = node.getAttributes(); + + if (attributes.end() == attributes.find("id")) + { + DEBUG("The context will not be processed because it is not identified (missing id)"); + continue; + } + + CContext::setCurrent(attributes["id"]) ; + + bool hasctxt = CContext::has(attributes["id"]); + + if(hasctxt) + { + DEBUG("The context will not be processed because it exist an other context with the same id" ); + continue; + } + + CContext* context = CContext::create(attributes["id"]); +// if (!hasctxt) group_context->addChild(context); + context->parse(node); + + attributes.clear(); + + } while (node.goToNextElement()); + } + } + catch (rapidxml::parse_error & exc) + { + const char* ptr = exc.where() ; + const char* begin = xmlcontent.c_str() ; + const char* content=oss.str().c_str() ; + size_t pos=ptr-begin ; + int lineNumber = 1 ; + int columnNumber = 0 ; + const char* line; + const char* endLine; + + for(const char* i=content;i at character "<< pos<<" line "< + static void ParseInclude(StdIStream & stream, const string& fluxId, T & object); + + }; //class CXMLParser +/* + template + void CXMLParser::ParseInclude(StdIStream & stream, T& object) + { + StdOStringStream oss; + while(!stream.eof() && !stream.fail ()) + oss.put(stream.get()); + try + { + const StdString xmlcontent( oss.str(), 0, oss.str().size()-1 ); + rapidxml::xml_document doc; + doc.parse<0>(const_cast(xmlcontent.c_str())); + CXMLNode node(doc.first_node()); + object.parse(node); + } + catch (rapidxml::parse_error & exc) + { + ERROR("CXMLParser::ParseStream(StdIStream & stream)", + << "RapidXML error : " << exc.what() << " !"); + } + } +*/ + }// namespace xml +} // namespace xios + +#endif // __XMLIO_CXMLParser__ diff --git a/src/xml_parser_decl.cpp b/src/xml_parser_decl.cpp new file mode 100644 index 0000000..2c3821e --- /dev/null +++ b/src/xml_parser_decl.cpp @@ -0,0 +1,28 @@ +#include "xml_parser_impl.hpp" +#include "group_template.hpp" +#include "context.hpp" +#include "axis.hpp" +#include "domain.hpp" +#include "field.hpp" +#include "file.hpp" +#include "variable.hpp" + + +namespace xios +{ + namespace xml + { + template void CXMLParser::ParseInclude(StdIStream & stream, const string& fluxId, CContext& object) ; + + # define macro(T) \ + template void CXMLParser::ParseInclude< CGroupTemplate >(StdIStream & stream, const string& fluxId, CGroupTemplate& object) ; + + macro( Context ) + macro( Axis ) + macro( Domain ) + macro( Grid ) + macro( Field ) + macro( File ) + macro( Variable ) + } +} diff --git a/src/xml_parser_impl.hpp b/src/xml_parser_impl.hpp new file mode 100644 index 0000000..4638659 --- /dev/null +++ b/src/xml_parser_impl.hpp @@ -0,0 +1,50 @@ +#ifndef __XMLIO_CXML_PARSER_IMPL__ +#define __XMLIO_CXML_PARSER_IMPL__ + +/// xios headers /// +#include "xml_parser.hpp" + +namespace xios +{ + namespace xml + { + template void CXMLParser::ParseInclude(StdIStream & stream, const string& fluxId, T& object) + { + StdOStringStream oss; + while(!stream.eof() && !stream.fail ()) oss.put(stream.get()); + const StdString xmlcontent( oss.str(), 0, oss.str().size()-1 ); + try + { + rapidxml::xml_document doc; + doc.parse<0>(const_cast(xmlcontent.c_str())); + CXMLNode node(doc.first_node()); + object.parse(node); + } + catch (rapidxml::parse_error & exc) + { + const char* ptr = exc.where() ; + const char* begin = xmlcontent.c_str() ; + const char* content=oss.str().c_str() ; + size_t pos=ptr-begin ; + int lineNumber = 1 ; + int columnNumber = 0 ; + const char* line; + const char* endLine; + + for(const char* i=content;i at character "<< pos<<" line "< +#include +#include + +// standard C +#include +#include +#include +#include + +// Conteneurs. +#include +#include +#include +#include +#include +#include +#include +#include +// Flux. +#include +#include +#include + +/// boost headers /// +//#include +#include +#include +/// Map /// +#define xios_map std::map + +/// Macro /// +#define UNUSED(parameter) + +/// Définition de types (issus de la bibliothèque standard)/// +typedef std::ostringstream StdOStringStream; +typedef std::istringstream StdIStringStream; +typedef std::stringstream StdStringStream; +typedef std::ofstream StdOFStream; +typedef std::ifstream StdIFStream; +typedef std::ostream StdOStream; +typedef std::istream StdIStream; +typedef std::string StdString; +typedef std::size_t StdSize; + +typedef unsigned short int ushort; +typedef unsigned int uint; +typedef unsigned long int ulong; + +/// xios headers /// +#include "configure.hpp" +#include "log.hpp" +using namespace std; +using namespace boost ; + + +#endif //__XMLIO_SPL__ diff --git a/tools/archive/FCM.tar.gz b/tools/archive/FCM.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bca900a68c45bc9e1d99d8b8654a8e086e708820 GIT binary patch literal 1806028 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%0DPPoQ< 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

@!EMn!j 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�@EO#=Z_`W80M{{{;BJ3 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΋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ИWa6)o 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 z

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

RF`8h>#{D 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

@2`LyD+PzsX)|?3It5B4EWrpLO21_KF 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 z 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

X2|Wv1H?F^98e%}!^m6=Ci$ruB~@kfk-7 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 z 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ä+(Tw-oC)Cso$G>G4Phrf@1Rf(DIJb! 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%0A6VL>8XEnz-ZK5G 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%0DMq!PW1bA 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 z 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

akH__qk?;QW3;LtKQ@bXsJCOCX?o< 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ĩv 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

jU7T5X2tQXflBfK(sg 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
Ad z6TFP5N7{H6%i@58n!}3)_VQy7`YXH^$dzS#+wfl5-gdfOHwcV#*j?e5&~e7yYlWSx zhq4ntJY(om&C!gMVc;O)vsVfM1X$h3lq~|HymwQ&_EE2B_sL_3IpteTuq-WTmhT0!0 zm6#|RS9iI(1#u7Y$SLiK{eLt3zx&?63xkzwr~Bc4F5ubz-)n1|m4yHIR&`_H|NRtC z-2Z!(`&=)r#+|Oa-07M;Q$3g!{*b*LJELo_8$hwa2n9B4-32f)1KhTCrEBe(J05re zIVi)9WP(1)=u%q}UehJb*BJe&K@Rr&+<#K~Uz1}re8CIwJ-<6aZJT?H;XVzWnMafH z$PdV~`x-QT*d1M=V==lI3*X~Q*Cj9I(b&g3);;dYj5{Oe!vE+JO1!5-AC_`>JsP>d z7_jei03Z15xd9`U{5h|C;nU?s_$yg=*yBAIMSVBGlBf8P313{a6&d|PujV+72hImT zVCZAju{#0{T9yv53lrX%VB&?&1=J0N&$32FNi8A+Cm4Drqi~GKvg`!#dpYvizQv{j z^u>;QZI`)o-YTpdr|rfzcd+*m$B<#SoQpovwTG>oIpdH#;bHNCb*|gt!ew`#iShM@ z*A%s&e+ND7Uc;VyrRRcR@40x?pa?4c_ix5t2-<_%s2?}aTEr%>aC(@6b~2X3;Ih`+ zCKZ5A5~Jg$o$g*~czGdO*NHUn%Ii-0xcZXsuJHZtUOQu_3tWzlxLvAr+4mhBy_J#g z$$$$*js|*x4{*inx??mUK)*n``r|R+rr6de_kCQ)(8XHNGro-600*peIlXWl(F#!e z$yg;p*efnAxj<@;AuRBdVXqT}cYPjPg8xR765deohPaOMXOFE=j$B?M^w9~ngNHFn z@7rVCOHG#O41u3vJIC}ANf_Sn5_gApvP3OWV(4B)rJ%$bX&qWGfE9pBS~tWCvmdet z;-hnc^CXVE_$X$PhBvi|Yckq;xSB?T1tK6Ax!p*yvoLcxa#Yo{k`C%y7jEQydty|Q z0Y4(=Qo~`3v{J#^=4Lc{! zNxtI91P)&Nrz&a1EfN4L^A}LdnC}2<&{K22^%hazcJqQ2n2oi40QAG>JvO z2A<^HoD8UDnA_dhcr|?{(m9+if>O$XYB%Zo88eXzhOn{)(Ylch6+P&Opow%Y@H&w@ zg;VquPyc%_xw7pn>7lzi9e(A*?MUH{0=hGBiHMyJ-#K^iMUnkGQ{eN!T!a*_XO;cC zs{Hmghr6_tjRcaT6k8OEJ5wr=#|9V6vy`n?rk0M-A#t9+yb$a8E0BE8hdoL8d_{H1 znzM!`J!fwt2T2pHlx-|Ni1%!=O@`G>c=bhKhHd~>xfC8Gy(G#$O9)LyD!$v;a5jm$R=mpXI zbGB9iaI36ZsZ@6CVD$$$r0-v`8fuSas9LGLdi82!b9231E>BbW_XIWBUu_y{Qty}E zIT>nyN+Dh4$E#G+HJi+~gkmF0*)<2xVA+{;2b@L5+%aa1IZtc~hB;ey1w08#K#3sO zR1Q1#QM^B;P5GEoC8>U7^dhN%Oo47&a;8*Ki%wFeTWi{+ zdd!5yRZ)=f8H%kYxH&%_(ukFeU)4&Y*s(Wk+>T_iW9Jrs*$Y)GW-$YraTwMC7U$~D z_x`w-Uh02ANud()4=wp2s!Ed`00+&+0jLeym*nQ6(>cdqE&QR@tT%$FITtNuA-dkd7AY|@OUIS zr`nOG&WfaoD5Gqeg=kh2kuKBIbUY4Y4h;{N0Bxz%{=`M^--%7p@$d(=7T!jG4u8#HhVj{ zI&U?VV_7B}S&U_w$b!YpP=;3GmSYKa!%5~~P2 zr7PQWvr#j2Q%bw&Rgu{)7ASEm*m3hj{#E}$v^@>JSly;Jqm?VMR@7W;#`e^DI<-Zk zBoMR2-o@Gy{*|1l-_%>3@2Nn0Iu@=O;lv$Khb;j0UMrAfZD^3c{a`$9fBYHvJi`g2&2$Y!(V1W`lIz4&I z`@#R3y(3c_GD`BU#M(00oW9|IKy?VLC11~~5 zSQh_>-i8-$R6iHZruRpcDw(JmKULoz5nY3@Gmb-iFybS^r+!?ntD@ZRFURU+agfs& z%6(?-8Pzg76W>ixky7>{#hW9XF)(con{P{u4lG`KLuY&^&13#0W)tdq=$|I`xB5-?^Q!KD1x0a1dJi! zN8m9NoXYLi>tRix*Gr+0NmF!FiaSuzYeV8VK<+M_avvFL>%bLDIIVvO%IK|*w%4+^|M(M^`s|k|B zQX|cCu2SB(gyKlIcQE|HHka{LSFwqk zqcnM=S4uDkz|A#Ug+^3Bx`5!l{Tb0E9&-Km4{m-X(9yQ?)aSoRl zTBNY%>M0wz;kDlj7HNJKX?_-IeimtdW_(sHS$=BG)6T(xCDV`iU`^b^)7!=G&#JUC ztL&uFIBa#kKRy5UAOH9VKmLPhBWEJ8OB53Z=MxVf0$SOS)hAaNkE>RxY+yZ@dC9$ z7Q9kLi`b~3yvO+9?+J>E>ipux`zYScuZ9vUkSQ%opzk%HzsDL~-eJo!#+8nWL|9=o z6`NS6Vpu465*fX@<>Ip8tK|nfOTXV^u)X+T@9!7XJB;hKWG>aY#~F_jL0XJBw!oRd zpX#R;LKNQN?S;P={$66sZ%E!S(w^DPH7?l!tiD6!b8k4B=o}{_59y&nSpjx)AZ1{_ z0YK~%RgEeYmt|dM? z!}=WFxb9F_u~b;XfM{T1XtMtAODWh}aNn7C*wXRevEq-TqcHz{NymNK1WX;EJRO{U zaHe)}h5<@+@x6rtS<|Zc(9^2;ch>FuLE5yE0id~9vIK~-#5fYG@u%MREFS)3?f)mp zGxyH^J8l18t*%vT@%?|LvbEU%KgIJj`F{l`aba^N;@zx}6Wt}bWrJGI3oR@H3yZ+Q zBCxOs%=p9-|GqnEp1h6a{gv;86EAcIi46U71IYmw6!9Ad`6Kiin4#d6-7=rnvMg~N z9>h9b47Uc7Cn%QLzeB%AQO5CZC5Q_Fi0+vM@Sh;W@Z`Wt1E)Lof%!DVj;fu5I_Pno zMyuTf1*vh^X*K`VKw_@dwl-fHWoxNrH*2q|>l>TOMnMzx#vgwm)?cfYSalN^H1Mr$ zA2m-J3KTt?>r5{h6>D|cr#z^rC|TW9e$`l#=4u_i#ZJ#U?@rE7kB)ReXZ2PKPv_1% zuYc@(S3i2!FeGK`OxS!zO6DJaKRY=(v9J4x0I{aX`=xPS1XX z|D3ei=kE^Mr{_AKP1^bP=-uI4qw)F?w0Qzl?SRw)DR$U-T|fAi z{t$6_>qjl40tmVvd1t6wfNA3gtzQwc%@d;V+w;?RXVtV1HG|+lxB6MDL3C{CU*5q> zq)+F(Q9smh(939;Vey00<74PD(589VNcMoM>~ES!M>s`PUy}u?S@m6wZUSB#=%$rB z02Jycfa?izMzd}qV!TR{ad^2JaD2OQa?m`24F#e*t%$+a)!IwF>E;Ox_!0J3Xedi$1KU zpm>bEUJn!k&~h{lkcVUpKy>!~o9M#b#V;L@U$7?gEEN17<1>HNp>*o>Q3fwf>X}N# zT#dYr4`ATiYmFr)?si-_-47JgSzv^=TwL*>4CQVI#Q^s6s6xH>FGzo(Kp6fA)`_v- z$8&gC$pw?8h(qmj*1Sp-OPeI-&~=EfkL1vu6NX-Q)aCeNc+QWM`2iL$>KaF!T!Wz- zlrDou@&ssQAV`lHER@C4)D|x)qs9P5i0Ja_jX9#mdo`3%dvONn#41}E!7K#y>BG7V zhz(s=#1RcBw+0af*F=SKrvsYaL8lYZQv8AYeE@;rbPsAxPhS5bv)>5gplDVQLp_|K}Wz?!_X5&~{OH6}Xv(>6igwH4@p^Y*f==&;RnUP@RN0K zZzC4Ib}0JqMc*9+eCuLzFx9+pyAJRx^0(9X95e{R-sZ?CNa1#2Q|GP7B3$rb%x1t7 zq`lZQP;?-DrL{7?Q6jHek*8KnX!5m!kE&$m2GVjg#%(L8@B9=_kn3{n4=}7VE-ZX4 z;rm1&;mEn-QK{ko9rn=~dl&&3=p+Lpw#UA$H_04BEsb5;DO0*a zvDcM}LTNkU!cOgu@f-tgAR`DH>#@-(1}qZs#1wtTQGZis(y zypA&(_3uOm1w8tBUSj2PSz3iP1uND(|D1uH4t}}twNqR!J%eg-v1OQ*<-YDyThhMF zC&T`02A;l08&mwhDz&)%7wvm%3;XX=Jld||`}6u)=isP$jQbG7b`tv%Py8Xiz?!67 zECk!^tJO+Eb68@iy^Pi`Ap5**T z=Ok1CM9>4qU*0j;8&Mj=g+J)x^k;GUvpD^k^;wnMIDW1(OcO7Zmqn$zaWJ0`j2bS0 zblyX$eR#51O#E_#O#h)j8Gg8n-wbQ-Z*Si@y`Iyd|FYn27&^B!hTmfz8{nS+N@6BY zAZQ5O&R$g%9+YJet+oBx=LFa6h0 zHKSUjxdP0_dGnwn71#s>BL|w&W)teHwFMA^ZxPo7P|A+3qhHA{gS29Iwrnj&k&U<{gTkqIwql2HE6T;OTYR%rE^A6(L?U?9Y;(rY4kNObkXA+ z(BpkKOlB!utc5LGl9PjXs4e}xWq|tx-EcwVeK$PR?J%($`9M;Kr$US(87IJ6)@>OT zKR3{7B|lgU9Xz%F^15leNCwPr&QHIe3SM1NCHQofb#* zvyDj*Y;fqtZw|_5_u^il@jB6rpsDw{7*P*!nTHwm^7$Ij;%??@Kr26U1NkPDSz~50 zLk*g6EQ{h3Sf{LA<2Pzeu3i2G)Oh(FP0w{e;VM>i4S~QEP#GB5^W*B*#EIEV- zFPs~;kU2Sli_*EFQwoTju&Hbg!J)?xm_@)Eu?ORS^7G%RU z*TLz@o2Gt)D&;$?F0rLmdCni_n6fx7#p7gW68dzAFvulReeviDfmYuRz#FE)z)DURfgp0%uG4eJ9LmyzIzl|>z7P^4&7gH4-Aeng zAD=j|T^HxH?6U7%1xs-k20X&KN+IdZwL4_v3BTyieO5&$SyNc@tgLjq7RVrvgBrs3q_(swpLc zjOV9CCO$FoX@_Z^z^pNJDD)r@VHofOE<6$2XSM&VRhip&2jmf4I5};zCfd)B8!#ab zi-Pka|M)lWj*foZT*thv{B&B}Fkqmu2n`Z1lE^segpt`XeAQVG$N3DHyygv0Vj;n;(Qn(&+P@&JN2oKqT+#?V$CIShws16rrMZVK&oTD4~zvwc8y&c2rT{$VrK3E1oxHcxo zKz^7q3`T?Uq^7-ZZHgbrSegPOY4V?H}!W%ZFMIS@1+2>+l_O}jL0fH8+Cg9%kHpzJ)Js-M=%aPKGtwYB}Tqvk==Mg;j~jvkA4lWt4@oq*PG33@R7%D^X@ zu5aF*P(*>w|GopA;Z5^^YYnORPOX`@KV!G+Ukx#C1iinUfJSY4RS9oGTR%{(?6l4r z2a%%FY5jQ8u3OZGjIuM+UQt@oUMR+RUP8KSBw5j}XT@Al?d0^N{o`4-aLp<_Gwzt@ zlP}g%p|qffg=mdUA`^X@O|FAD;qG@iL_2J&v7arQbl1LBbGQEg27g!GEv)nh#T4EA zsQLOhkJkVHM$X7HK;ny{wKD+otbW!^_C$V|ZJpvt8M)@-;O@)Pp0CDD@MY zzMd#CGam^&q8X5mhl;9@ibqu9{&@J4kQPuXjxM4&1^KQzRUpRE=$yW5x0;8zuc^0k zpdBke+sxp%R`bjYX!i8{N87AWUuI(_d^>;@9k-Gh>(?rs+gvNQxNhV0*#T?ZhSIe0cI;0^=#~xId6zO`XcS3`ij#xJ+s=6dHSq(B zRU^ImPDi%U>0}YzXrR-0dtf6)vdk=d!K72W4G+U9+=7GoJ#YJXNqZzn;`h0~LD2O_ zX!#mXgtaS4_S2(73JQYPl~CnG9EMIGzL!`H(6F&(_?#R{gC-7K-;Xcb7XlXVAQb`=hjNr~YwvU9fdZR~=)v zYpY6VHOE+uE}4s65cYu2@+@`$83$w=H*S zM_FXHSh(@!tYk(hmrL2^wj`^r9etXK(qoElnz!ZjhG(brT>yF@`!2D+Nv-dhY!bHj%o4(m&3CKzMPn>V*El>)J3# z61e^Pb*J7wMU&V!c~|KRC%~{|SzC&Xy~I5>5mA#)^h4b;%toYBZ$;LS`uW>;cnFq- zUP^_Tkrok%_!Vn`veYN>GN-fyx#JWgghJxm#*g2FP9se?jq`NuEoJAX_KHNX#}m@= z3w)Bs;RuAoO``=B z`DLz+Bo7TwKjn)UZwoimdhSxP4x?nZ%8+vncQ%ojyiVxJ%i`epf%D2x!R`)t6aX z^Mau>jAqxAv(9GgghKaboNuNS$zTDxfjqfb>3L(~#5=@-W-{tNA^KGW@ET?Z2Kpp# z6<705DJPeOqju-?^*;}r<^mACT`oiIV0Ae!kq)>f=3E2?dHapzO>r8%=zO>Sx`ldv zCe<bCx183;K5+zCrChCKVSxb*c&q>%k8wB?3EK7Z zR4T}C(+P2np-e`|5pfntYxmvxk+n^Hzns<7j8w+3mGPxB{%tu);WG!6Vq6_q-yL3s z*OW56)jU1~b*L9!CpR%?GMIQv?p|7M$ZMc19ZzJ42&m1-_cFO-!O|iowT`a#I{yZ& ze$r}!kkVH6AWk9>EU?*X)DPpQh{gxAN#WwhLmq|KV*tMrIG1jC$1Yt5R9lN7w*3u; zT5r|gG$d)>f%Xm?KE^kQkusc8jn;T9FDWZjeiBg>%qcPxOIJnEDV(c;qbDbz0HX0$ z5Hz_zl1h1YUVnRBS3~%n;5ATJ@X#n#-rATfgSifV_#p8j~d^!J_+Xhd#w1Mjw{H2fCkjL&nxv_2qVT zYrDG64jQdCt5vEsvylmPa>a=^QadKX zA?%D`qQ}r3iQwrbzUu8Vhq*Etei-^U!<9b5UAY=gBG}{??hm`}cB=C@wz&xY_(`9P z`yY7F-1oa5?wS32dj7A?>SjFt?7!3|>dg*DwleeJHIy_R{ zN8dB#+OGJ3m*bs2yn$MU;?l1a!i$H`#|&b0?2p^2?{ROnhoK{T_%4X*tFJq%CPs{* zEM%b5xh>4)vPZV7L`tt6KBi2IW0xbhQ3An%H$0-9WZSRf9tD~cd1$T4!JZqq?WoX+ z)1eZbx3?))6PD|Qg<^3>sg)Mm!I-_K-RPd!>~`>e8hrIH3vD7HCDMier|dK%S0q#C zvMBJviC}L0NedUP;A z!v>*A%NK`1*Y$9b!7LK+3bwz6zp55r-@OYuJTexwXGaS&D8al#^9fRyFo0Hs7<-TT z=RrbaBRvAubNenVTR;7bTOo&7w9ZXs9m?H6d2)W0t=_m=Qwjyy$iTVdf|7>>z4k6c z(F*pYpoU~OF~mjo+i$F3u*cVmzu8~+D#a*iGv*#q9mlAlJntSw9MIb|`u4is2|sr9 z)X7@MVlb2NO3=08gsxQL#YzCojUPVuZ5AE;t8l7A{*wXg+Mq7%y0~ zL~0POhT-aStTlOZJhA>N<$#~%V|DJQcRGNrJ0(adK; z(1Q+%_Ypvs>Ej86Xi?`R7;4bFP&K>pfb(D`$>~C1poSBTR3F%y)>+wCpUlydNOE9# zv=9yaAtwqCv`Qw@3uwmHKIzz@$WbY@7d|c*xc-*8HjFAQjHd@3xey-2j#QGc5tXML zMK0(|L%a!0U=Td%g#-nK4@^%wZWS4S%C~sf!ZMai5jiA%)l_Synmc^T$nYWU`a6Dr z$j!}#QMJUD&8>z8q{x11??nmQU$BFAfj3ozAIm?>MC=Il?ELgi^Qgfg5`u-|a)~~X zEkowIi7iAQ-ER6CEmJzRQwv2y^qLOFuYe}=$QkhPNUig=tj$ROO>I>KpygUwl zO%D2+6p$+iUk!02z8bnWk>7xwL-EZ|oH(nJIeu2F5Ux*qHsv9GsU_rMm}#idQU=H& zYWVk0iZU-^%>9B@f8JS&0JkJyQ{2Zzy=)7VHR1vP@-lG4wtpaj6J_M*g2JiDzGgAz zj6vc(+hYX_$URmmvVX7&+g|$0980#6M4@O9Sdt_n&kNp`EEUlJk0C&~cIk=%(GUsk zi{l#U>LPAx!FK*5Y*+80$-uZ~>oSol1Gp5PNqwfsI7Hcj-vz($g~ZT#q2GYJYsjL* z#_M-)J4dH)L1utJ;+H4I{1&rR6Z+el*2<@?8{QON(livaK8iStbukzT6)Y4;(myXI z7+jmfx_D92)C;~NhlDzhU{Ros7kL=8X`!q1-RRTX|1#{q4-ol>KU4C5Y59L@wXMx6 z+JD!o3;XYrJWrDUC*mYN>sqjz>4xgeb45!7jK#=CyRiQ*?7s{9@525&<0Cy+NWkbm zZ*d_5vPg3+F^|6!(a*G3SWLLp^$IdQbP*dx*0}0Mxy*S)VfP09I(EA3w8eg4htBxM z6Su5PyEE{CCMWkPYqimmnbezFY+}4M=IL!(AjhM!?Ne@<82IDX0XlpDSe%AlckH9= zW8byPCyllSo+aTA0s}au^NHbp+m}Sb`{wW~8{vz=G;~E;V~#FHQFH!lrZu)9+NE*{ zWG&FYIqNtF2ORo0XAJ(%hI~EB0k!qEsfJHF*YGCb3!BzNaOGw5N9*0m+4*TlqTQMd z;pcR)lVKi$oYmXk9Plw@=vx+E2VJL+9&_RKv?fNfbe@LPd}5XfWrH4{H)$Ps+Z4D1 ztw&c=agI?t1?snw+L*NY+i5^QIJtnndH2s|yY-F(elvLwJF*FTGY$A9FBoqCrW|Zy zxGgdY=Euk}R?Jk;JO0Lf&Da3#t5O%Q_cWxy{#^K}S8k!~X4FHargcp~WM%ycUH)JpXi^yKmX zdEEWq+QwG368HaEtE?~fe^2o|$^I|mB(8_%_Xb+*0vEf$#V&BM3!L#WGm0t;>o-;} zpl^~+KvCk*xVr2Odh%9!JTIgr3awtB!sZ5ggj@3$h0~o<0dEa=!~t%O;sH#ru)_mJ z|K^kZy-g=ujdn?nHq7@aW`ZmKL|YO7(p3=@X!T6i!*z=Q^K#5AQ%AR(w&oDIhI4Dtx952OpTqQ ziz7=aM+QF?k>{i0<)s5Z)tLn1jV;2Iy}|GsdJHfST(%|Fnt7EDf5hc=)}vce8Mx00 zpA9_8t#qLfWH;lZM=p3h?tF!U3;Ga>HpwH5fYHJyynb-h0Gi%SfoU+gAQEw0Mc-wd zBY6hpkFCiSr3XZU#=r)2vUEB2Fg||z7|26g7z41GuLA2COT8>Txpw6lC7 zD3hPxg9?Pm*Ec)r+#Fu-S7gFS`pRBp!d-zHJF&Am4wQR57ze6Mc@K)Fchm>vL?TKQ z)k(AlIdN>r{)*?oT2VDE=%BN@qrt$?a*ZE4&68%kFaUk)wiq3fqHEWIJk|BNVG*-> zY8=g{7pY~@eK9WZIJ=9c(5VmA9vGp2;8r=Nj>kQ1N`i&x@|0upL_{oc_^TgcGwvp! zzcWc=eorBcjV$t8;@nsWLq#>lK6>MD0+aFo^d6d>;Cy8{@KxV`{r}l}+s3wSY+ZDJ zjeiB}eRnD)vSWcv(%OmVIF8f$?8M25l}6{R?yp6uU#vG76yB={;) zA}MIkZY&W17Zw)Yo(EWK2_~9$Wjm6Iz9@=`<{$B#v2R`9w!((?8l338|1D%|^w0)g z0+I&?ycd{WHG83vB^X_r^4iA3 zhsJlxNA#{E@v+mE+K>yyV#li=fZ~LRDOd$5T!HN>Vy|GAu;3q#Sj!IiVI4G^%LIyfy*H*FcFXE??^W}58NLP zy;&IVU~lcAgNq#9^FkI=yxb!1A%`L7yG9FECgc}9Zci@1IFp473z7+5D$(oCwCF9b zO>ZY(Z0{v-+I6zHzS(WlB~u^92I`OnA|k?S!|$uRd{8F?i1!hN<|80`q#WKpp1e8v zcye}pavmNzVACWH8&q?A=Eh2;YJ6!tek^nu#a#F4Oe{($D`F_crCmi2r3M^3BA+Zn z={D}yFSn(`(}7lwngcclFu8ClZXj$DVCus27K>~wLrrv&kXFT{$P|bcs72bHUeef2 z(hK(Y`(%v(fCQEDlsm%q;0RT|UE_34=Ed>%a|WppBy~PvjqGyoAf)X(Y+b@Lzzm*u4_`IucE-!^?0WEt#faM4Z6RzeDb5z=bJ($po%M_!}&5TJ`qwwDP@+{%mk_ z=oU3Y_Npd7AJW!fWg2+!SF{$GH(cc)P~zB;T;ow zv2(@i1(3o6S|_z?z!EPA+(b|Ib_`h~-`EyE$v8%n{xG$16loTRhp}c+ghAj}BpC!v z%ksVy#%MLZvW)#;m6mBiktT$-klloQjE$}5;hMmlqM4TjUxsZBz%~G~(J{*&inrMA zY`+XLiU|dY+g7~M*rR7ZF6}`d{HgL=VFuefN)h<_qr3jS3!4WC(`6&*obPJrfbJI) z+8&19hW}R~c|3-CSm|g$dwx=%mqNETzcPb^{8J>4WbA99t!Lyj^BSe>%qauw?`jOM6{~S6LI8^reMow!WzYSHHao5U>B8x zeF!%=YizFKwUyif;vNUX~1B2P%^L@t~M*VyL-jGE` zY0?GBWW(<#_g(ME3Avs78F~v)>bN`ltF$?BM)`)jBBXb&$s&~tPm88k$%uafFS9&r z1ChZ`TmXt>IP>qJ5^Tvqm|I#m!f>)uh-i``1``M|1j9W!@S?5-!G}W?=`bIy4!FA` zvlW5-V015eRh@JF;2F5Q5M}e2yw4Vv2-_X?aza{APy>eaiZv-)gfbhazfI>e;KDEF z@E2|Gm);bJS0Jpwtq0y?#;sf!JFKXkLyGwDT}!Ij_d`gw->p6<$$%j!z2h$# z_-GL+FHXKI8%~tz_%cEs`uAhWO5%i$WtBTVLKt<+nz$keRQ2V{;0xO_ zAqn0I!g(b15Dx_pm>9B?kUQe~1@^IIz0{XxOx#7VbPr~5OY01#?!3choD+x7R|BZ}A9uq06T0R?vJ25%i zh8qBm?m)hoPd`$>R;1YsIMQm*JVq2oG!Yqa#w0Vnc;{i!g2{yshp=%&btFkKfGEx; zrD!^u>!3mk3F;%bP)oF~2YF2@WXC9c{z_A)V#o@2|ykj$pBQsfbc{T~Dksr{>rA~TOC!kKU z>!Ig`dXuxoXrw+W7uUn3ak$uZupk|ktFSe2n!1#*MkW=)b5-)W+YEAMocpAOa@^z> zJ|_8uD1NK@2rPmdljFR-2W!$9-jEdWEijIt7&iWBLZNZ&S_VA@!(Pj_Cba`Fn0U-)TdAQ1VC20covx4x%}_J zWVE;)!=WiZIhka{6DtAnUiHbc-aoJ6pH^XS3U-eke{dkA_TD&|!lwO&m*{YRzX##x z=*buQ2V|rmk(Ug{(hu)nGZ*%~i<#}h$!*8=lXS?)DQ05DKoklC+_6FZI(}w8_WGXq zsRk%hj>l)pK&ficcTakOI^50Rpx%&ibhv*`mGxhYAtA}l(~<1-cUl0I@4yFBiMZ5< zKHOu)E%edu4=?6l=oCzv>=)i*>|6>Rh1rUnxa#Mj5Xso>e1%uNdqUO^KqJ8EEEpph z6w3ua>462jps(<(;)S5~tq1rc!NtB>_=Vy_;}8_{CADh4L@H?;Y0iv!OmybT{)e6@5WDt z$leKjIxKE)@5AzngF&pkAmR*QK+&)ah&eH*ejOQjefO zGt5D1Uv*!@d3$Vtq=1IPc3a%=c$FR+!iAxIx^r)RrATYLLx(>2f&Ss|w4=A`in2Lu z^6DQSKAs%EKYM)&a9zvy7669KuBcFA8jevnQ?}YI!DwN&9MUhZE<4Sz=2#C(mb!7iX{@A`3x(5g75hEurg1 z7o<3%%7!b|ly-Iqrw+XU6(Z$-PHwk&2N7UG=Eo2KfbouTIP63=iL>U#b~32z1)F$d zA@n2Ovd0}?2t+0kAbd~J?1bfi#jg#(qmA)5da`1ldxQw~DVJgh=cMUda)%C?H8l|E zK%|5CC9#T#rF4YADCFmMVyVEG(Ju$mBt2cYH>A+%#B~Th6&S|pWcE+~_;-Hb+3(9j zVUww~;XLu~GLT(V-!(>Ld_2O#{gA8s=qsq$JYUTPaF0v5H;|ymR2q# zMEdG4X^fHW%+$~U!TTK z){zj#tS&1oTuO`tEh(!!GKeLxypJD?-G#hq&>tU9Mx*}JrQ%K&c(QvtnM`4+Nfqym z$No=BVf-qI#f6Fzi}6HO`3fWeB)vL8ge2dOVfypBCi&^1;VM@U_BlLtk0%sUz8u*t zf^2!qM|L#MpP+eXI{AuMI}ULvFk-70HV8Zv_XgpG5HmDBxBA)IY&j4%xxKbL9b|kx zZJa-rm%?~#{1N`Wn;@NUZ@{kiCQK*F?b%D?ArX=;pu7S4u*LS&@}@~qEU#{>^d3}EI_xB(Fd!L0Z;Dx(F0&P_9(Lh2cj@z8;LL225tmCt{^0#o zTRzc?Uj`<|vOt_j5fMJWzrCD{#B*TY9TJvfxVW8?9CV_3H-Sl7eaz3}2g%7NsqPb6 zc}fVj4fq=LCq|6eBMrSIp(9i90FEmO4FZyhbr9+esR7=LJ?f^&w=ED6+scx?lUTiz zcOTv!^-eC1&RHPdi?=|Y9=-L4L$z?*oo&H6DtySL`1$Sh)#B=(-M!xfxd@Ya)uPWk z#`b>=w>eAD4iv=RK$AwlJWcV8e8};J!|kBb`34MI>^=2mJg`X==I@Db1s7OXP8(!mN=Qe@OCDry9hip8H zr5GO`8e6JU0{P#cU4Y&NIQmyo%k&XY$=vGVPbv86ndfvBZ>&hoX|Vt)9Fv1{!U1|X zIR_G%;`kgQ`5WSbN#~_ket8bkQ4T^s2Weqt3ZEHPKYkbcIK&Shu#x}l)jp#QLA%5U z?AiMstb$y7_Qj@snjl5AyKXV(>ocqgSnzPi`3^na;ZEV=;dC*ZPF$ND@dy|y+ZzRb z1-6rpb^A=}7Fn+|l1*JkkoWWRvhRO=Q#FFOHvvT{S=hkq68Z<-S^UKo$$@vYs0*lA zL0WCz7-6CUz){)Egv~saRv?JZurxz|or*L6MgK8;yhSXm#YJHZSWTTJ(#^xBz(KZ466k%gJxJEc(F6Xs=$ky8CC*by3BC( z@e*bBtOE;?8LlZ_aLjNW@v>ruYX{4R8B`2b3A1ij-GXtaR7$I=!4?|&)q|?}24=9xChXudKO@WzvIgf~8tWhE~;;-~t=HAhfN zy|U0N3%#<)xUz`4$td1cq<1TXixum>`KCYciMjtdvxkd;y>#^7r2C)fxoKH}`=8IA zKYOO{f3D)QlKY?Bk~k3g5xz?v9^HMzUEFqzTf0B*!1;NI^!K&16?TxzJ~#Z_xfK5`J@k0-A`;f0NKU)1|8eE?xt+|ByV zJmQ%%{&V5XY}Hes48Pa|L~e4ztxXd7d|WZSCmK@pY#xJ_g?}lv7wYyxdT&~z54>l&9zab^9$FLnfLOKE#_x=w>38veLZd5x zAa@1ta4Z{@X)0$Nk)5=E&Ynd2kT@u{a1Q!$D27&o-KJ;YVQMJ22f0;ie7>jaVm3ZmwK|4shi-1TP4s z9^Fgp7*v|<-NV@U{;^c|$lEPwbFHIugckPAnIl+TRxn4f^?tAqgjW2;_kr@PU*0s7 z)&W=}WifrS`YFKly~BLuz=o=G(cNwf5=tvXgo#@-xOi4CV5qgi#HG&Rgbt#$=WGAvNj7Mb<(!BI|1N3Bg z3DJy}q61k`8LZJ0G4miv;+ZvKl%$c_isx^j7(6=4*z@DZgdP?=ofczjtkhUbqiKrZ zok>X<%#7DLtC1az@0T<&(w1vAFI8-D*I zq5Uuajl1rZbG_6ppoIHB&rI}GZhwT+>-#?|`S26&7q8x)_Wp5k^x?zXlZ#jXIDUWj z=JY4ww0p#Jqq}8*M*$Y+Z8{ygUca7@^mEJ+1iP>U2CN3Fhym?wl!yU|=>3lbEH)Uqy z)Iut|Ke#dG4qm{)4JG%^nd9#RCLwX7fV;{F7EE_r#9KAo9GDG_k#jlg&m7w&_k(Dh zW-lMV6vQvbfNr6Y-t`Bw35~@`f=-d3#LUS$+-ZP`-!%f!yWXDubawH}(Z|!HS8q=Y zDRP(esD(=)2oL_3grOoOgKx#Q!5$gx5ne~|*j!kulQCIv48ad0byYzw-W(d}|24aK zWo1JduF-<4^r!D|S9o`F);oFKW|sG#3oh!LPjBD;_RM;9+9OrQ&zP*v6?YqK^o`4f zGn(%>)T@1{gOs9ti?KZ?bcVmjac=zG-;^z+^!s_s(-QPdA zal?ku9j`U(Ma&Dcu>(xQg0LO1n-<|f(!)?GH zBs7EcLijSWzrN@lDqr;;4C+_KtJs4qukt#l@Xo8nm|VIHb}R8E7jKTwRJ9eK=BP5b zI=o3Iz`LW~&)sMV=;JIRkb7s*a)hl(d=(1YQAAOFa=VS}Zro{q03J4mN%g!qJri~? z=e^hQ^$sUbs|Pl#xO5{%UGYX3;Ti5p$47W9P>A9^3%xgX#28TLr{S?8^mgh#RPk!| zpqr_(_<5hio8zaNefK7+x4%AlbM)zL&-Z8g;pijQcJJh)qDRCf&ZeE==xQ+Dy-72Y zzJ7~4AYOFEk8OVa@3A#HgP7)i{TsHY)8mK+m!78Ya^vBMeqYS{v~S>*gEIuo2rv2; zw<ep?EM)~r?JClT;j~KpPrnY(CL^j85QC|A~K7Hh4CL{8@cgt0;+M-4c@0` zZViNBM@ zMISau3jM!3dH3q%BV9xsovD`8p%j@7fyv>UaI_q}vq#I}r&wN&$zo1sK<|P*^dTYI zavDJ|-hb+ypT35z$I*ETu>{&y3ewc+-D; z5w%MXJWu=n{s5L{?2EgSAtW{#9k=Gv4G6m9QmMj$5QE3bxPw*6b^6|sR zlc*hRC`D#TJ}$;PJ%C7iuqHYk;!!1bS^BZpJ5|U5zh>zS*YGKRv!_dK;%G1)K~&W>pjkW|Ou;FdU^^_Ohb0l$=3T z_by(N8NVd%70!P<$IGaTUn2Gk^5cxEyLX>JuS!|N-_A)dN~=6vc!nJbl%8Qr@?w5@ z`J_Le+&Y7F<@a8_x;W~+2M8&38(sEYXAr-Fk6F4ev1a#Q+4sK~{n_<`E*;|pfyhUG z6r_(oeF9o2PP~W=nT1}so?kCdWWH?c1H;5{6MGi1Y4?Qq?~~vDj+YJ`@;LbzExjUb zZf);y0f*4?-1`_=fq>MpYWLp%`r_5mdE~w*K6w$63!$mg3XE4EpFWaP4J^3hDxq!)cYS>S?!9`^9C)5>dRgGN&WGuS z=TB#+5TGvg(9CvZ2Jv6$`qfq1{HJrW`|5o>Qeni>(<}?&FZ~g5KNzte{N?B^@iQHM zqxU4s+Z=b?AN$=$Mej*!Jv~1=It#OOp}CcWn_gV*44oOVpL-~p^gmdY%t;(w{4=&` z+@AE*g)N-3*bNWnZ+jQ-U;Xdbr}D7v|GK@4bGuKr)7Jc$u95neE|4bnwM}i@Z6|S@ zgr_`ubq%6G!=+i|bTsO4Wy zKAs0Byx_C#u!cYMht%V&K|_JN@cQ%9cdzjxW;nkI&ut%$UejO$=X~Hjx92nmjHNT? zd7R`n$Qi=$J_Ax;{QdNGVD~5d+)X_vADx|_;z3H7kKM4)cxb_!q?4o9K!7o^*hMyae|-z5j=Vt#Z%o3|BNR;z>XD`1hmS`;y*u)1`wO!syvhLX zByvPmnNf`S9RK=jpnwZrfeX?*#c~3Vw!e-Bj~|E1d-L|_r}M}{CycXKm&>1S@BBHN z&z-=03=8g1xo|x5f;fk?aAD#XR2PUuk?w(~Drt#F++dF=9^6I2(9q$D+KF8^BhYOSsy9sdpEx*9~ zb$dFwvuD%6j&pgt(|5i;-8Fajc7>A3DdWj_VDCpBMTR%h#Opp(U87IT`Txs*4{f~W zSUvzq{Q3XxbJKhli2w1tYjySc|5bce692=qBzo%oHGH`S9O4#Ef%9YTIzESv&!OXU z==dCIKXQDI*C%-UDu?IbKS8np#kOS_eteAq<>wCNA0d#&Y<`H>6!b!^|Hz~Bq+e-z z61jsdh61kz)^|(D084Sux1ZsaDw4(%HlW$KDXvG8%l?QSHYZDLHfr#u!8@6`yKv_A zE{*;HVLWIaVr69LaFfRJ)b7uqjBUDN z*e3Uk2{5rsuk{G;A~#&9KHlJt_ii$z4w7;GetP@<)zRCF)3eiFi(Fl9ABZ`L#|l3u zb%GJjxfhx1d@&f{K1(wya*g((o8z-hHre~+34MHN<2m#g3OyoKZ&6of&?WJ#eh$5q z-b*LjU4kyMQE$+PqVW_*bq11OVQtgg*cKIq(q~{(Oa+S9)NLmdPd_C*m z(gJS!AP#^;j_WR7yZHthcxJf`%U($e}IML3I(fh^t@rONxo-sst3%o;(pmoR%{ed7J z>66~exqCo*C7*QTmwO%Rpa*&rl<{)UkA?~^3IZMaCB5oT-LG(`1(43Scqs{d9zPEE zQtrDz@>{?YdV>J>T);W)L=2uU&&}DtL)djHfS+y@NnD=|Skt!M+)IZ^AlGNWDt-+<#~tzF&C%&wUV>moK576YdCUN{bvvGs+gTTuLq~RGL52r^*~#+ESf9P+BoF zf@r^G4U%!gqvCJOs14<+g!@-`EdgMItq>!I|b>{6>mv$i)uozOhf4=yfpOk-# zHTLo7E%Y-2J`V9;yVM^agEvG6+20NlCIy@!+`!=QXG>NGz&Rab8~)kGqlthZ3yDB9oCyAbMDoMM*ro24 zSSsmzI5|Dg1d%a}ZSU`>WL{Zfdhy3_Mw(LjC{S8_IY7tYMDR~cNi3E0J)Hb%H0i?| z$-m*p!wEJX8$YLisAVy{RKmAyG6Beq%sjmWn~?eMAtD??V@f}S-^riT7l}F8FVR^9 z0mXdc&!Vkm9C2t@Na~uu9`5gZ(&3noc|!h+jK$}M|i{= ze9n6kB>w!zUbkyLmCt{mE_#Oa`Hxk6#Dkje$?aIY8a)1QnMe&h+44C|cD{p9g*S&$ z4CWK##vV=K>>!z*kHN4$P{TS0!&3T?W`3Jh(Vs#E1lAtDPia<2aFz{vg;oZ#4ZY=s zFBFsKp)tF`n*<4THpsaHn9mI7jK_~1nKB@~>f)cy@5W0gXxIBL`Dx}J zrP;e5J@h2~=kMe-d@Iuq$ic&=(^7e=-$g3LFt(;M=L=T-zUp0+-&crCtMohd03J0M z>*2ThpP2FAz3ESF0v9fM1TbOzf7+G&Ka=x+PoF>6?rsS`rK*Z@jxYSHxp1 zI~M^*nt^e@bZ{P@fOX`jO8Ep8tIGfdZNG+E)5qSlK!gZ1i^j z_Av8mm!H@3FOK4_dJaRNd(20;k=;7#ykhjce-6(eBc)54{D_?Wc}33p4g7rU3=&BU z3uPA%bWg5rtn>Noz76O8=n=9J9fHUWBvz8({uBxYGbSNY)PYYS&&-}eln=bdg|V?Uw8Ep|?Yo>f#ekQd2?l=0Ay zs7gzC*xsT`Z9IjZUiqzOOfHF46CLBJ;L4tPm+U+ArrfRFAG$ayDoS>R27l z3gWy}kvuceCm#Ff189UXEuJWjOgVQGu~c?84e|*FMb5khqRD)V(Pmc7Jv90O)jc#W z1>NAMmEt2MYPJ&31`_eVy^b=PSW_uT~Iz5_QcMrlfq8~2_I$+cIaB+KkFNhFW z<{IW9&g6wq=BWe?_h2D>ZF_Pt_|s>89kMQFAFPWbu-Es1&5nmIoQdv8k9)twJbM@Y zj07kAFzOHNo5^ShtM`|N=_SD(=D2Nen1j*c!vJhY#9u)2!+so zCTSe9e4O4>C4f5xZ1k{M7_x8+!tX3B#x3>hPFohV)^`W6d>CKH1RUgX1bH6r9#zZ| z%mdD3-kqL_*+!Rukw}?B+4jT?ixe3UJIVAB+tX_@KD{71IyC5LY;9)*trkB;?Y4K;-UsSACGdzGLEz#B4hF%YHo3}v0VMeQ#h3nQVGA)G z6AIWe#JgUnIAR!_NaX;eewuQb=l7QQ8*lChsfGxkt11}5yfv>o?-+~7NgBXvyZ|rUJ zhhk#Ge-&&SI4om&iP=g$5V8|mN;ob+yqiGWf{$3G=jRuvXRl9wy?FH-IJx?CLPtox zdlShsI!*>H#*bO5#sM7GRK%3!hIV{&XgOH(I}UEA_9Of^3jW>wz5Rsrn*a3f`4lJP z!{UXcM;z#2*N0<;u03a+dn;0ODx+XVA^C;w@5w$CWEXmas?$A!{k_-w8E-j-v#w;I z`il)?^ykS`@oRthrH^;Xt%#q)8Ag--@O(aVhQdSgl!Y<-G#zh>@}*En;NCb_^R%z0zfr~?ueiNALMaV^(`kz9dgbB20?&~548^~U zRGl}N;Zig{!R)&Sfv)1G?}Xc4ZO){Ax05e+Z_<($NeV*=tO$ta30xJWRwH4w@ycqo z6{Z|4U(~bzt3tyGhAzI9y)<&B5Y-bqK_n}VkD6pV`vJDIE$IL*J(PwQ5cm&aeJ-Sb zLzt0=24zU3mW4F{&SyM+X>8k5*BMR57tSA_x21C)F^H>YMC3cUQW*qU$v@&y!eLAm zKuZ#L6pKr+uB^A)^hEtH$26=oA zsy@X{OBN5ReLvemlQy9Tb|S1zZWr;3DQR5%@>J5Lzh(4)d@gBA{PLr$2kBe)a7!x2 ztL6(VCKe8hgayH`$1laNzy;&tpb*Fk$O5S@DMMI<^}5Ck*Ag4u4A&2v)(qDSo6ro` z2^-1`*9IHJ>{$nzeTF5+%{#*~<3^leX`!)ZASkrStlO3QIIVbarDm{G?G;7P!be1Rj!L(S@536k>nv z!y$qW(-B#Zk%colG>%~D4Coyk+<9r>MaCZdk0}JcbOYbvrvrL&MI_-)&wJpkDnP;c zzpA+`)!xB7Krj48?%d$D5I;%(7OTe77PjlZwj}B(@VMm{V89>#d4_%R{i5an`j@!1 z36%3f5KfTETd8$g{x7o^O zF=fD8cJUNNcCzh*NIMg2z(jm#u!iuJK!i{TP5$xarO7&R@^K;lCsGR4`Jh07@&yqp z%dWRZvRh1N(Y0Q(cLl_ey)G$i9w%TzUfY36pU(Nd>p6Po4x`0QdmO z^w{Wz%lWD(BKr^^tCQ@PJ^NB@@e;HYJCI1`pc+v`J7wcqz*yO@JcKI2g#rS_-^*c_ zB*jT(-P;iTS<@$G|Id%tEd7pz{l94_+EkwO$`zm&V zsdva@W9!|&-u>&{zux_4`pEleJf=X9M`;)B{g!$U&39gOgaXFY-)DK}3Ju{HBil*Q z^euifoUbg|&vZNGjd~CL{R3?SSn@q&M<&TZ4gVsy7md01@UTTVhW3G&kCB2x?!d`4 zu?(JAEJ=_PL^I-K@RNl~2v*TZD~-C$6suXkao0Vi*6I_x{@cNw7mw4!a_@gz*3%IG z^Ypo1|E=UB4Vf2ss>M_H>)@~{{2p@~68A%9FL;La7I|b1bkd_sJKN1L_8Q{YdqB!3 z*W?ECMSny$$WK`ORbF^nKO(GXg5Vyc$wjYu@qGTdiBy?qlRKCHJ(!FZw_{f<>0KW$ zx4zN}vZGbbj2zuEI82ebW^ZtAQacX9q!UzC0xZ5Wl_Kj3%IW=rmM?aIiXR7<8XMA!)wp69dELb;ZX2pN7~^8|EQJ{k_*`Khl|NnnfueYKf8ZF zjV`1sl>)yYQr+aDUpWPo4L_P`D$>JKR-V^|-W7homFE5bX8{|iI1%`53RQ06SEvsm z4Zt|aI-3MMCphI$v=(w_IHt*|8Q%7%d&1w{m*O{szj+3WznjuiOZxUy`u0rv_MC)= z5DNN1di_$uvaTk@epo-TM9C+3Z5Ek0DAzZ1u`bV3Ce0#V~Xdl-66z^ua+eM2(_ zE1II{uBrxd&x(B=D*k<5Po^(S5CE<)1@F>%KamRq%B@B<4r`V0iHrY;d&3QWzB?E! z_m24WziIB_#eQJ@Z|U=2tND}^@XhKKZqGaeOQS8sg8&vUAq?b`Cqc}Fq82+gNv4cW>F2oOZm6UHlyDct3r!hHOhQuzlZzsy z#9%&LcrK$3x4fbI!}_+)=yeAE)XqC+V{R5`fJ&fV}(aESW>3f#&GCo~R?J?@8R zXuE@%LxwUqdI2w?MR@4ef6(4E*7`VLNp6YuU)pG0u6&BjeK#6tYipE=}U3OFU7 zy4zeQG;$>g{D^z;V(Q(-7oC1VEWtU8W$5yv&la~Iyfm%uk8S^=pYL30pZZpsPVT59 zek`xxvI}O$KcH8*{d=C*e=n#7GIsZN@g|X8%I$X0Ui*o)%LA&B{}BI5zIS)-WN9o4 zcp$IR5L@)Lw2-XR zJ%lE^jhX`@Ekco&l(S2!*oGXUDbQcrVI!e^_0}!A!orLoO@{0SDXVSN1VU34B$H>l zF4I4Wdw~`2h@CN0SCq#_hxWfhgncjfHYPC(pMhmocgl!LC_1li9-)T;BTCNrHk^%3Wrg-zT z{nLvfPICCf-R{82VY~?gUyt{LkxkOkyN)a^N%~~4O?*c!-!$RnhiKUFF4_!%M(Dvf zxW7*-dVv$Q+TXq0W=j_5szruLINj_$e))16FKO68Tl_2j(eD$j?Vq;WkKtvHx3Llq zyzz8KE_9H6ETr!4KIz&&a=$4g%2w3N2GK7gmBKF?#Jxy*Nw}b)7t4f~w*5FPM|An# z{n4en7YP9@f-kK+qpr71xfDt&qW2T=)G-(Cz^) zCzxl7KDdw_-^0JSM_uEcJ-wYCs=s=<^+L6^P)|j^0!1aYleZlIRK6NQLkP8J#V8v> zmM^eP$+&PNhst9b3?kRd@ADFSN9GgkD_V5f2~xNUFN0fx6cwV@M0?}IxS9~UTE}IaUY=zc#GW9C!y#;XN-KM}?+)nVhA+*lTBMj)n7E-miXMCBCF=*Z%&^ z;@aj4+w1JLy}O>N$M)j->1SuUzS(z~*@@}$&xK>pFV6aBEc9us9WxIUsNW>TVxtMJ z*Gt!OXcxl!=i|pp^~UYo3erKg{e572ntEUJQpKooBa`b0yTmkgqt=wLY^PAVzz<0h zP|suDL$SG1F7iRxGKO1`+&CbNP$VpN!XbAB)Xp~I(QpO4kAy5 zwHTQZr?_kyG$qhp4<2wI*OVNtX_K)fgj_kPE>DuCGiAd-D-_WP#BLhi2z<3wN+T={ zpZCAm@A~sm|MI6oa(%e>^g{9vF32KUcE~Yd$6DZzkR;^4)Z=#xKi|EcOol#_gMT6G z&;O#Q|89vI=pn#sa(;^h+*r&faK4E~O}o5j2NS(E-DU#I{@(wKlRNwj6wNhqE@%DO z{qDAySlG{ij4tk$Eob6l?F_&Tm2>3`1QwZy$`9D}jnQNdks7eE&gdx&+L$};{C?!I zL-dFi9&)dFDOfss&d4<$Ld9p!z$OPxa2t{1g?C7HDFekOTi0ls7vQs|x(Plf014*3U4~!&<-(89Frj*Zj z0wW(+`2%wPp&sNQ`yXQPFGKjmRM%hi{LyjbYSQk({{lxs4n!FX9F*8Gx^30Vgw_82@xwbLe*o#OW|Ld| zN|;t~<4Au;qeA+?W3p$E#-8?eG5@|7*^J|IAK8)oOV(#f`S?27eV341eQU3PN6Ac!n`sc zE8@k8bzfZ5pF%z{_dlf|n#;T+!T-zCr`@3czvs^_r0;*O;#1E3Pi8vAa_A7{yG$`o zpS(A2>77u0%TwR-)VDnKEzgV}>5^yf^z64^PL9#(`@l6%`9WliXmSTr9Uxk~0r$7R z{cVe5v%Duxt~{sOu!nYy#dJu(2K?-3aSb=(5T4%*$cTISxsCPX81J0%b$?{rUyK*G z{LlY&eT(gMcQCm*1xb41@d}Bh`x_CeC zPH2ywjBPf)^@r3k3siyU;prhSp$5DZ{yXVg@T%J$?kuJxcYickjOaRhm*hPfxswi! zc0HNRY@=XYr09g<)}=^EHTyoW+$VEh|^hTpfo$6GiWY|o&#wC`?UzIU-{ z!^t)*Hz?E>N6p_DE&J<~xL$`Mp;jcbpRMg(uB9@4ZSnJgzIBjW8p-w%s8mG7I{7OW zTf5Hpa4+J{#?!JedO)|w1HyRjl8P$i`p$88FX2cb7VE>z#$qk-M1fxc#!6)g2q=gq z6v@@+NN2B-8@ioaA5ofUe{T#%6IapBp8fG7*>0K*F`HuO472W~e6CN-{tr*$x087R z4&dYWe_izS*@BdcuDarpktPef=!M*BehL_2B(}$PPB#;Gt25YGKtdBPu z+VQ*I4eH&X-VNsY$d2DXe0=}zeJ|ko-TyJhf3b287+|b=C+|MIJ;EjZpHD|`Pv4xL zyuSE&();xB?4tMEhZC}Z2*0*<)OppG-A@9Tj?Mia+#3lUDlf=j*nWZ2lNh$_XYS`G zrtl+=lfVKSG|{ldr6yhI=0=_PT2WAkWx*L@m<5BC=GhQN_Q z7__g*h29}HK{DXn8~@wxk9Xcq77qAuoK5a`X%Ic7`+gb^$?)hSs$sS=r_N&7mXVx( zU~+tYJ$DZT@4mfNA8YW$15 z%&W#>IEDK2FD9g_rZ0@1acKM%lP{GbK;nahe36Qw;p}-n=E^^;7YL---P>!cpZezj zAl_nRGUDIDOfH3_vm(=7jVAqh=V|0~=9J=DtQ_o|LFYN73JxU4@9{u#@~b*GLu6hM zF%COFM81Y6q;ERx{FswX`|OYbzf0O9WNyWD>!*! zbJ*XP=c2>-3@Df(EbpC7{qBLN6wbb!;6*#G24JW?lps9heT6f8B-vBQAD$BNvMae3 zp={AL!J@-H4DU74iQntuci-@d}zfuWs5Y(kBl9om?<#fB5WuSm43PeHwNC3qHa4uhuj4AI8%H-ktc_aQr{9{fBr<F|*@!hBxdx3eiC3OW{al&rI;bej;Xw41w&+hJSJDi9PN-+En zCbyT)*qeh%E*c?XJl_(kAh%qL^HyF6XQqw=;WoMvXxVV4g`7!cBjI4tqqt0qh)lwp z=&7^u+#BRoZX3!VqY+H zZaXPn*TU)AG4G_$V_s~3o%SV#N7rm8x@M0vydYD}qTi{kIezhU=6u1E02{Gsm+`uj z_#5vn1c{;3**RVY;<<LW_9H9wA@LnO#Pdj~Q6grm4$W}UVj0Qom2q^JMUNifW$k7dFy z8+y}>y?(BMKEt_~+Qbn%|KOQ<>@*B+R$Rciyu67E9(Sc-*R!Ld2H{6s!_kAWoTP+7 znZJPioHRl!5-&SkN9!O$O(hK9X><^$u&9AuIkNjhyFVnlUSA{Qy?Xd&zD@ll>hm`k-V>+TfFC$A9zcBD!lADrX^kf9GICQ?i54zbiIl=hD7I?22>@4| z_qg6+>^c1S?%Gp`pIK}~MD>H0bI-{G+yflfC#Sem3EXdIE?Xa6<7tJiejL2sxEn+E zKwl&$=697B1jwKaI(dI~a@Hd^s#?7ZGQ4&0I3Qe^f%E!`u{AX5MSLK8_Iox`_IN|1 zLPy-Z`B!8ErG9%F>x(E2vVTkWrl{=UJ!ir$RGMyQgX%zYK7CA@^Ke&^CBAXOW*k$ok}eL=?PL&e((lQzX~nBRYxLF65*p!42q z<`98KjcFSX@gE)GCXJVzx`lekoa1?Z--rMYjd|D4#GepJ@FNs-&V^qAJR8hQEx|SP zyt^xk2ZFG-31l75+YvLO3>n*=*Xf8mrs?c~DHX2W5ZvShPns{JZ?Bwje|GfBQ6K_aWFY z`+^=CmmN`q-2WW2>(tsxqp|peA*CfLF1PY>D3EsR6l|h6R<3*Dsy~H%68C?DYj-mG zvXmFNg!?~xrWv~bgEarUn$HUNf1V{7#;d+d!K*(O*WiBide$F8;2VRan2~ikOlaUH z^xnm@qNarP4p8p^^$sxeN7?}%|8)NT?Joh}aQ=^J_h|m=iH1-cE^en%bTk?njS-mM z8qGX>XdLk+sK5CdV`UyuE{{ABE}|UmvV*UCZQ^A3rE#>o@P7$88uqgO;b-l(Nyr@` zYqu@M+EHAA`Rr#$IPqsGJ0jUXM};%=D>lEK;%XhWoX#Je&w*<(w9R-C;7S0;F8WXr8LrZu9g5ejQPzJ^2H);kjyny%LBRrtNjj7xI_1KxiwJqFp ziJNZHl*Bo~rHfbTl3~BWahbpjV~muZ~^Vqs{#(?1vCgh!~{F?B5cH?%Kn=d?mjpnnP3EN%p?JyPzZ;!~_F}pto7wu$Z;r1CgqfVS@ z5SYL?{)ssn#}gUM)!?#d=1gV>#@MC|{ta<&#EZc%0x!>S-`5`9`$0#)!Wl^Fhr`7) z2OMx9v;UCWp+lTHTrYr=@4N2e)*gBX-obIo%yymOqCeulfwe(|C7Ybc#RE1unF)n` zYjpwu;rVt)1-gjonMxiedAYkbK><`;`sDPh$gTGHk zL;sO5lt6*E{jXkJdLW;{v7le~pYS^3i(}up)NefNPWW%e{C-r<4b^_{cFzNv`uY%60m1J-rU%O&t&?5!Fj-k z21z86nNKlMYXZ^Uy7EHca%T5Gi&MQ+x?sOjP37WY;Gcz;3x+{l2}LbWF7bk&jEocG z2{Z14P_ZP@BmC!M`3>Hmf3gnYyHtuBO2t);dNlnLcVe;GeR-#UGSiqo`cs{vKbqe7 zRhs@OB>GBjl91=PHog!uavg>JE@tq0yQCJp;^ZwNU5kOX`p#=*znwg5{Cj@}5gYbl z^}zP{L%ebZH)TBAc5qN-ff)Q3CIgiIT7KQQN?ksQ_}|je{}S;(tNYXnp8qhPKh^l( zDn4Zbek}YSiEs3T1+?;J{auadX+%#WdK%Ho`U#)u2u1!AeocL*gA7)MT<<6-YGAgY zf!PD^B_NwABkcvZL|s458+fIiIc&=d>kPa}`a*6L>>Kv(^=`*#?N}YdYQuU@j>G5U zo?=`*ANv#n>d}l|v@a5Ud`m=8yDz^=FlzV3%daAe>U1AJ=J$jaW5)XDg%7_tX6zT?+KNEmmT0*e}Gn~({( zcz7P%7%g@coXHEm{0+44IgQR|C~{8Z=LB%wK|)UYgPc<|w2p&BTcaO;3rjT61r-Rg zw1ZVP{LDP7u(2jpHurN^_`xzY_4As3Uf>WMQ^-qy2<8oGs^gfxvK~NXA4I6g_`m-b z3nTs5jnLbJZwaciYN(HA+aUora!0@A69+Gu_Wy?{by+b@}nvJh;Xwg+dR-p zTReOMKEYN~_V7Dt?1#^*e;l2k zpM31Kwog8OeE;z~Kj@_=*S7;HE=H3(dv-xu z2^WIZAbg|q4OGJq=DNk4&Gm=tosyy>i)N2#N>sPq4waNK8128ds7?KgxFuHxo;_l> z9YASrAoQ%*68>cA*VBj+FJ(yCDDi~Iu_5t%2}H{vL0;2JmomU>jC4GjYlQN`%LhKn zg(C7Q#QU0AJR#KV*9g^l(PqDGG5AyxMIpvNml5NiAjTDJ@-FRbho;B2PLtw|K%YlB zj_+AaNwf~snPs5Wjh&#C8jmU1|8*B=%75D}n!C+^bMU_G>$yF;YKa-!No%)m{@Iw1 z^2Lk@54^a>-FDLI3oS47GAoIKDlCL@ChOJ|Yo~fHI}6iSKx43eO|g{O;8kZ)ll22y zTu}S4gcaAWOD!pJLO970SWZfd*^<_iNmIt}%S;)+f6tC^FjWWUii{!B1uSmeT!;RI zKZ*RGix=k`lZo96Rp&w}Uw%{?9eVDBx9=e-NO1QTMr3GqHA6LBPX4xg zGo5byh8tgU!Cj4WZ{zaAb@uM zPp|PWa4a3qA%P+wtsuaZdXaZ0#;r4+&?t-GLz()EiXto1;%}drZo$Q1~nA?~e^E zWFkDLGo|Ng8MYKXKa>m{AI76J@eRl(Rd&Igw)xmN+ws(i$13jrjw;C0Gnv{hZBhgs z@B45N`O=xs`gn4l%wRriUHLu(J9wVLrSy&C9d~|@XVlr`&baOWF=2jO$jFTc87wqQ zFqn)Mw_`C4%uImq;E`i~1F9ltG_h)(nLWC1<1zE3Ke+Lw3=2tTKac|sQ4@8ypjmGx zaQ|jC~Bqy9AnkznAqqKH;7Id|moEjo)lj!o$$8gVcS zo>5N)6vKz~I$Qt?e#Fp`9o$uR3`aNz&ATZGe1Q`}EL;CE^vDZ(PvLechFRXm( z-jt%@;nG$>KCcGs(iHzLhUyAgEF_eE6jSpWLn8Pao`o$Lp2|N8hx94l_6QhMNo@h! zFno1*QZpTLu9?@)bK;{6-=Hdprc5dh#sx2r7&9dz<3F9>0|8C!`FkmU$1jte6ZlKY zj&(=Adc{BwfGbiYhV?mFHXQM`k*kq?NMko0WCOrLw0Xryxb9HP`6HSrqvL{zK?$Rk z7JBP}!VXCP_uDUEl}22N(KeA#Xrip4CO(o%VC_sBP8w3UyrHV&R+oNLsY147+Vx~9 zN!Lu<6=(sf%F4w+ZAjYamLwTervJ*z*YV2XGV@GuD+&Lp&YPkRQh9P=ik;0v{xuw^ zDKK0~@n}-)t8urRIY2Scl@8ep@9#_d>HYowU|_p0k2KHMQ#42KqCXql9EwVydGVx4 z9$`zJ@xzo0yl#W-BT*}ZzkK$oKQkT%>mxo2n6voE9|Of-sY%c-?>keT&L(q0vd|?S z9QlFIBVj=Mo$crywilqgFbL{J+@8Zvea)UErC^;qxZfsw(sE9HoGl4^fzF9 zlHP06CGNHJg@I|b9I{X&K-K~;Cs~vr>ImJ>?4PONs2~XEAE`i4W6bZc z`Ev&3o;ycY$lYDQGGMPvwd6GeFUAoDzld$nm?WrZJ*e zJb%ChMdTrPgj^33pC)NV;IRH%|OWV>hrB)|q7^yb+pYhSMssEIWO#PdPuM(o7vX*{)<0@AJRsFz4@TOa0!z!oY?O8`#A+cJg|@y7T78%2FIus zf^xVF&PhgaCzF(p4XFa!hx^_fZ;9z_z#5cCkzj7>VH9)*xa*E5^FDX>;LrBZqy%Z9 zh$O{G_90C398NI;KS4e|Za~`6>=^ies;vb&Z28C}Z&qx1L_8O87u=d~Xn#MhWLgAy z#EQTp(99NpXUGZ#ILKfEH-N$MA5GNjV><+}k|;;|JpeTDt&_4o-NWFTDI%3nYj0%| zTQW*jGRjf1nW|(nN6A*IlC2yiKTTEg(;Ou~OI7l-93?+bRr2#3CI67B^K(5=nTU#*9uouZAjxcbQF?=t^MGoLHqm_FQ_lpS+ z$sR#I6rKcX`bCsTYpwCr$>cKu&>8S_& zT&1TT^mCP-Vc^eKe)_>*QT|#d0C|K840=8vZXAaQM2dnCFh@<6`Evvmz&H3J)oHXO z_Sqv$D94Md-)(ygW{78NwK?O+!s?Ms;x^Dn2jFlNlmW>++LS01Hi>xBnA!BiGJ65c zSRS+k8z17!FF+~))f5L1$p&%!2TU0puLJYq5d`A0^ezZo zD5aOYjnf4C`yt{o_yaA2?6!{EXh`dWCsURzLLE+VrRM6AZ1%($v zQbEsB7ZhIeNCiDlT~K&=BNg;R>Vm>68L6NjQx~LIw8$2@m%gYZvHN!htGUQo^gb%zWuS53Q$>)VaV(AG!-2@+0T-qsqx#?XzMKZU??qs&V?;JdN zLNWinj&K+%?p#T(lTbX8ZgJDO!l+Zv=0W{0HKPv#g^9Cz@L3$D;-w7E?(!qtoXbq{ zp{g%4%`5eocd8E+w#;-NDr}i4KUCN<(|)M1Wv2d6VarVap~99~0)z@%Y8eo=+NG8P z;o>T>90+vu;NStv0>!=7s2d$HF}hPMA3eo_Yw!PZJ9Wskz$bTu&hBt*g$40*+zXuO zf?oll&gS;_BhEt~;;D(9mB9t>@53B%L5~H0!&>D>O~Q9@#cMDA{lCQfpI3|Vz+El^ zaQyvG^!)iA3i^M2{sWETV%I0(y5AMy4#-eRE%H_#K*7FGdT;=Ei*4K8UE^#rXFZo5FBFUElNJ`1 zQT}=b4{lHh>FPJIMWg{sLLyu)9Eb}M6or-wC9u_&SMn|~F0!(lVRHhzA{WZ~qmk>e zEJC4BMzCD^!(`@u&tew04Y)@*8M@SQul*GdF#~6gx08P^@b3KTo)a^^7(k+vmFEIN zy!x*oZSwl$7>_e2%vMf%7oX0KKK|C~U%DM!(3|lEgr|y2H~{~xBq9DQHl^!~SxWp@ zY)ZT=W-0MsaVhcWHKHluulST-r!*!0BR1iL*F2#<`0-7LC%lPG>HayxgCb4|f5fI- zT-vNm{8wB`TAdX2xuQ*p6J8}W<<)31nGrF`UvWuClWX>N{8vK4?p}u_?C!-Solfo$ z6%=bJA)%R0NjRlNQ^H>fDW7^NpC+Vy=B0d=kn*{g@_9naAH0-5#HFNth$tz(58=nm zI^nO_lz+~6k@0$`R-DF+Y5#?k3H=v8W>Ugm?a+?%`2D*NZ%=-`cyoMq9yegjxH;m# z;`{9Q58h|Tf5fGPqvA9r{1ulHg6Pqd@K;<)JPWYV3jS*QTUWW#rza;TBt{^N*<>0b zlN5lX?uPf~|8d@fzp}-2K4IxF>tvAAa1unct2Q2J9Pu#EvzMzHdeSBs1#! zZP}-d8Pg1x#F9umT*jM{J-dRGWT2Z}C8Qj5yp)54!SlB3%?7vK_7;T=q6S9N26SX3 zf5sXP9_TKa9OUn~#H0-`9CyqoJo0B;jz9K@Iw0*IvBT*fT|Z$rc8I?2-`@7=7)}06 z7|$>Lkw3O>FyON(m;4#qGw8{8(ls0iTOZpVq$99l1OALF`QF#peXPFjeSO_`Bm3t0 zZ|A*}cNf3V{uy1`1;O&DjP&nVn-OZ{BvuKcMB6T1P_Vyab<4(WqTHmBd%;D)i5FZH zrVFxb0;;6%&cO>HTSwC0Rlb`cp%@jkdq_}8XAF_9FYq1?z7e?Z;+m3mcJ?hc4>%5m3urWt_boP$i#Mg0o?PTxZ2HBR5We=1 z4ix-bTXf_UmA7?^SFRn1?-Kip)@}bQB*Xtr7==a1BUIY?@e%%kf*?@Mb_g#rjDKw@ ze$4dwS4>Tq2&xX&F+7RVlo0N6LIJ5t2=zj-fK(-@`v@;4O$p&HleHF#UX)Rj5&epl zlBR@+UY4N*MW4%9i-=z6$$)#~h$3W$?jwcu5oxMPR3}-@CZ-}+W>ci20nSq-B+xuh zO${K|Wa}#>H0KhB4RJ$wY~Gj}r^p?rhZNbv+EFZDyW-LnK{R_ z6L13d6;^UaVC5HD>>)n^y<|>pPb{MolSx=1!om>eWJ_96hGCaGhu{lcgcrI)6t~Qk zYnZW?Nj3EnEmc`wNJ}lywLOQQTf=VKf1y;Wmjd}~Xu61oRWyV3ePo_c48sZBBEKT! z=si7&irC9eZaw4a7jhJNI!AIP>6GL9DzG{CbD_>v|=AWKjnXeioFhsx($ESLfLjvL%mi?YcEq)*7T8K>vp@4dW&K7MXD~PVIVX(o>V}pn7Vmv99&hRJGRd zr=~~7*8@5`8U2@!z8=V1N%((XO|AB$Vb|NpxA<+eKk&~e{PSn<;{3pnzEa%6%jY2h z+W^w`XWJeY0MjAf(#>7Ly+4+50$~bBQogIUr|C;$p^YDl-2ZMu@%FIm-E~rfY z=(rnokK~CL2Me#N=sG20(W6|mdP`RE7fuTa>zys{nlDWbYZ-&`7yfe0zxfKopz#OX z)1bLr2)ksDt|COEFH#98udR9l(e}{Tib)fw0?UEdZGJ_*@(Pd!q1T^2 zWVeWE98$^$zmONI28u`&)gQKuaDO1xY@}u@z8xpNLMf_)bJa9%k!sW-T?}*+1b)Q<@?p|R32Y=}O-zq*U zjsMIo3HE>|-U4BVk8?YN{uE+x8Z4!-``b6f+?_8*cenf0fQ{diJ@W~|f1-V>yWf3| z*B2wFKOR8&hTb#kJ)_<;>OEt+k1~k#$=UJgTR2Dg?&$dAd!^bnEK3y18fU^p2pyp8iN1iXc4H^d796u@;YXm|`& z;4*+m0$kWOtg^Q|LBoG?zaRb7>Ft-XJ86B_fCR4ni z>%ehCaG*fM^L;2VOXrqH+k_Tk`(Ar?sZmprZXqrbb-Dndu|_cK;*v%-oLa=@jz@gb z^wjA8n9Q8HH$r+1z-@=?xy0I0<9$uq*%f*e?vkRxQ9n`4=w5vAZ!daL(hbsYFAzxNp+tjU9rP8%Vp^p?@rHN;r|}}`l=n(Nk1@p zTrx_pa)-=>SU_ywh12;S>mdxRHT zCq1F3dGDrc!d~D3{goYtOGAGPy7Z1((AQ#Ndqfj3=^aE!NDnVy3H_v`2>Sb!ltHcV zAW%uMG4Q^IwMB$xhl|_Wd!i}HP9$H=huoLr{0kcl{(2xPg}+!Ff`x{rBdd>-vqD~+ zL4D{gXW!~TT6X{J+kqf%Kyv;{BXZdPpd8UVhWIk+5xh3=7TFCm;IbD7(a&MD6`w16 zpdc@sGlgFs8vVAhFQks@r+y_`{kGT?fAQ&5p)>K-WN^cq#&--uY_IIifl+`r5}@Zt zv+FLGqXa24szGNjw(W+(E^XtB<2nEz;c;%Vn7bt0?CIRNBWW(lj^>WK z!1jxQlS;;CXH2fX+&W)v9~B^3OAzfYHch(U-S|?MRymY2%;2OOds+7$!t&7najeZ@TKc^N)6a z*m9kJ+dVR&3NK^t;gwM(ZZD`QUKhT5*yxNO#&Tua&?8*aS)>knkJ(4 zXU0oKMGW3t4-$*s36;&%Gdqwg{w<)0P_JdM#a*9l)hNA4;~3qMo_aT#eTJ2;4^apU z3wffHO7=#%(2VD`!NvTG)Z8$!^6I?$#|OL#{Q2bgzrm&c_Hmy!0F}<)wr;l%!aATD z^QK(kbyx<{VZJ3;iF@N*&53MO=X4u3bZ*185-1{~y?8ND#6d|W5&4c3rjb?=T~8D2 zFZwg`enx@8DvNr$9agYcC@JuuL~VJm+=+Z=cI^?I25;-;^ZO6r;|bOq=e^f#3l0GK z__}R8#D93pZt^A}%Nqi%KJ)^3bE}KeDlW@-{E`AwMvEz=y?vlg)#48VIud0D>Gl!mGKQ`SNmK+=B49kp-aE7JD zb~eLuVtbll39-q{uuRxAW>^~B`ZFvCwDJr@fR>zfyL=i{cXGTa;mc?bv?Y_XGrnOE z4#9rm=5>Dr!kDSj`I`BBz2LRu-#U+Rl zS{K^hhUNiVfx^%a*fovNGwZfHJOL9SkN_nmFq0BkNeP}NC3u#U;CWJlACeOMn3SNq zmzbgp?js`R0LgwOID;57C$kts!-Dx-%_g@ps!CVd5fngITy!QP<4LG^zz>}aop9Kb z!{P$)A1IE(WNm(xw9VxU_Gsm8lG5abPb;n<-+PGf8-(;7_Xe*BKGRL0_;iS2BD?dAaTh@e?id%k&+%l zk^B&P;l0BvTHqp3b;A>lA{8o{!0N^^SdajvrMRNU4zcQCk_-7P7jM=SgG`X|$w)h)5aWgSn*ELu z{1vs0OCnrO(eT{Tju4J^gE$d0QDc#!rDez92fsH)@e#Q=vhGF4pth6(X%^4~NdfSM z-t6el@ONC?iy%Wp=@=OB<|2>5;RA!pBJxC3s`Si}T$6AIE15g$0(rzG@Oh*%X{0Xj zNc@!orIeRY;;+reD0Nko5^qHn*^~(<7h5;^%{$Sr-f=SGt63Ao z&{Q36bxiBgDT$RT)mj*%6*h=Sx=C#$%Q0XXZ8f88HKNX<+98=ci))sGn73T5l!Ahb zZ8c5dNlMPf;ojgMBLac;3U2{?O0da*+s(xLhTI3_{Lr!MM^>BOZci^+Ao!Q>V~i9rwKD zSEFWe+^CkemmWdFidT%vt1{N(1^ReH{<=D-fSkds8Im6~vrXhjE-I`Tm*YOaOb zYXjA&I>i>SO+lsU6}q*xWfbKFz!1G2_Jc0OX->gupH~P`1ogQ|-Q7cpltaZj5Kf5s z=U>3F(|GthtN%tnbX-;Jd}}bD{;#vg5HQ;ju8i0I zS*D4+me;Y85lz6*O?*ca0Tuubm62ktd~3;c(H;$1gUm(H3Km=(aNE+v2z=OFmU$PIM zBMPZalp)dA!16MLG%LP8ykt~sL5 zOJ%-yAOFHMx9{^DmP&d5KHvS}gd6x?vfwEL_CVjj&u{}j&w(WcFPiZZexY^|{gxC4 z;{9nP=_B=VA|scUl1~JcptKZ6d2%T++i4!}Fi-l^JSyd;JI@nypeNI%{K%6y`Y29Q zkK(YCIMO|QFMSiw-2_xprDHc<2h*o+;u4g9>L$3Ol@HsbJ!KPj)to#p#0hH*Q>=0? zoAQ=<*j^LwnJ+J_KM$?&in$>*Klvrml`u}035~`xH$i*bAyk?Oz+mH8RGPxp9x}}~ zpGsspfL95ybTqvD%i7^(R-fb4l9N>;4h)5OQ1CAj6if>KY}->e5c8n-3j};{z>~`Z8nlUAgU7q{ zj({I?q#+VKhU_8ySY-pzIPxzMIC9t$V)0;OSwL9Ey%nIF^1g8WaN?+5S~Zlo0GOC3 zFB73nMu@9}4;L-Th9bi%J**HFPHu(*5#i{UX*5`)!4YV1BK+AvI9TJsMc~0D0Kys( z)`+l1gf$|p5#c5v!kGc#L_~OHknjTy2`53qfwqssg9|;D+`1z`o{!Lh4J~fjh9!Jb z8Pc?6*qD^VP`$vrB#bx(CX5w*L}B3o6kIA6T-YJqoCt9t@Alz56+o=UK72S!jv7|A z1H=qe#(PN-YNnAUh3m49K947Nk9>5O*(9%LhnD$0De}(+jYSKaRon$g+~GS2fXd?X z3@7k9Tu8wF?Jxb&f(*H?2l)nS?(HW8j8>ga?T1kVt9HgbX5Kzfmo68PZlHewD+&7?NHnx-@7U6n9 zV8Oc^XK+J{AmMhr_* zkIiO-W}|kb42_kbSPo3e?+KqpRbWbN0FjTT;!ZaY*4NAH#pY3z#sSw3TjkOrDHyBA zd%!G%Affn`F;RG;gsFEJp28e3gcp_tL%@OJlK|j&7Ys@9Z_B@FZcWPQP*sMR%R`yt`c#dPW(_oJpjiXW z8fex)vj&=T0?i$7v6eK(O=r#*Z03RP#OA~csgKB8=zPa}mxicU2~Yd$rw3}7I=FF4 zBNN+P-8$pT7H&)9w*M9W;J5+&{!jeM-(LcPct9Sr??=DB5+}4ojJ)FbIMkF@zuji* zKXsH6JelA1XG4z10**Tw^VlTV(4aiyYB45rNh})@_9a~mCz8e!bP5m9g0(Swi*)-; zwDrxeMnx;Db{ih5XJSQ{W<%g5N*~rq+=z-si9RK+rUl-8dfPjVOF$GlCFke7_=d3|S1RSggI0N!;fI{%LDeA-AQ36JC2=ERGuFoc`U^!H3 z_-_Ej7t&-CIwj8#tb(z&Dip>;5JBogM})*($1!%5*2+H89??=!FRj7p_CSpiU!(bn zlK2VQ47Ft`N~9^$DxyXdh2|(UN1-{2A~*`RdDt|jf>t}Ao+|MbqJWyUSP^RxT*~F< zE=WNK;on1?Ml}xJ2N8>vaU1ehw1y-{A(|^a^1DoRP^GVl@JMNjD`q`{c9=kah#D*{ zjA)sfC|U<`{Ky2aMeLm>T^gC+!7x0Z^}SmoF1t1YS3iRHMqK5^5trT^iNDK%1j43E z8JjNshUhmIZ#I z191})QIjQ`V42FKqGZzD4C!7l86--kbVerU{g8mP!JfW6A(QHgNKj{KS}2l|NqtR3 z(NYobOmkHvJ0p{dkjZdQM5s^FTS9z{8WPrQOy=7nUBbp7O~)9Tj?r|Creic66SO4N zE@jh*n1D*EM8S9+Op`Bh35p_L!V9ys^A%C>Zc8ILDMG%@lMBbpcqiC1+0WM$V+x_mtZ zLsX?WnKj%&kqz}hEE6H=t~5Gkbwo_K`dR9~wS{FnJ9>9={^98Of zWjuKTavy#Cc=Ve`Go17;-W?r(e1CrN^VWapPc1*-Mr<~Ig4dYye?M`?gVADWvu|X8 zcrxhE=C!OGCcE z^Q)O{8}8(4jwexj-?*PFi~*K=W)B?z2`(3S>F3OWVSX~18MhNWT;3Z{0{(F^9@;ZP z-{Nj|>v9tLr?XGSTf8R3&wjFT9s48W17%d-;*HzbwIO@orJFzZ#vU4%_ax&Rkma1o zV!WB)^80jSYCGiC)EBHUP@f4Uu(z=?I|df7)t^HRW_U3G`5?T^y#W)Pmo-#>znVkt zUhoDlB`5`t>v-pkMsP`M;o4V=QHM19Vs8BXwD^I}@FmasqemlU4=QooD z+}W~eQ4XG89bEDq7|D1J5Ga)J?&Ra~&p6A`t5ZBz{syAIIqjXDoSz$S-hVWXj1Na2 zd#A^r-X484K79K4;r;o^u3?q1Z5{mrD1^VHKbioJi)+oS%P>yyu6=?R$SxN4#m#&^-GB1r?(S~)db|J| zeKMk1-6w}25h?9_aeYm1$hrH5_aU8YXNXlf`d`>g=I*YGTXtaMie1~gV|z}Tad9o? zk+Qmr>2xxit209~rja*XQ_h$|O~m4+BO7lNNHstoq(03L1d9wAN&ea$|5^v>ljE&~x{PgGyuULem6XA!_La0RqY{NMf zGWzhL>jNFRfYM%IWpsKM-k^0z1{S=?9`>hj5`-S{nAxxsgfkyd4k&G)8U|h5qF_$` z5V%X4;t7`EiMN^`+JjM_uII_v$wHf}_LfXO0a5WKWvf~L2lsG`Vp73+^5E$QTU(4l zzZgs}@bd6t-oFNJ5I-pG<;GuI3<>k74SG6&ly1NcP@62V4^+<|V%4+5GxBq~k?>NH zuNM(%qx7L_|Bh5AuW_)3phW%^kDAx8p`);p7_))kSdV}Sqw8`h7gl*>9-&EEZ9i{N z_7<+B%7dvfv5z2A+O z#zX)8>Qr4hRhOnJwSt{g$xv23m?h{TmAWuFbVTb4{1*hpblpqqgc?Rvk?BgPiIIZTqXY{dCEG z%-Th|d%BO5*hhk?ew0)FsC!ands4b&xc_ABab4Zx*52bnS`8?_yC?Nbg$0DJmM}A5 zNcE$ZSUinXP0J$Zv4{5M;`;UCcG|+mur-}c=H!CmzWQyCBw0m+`u)JzDu|FEa-|`C zWYB+qU#QF0U#tR)x$)wKu?@chYZEGVcejK8w+)G;{sEZ|$zkCK2tu${V3a;dFU&PK92Gj|SkAvPi!4gR{z zjO#$kBBqwJ9|VmsvfzLz5*31;SlUO5BH0keO1>KPuP;D={>ZhZ@sf-se1v@bm<)2U z$`$y$pkjp=&1VbwJ(rWo$a~Mrmu$hr&Elc)l^tmh6v@WumS6Ns z3?uj!?i z@1WFqDl}-wr4X3{)0SwSY~FhE#Q5Yc`Xj@g_XnSM-1$8mof;2j#KpDHR79#8*DD|e+YDdq<&5eeKURR(0UBzdG=YK^@ zGK>@NR@4rk`*sHXY5#KMUoF=sfAz^6cSIu9BzsC?wV zyEliS2Xkk9|HU34)iZiYe+rlMRgdYANN@DP^QZ&I2J_(qp5%|A0IGr424a$N)N@7}wZvnNvJ(zd}6T%qNnQx?Mb|;AXqEaqk?u)b1~B+(m^~ zKq2Iw;Ab#|q5T!F9{Vt8V9O`YN!*FxkZ+8Ofnk!@nB>?Zi_F{pbc%&^J7k=2=HCmB zUU1K#ZeHxGD`()~7w;PHS$SKAhf310GqAOx7a3AG2z!m8=Qm}SADjL( zcd%0L{dzy2;*o@`JA(23OtvCRqHmW(dx zR)hY#W3*c24zct5i@mn-H-mjK_6^PiE?98IJHH>&4D^ea;oFu6b%ZtB8eKx2 za6;k$^NI1ZJ;G+?nd_-(jAu~S?a%JTz)%C?Nr;RzxDVi=8b)fizPRlV zW)srijepH2!wFXbRNeFLg;#B)U#sfRz59h-f#GIn@AAg|lV3l4y!dc*etvO!_WI=4 zi&wv0{Brd6)5(@_gTSD-3jWg`5%?i+bKs%(7&f8=%6S5-Oo)~R3pL!eC!+ZtW!H107H+Ep)n!tUM zSFAb2slX)?^Kq+BTA@F}3-&QMZ0)4xy$_P#QR#sf=Zrft6-}9E<1PiohcH+ghW`+cl@#0}J~g)ppo6!{ zbG*v+p+3@2@tcUU`DBepNPc@g_^87(^nOvN_J8-2zKcluE|iq^cX1&gYJ13KVTbdFb+C;?1daXf_F|Rd!PD`YV~)i|1E}|e^VB&@SZ6b0^j~3 zU|}$8q9eO0W%lqT42&eU= zI^LiVQ=cxcOIQXrjBinpy6+C)`}n%$n>@6K=PXaWes!_yCnt#xh-QiRwHdZHRWa&v zyyUDHuN<}9kr0kVp(`eq#N_%7BR&^y1&B3EyUus7*-5}1YDWJ6Z>ee7aJ@@BBgdw`dAv)^BG9bg44 z$PWwu2Ug6tEfEI~OA5<1vRd;1a_GO@Gcf_QFUTFlmfAL2Qfqh@^I(ekMH+mD6Pq}^ zBzrB_Lo4`z)Pb$m9c%~iU^F2U4dav?mlkw1a<1|8-2!*v#MLA9nCFQlwkhQ&sVLMN z-om{h>YPqohoD5B88Fv#kidKBSpdxpu0iAS;^z@r`@=8bW4#s3;{C2p4sQ#+hCd9x zV>Iax&*w8|Nb?aB4rCRQ$QI5t{0XnUgGC6vPwFXBYHvJHmX)rI_CZ(!;$yWMqyi*; zFdw(djap#v@97J%gGf@ z9w?|Iyoo%Cu>+yd4ofVWL%?gM=wO$-G!A>n6}xU4FPMUOM9(2Vn9L7l3#dhyY+xgV zS6MduovfVjA_~tHeORNCu`AK1C2tiKK~4}7I`0z|lkdkj_TaO3LX`aUkUmi!8enbb z=cGxgcBEqj!4*ZDEq}mP@q%M)+e5M_yo624oZxVL)5|uu+xYzhdpcj>UDZ7mW}D{c z@EdXDN;Y}m7k6g&hcMdHcB7!VcXfP0IED%Sg%&}e{4K+KH`^po-|uW=TE>P(^b<*c zLD}{=C~lL}WedpeLFf@;kC6CCvG(jLBRq5yav^0dly$e&jo5DWyefG6t*wY1R^jw5_!9ucZ+Pdmpo1%^@+u7m4@!jcJ%ahOB;rZh5 zpW5nOACz$Pt55>p{Rt(opS*LEd`}q6OMVwJlJ9N0Sq$|u^>z`l{bJWEMzwQf8>KGa zJCYa;@CV|*pul!A{QBUAvPqJ zb-0kaJkn9cr-^jfjy}An}ZWgBef5Xiy)ILpUbD zS4ZVKH+;p#T-(_qHSGQXXO+C$QpEZuZF#c5syaI4<@NgMcL9WtlcP^}Zv|=hv!kP= z+*bLkFGU`D=%>_E)_8lc$!q%CUg*&3-0CyUgXK3DLJusBKOoJPz z7DC|U&WsTLC=83xzB@xfC3l2?Y`{wC`+yn*|uZY{Mb0MSc>hX_4@*k7Xi_KXNd49|*oi7<* zY>doZ()c+mV|Zvfe_h~x^$}~1ssHI{*I=*k(fQP< znV_X(KTM%p^%CtPJO=l1_)%2{#bfE~KRiY+!VclI>qbe8ge6rEu#c2tEU7$)h|YMSUXkgFRx|@(-l&6N=R!{uzam_Ee|X4nY(bs zIOF~!lDeB89H>b@qtkrvtUjo%BMMs~P7HthamJ-3gZU1FvE2Q!Gnca?>`Br!y6*Ki`zjeDbA$QBSU6EJ|>x z_NLUUCv#dXE?TQkN<=oJ{HH0nX9=YZgnj{4r;@R~Dtg>-y=qClN;yHu`PpR^#|B+_cDd*dJbsC zNQeneTD`0EVW_54+LE;0q*@&$u0EG7jU68}>X&TyyHWp9X;4rur|b2_2aT~jH5503 z#*$M78m_$3uukjrW6u{9)?F_d&3ksZykzZm6{8}k~?@OC~ z{u?wv;K(?Bk`GW2#e01Hv+7hr^ja zBs-5Km4-!*t1-hoKaVxk0{Q|??%jF7Bjwz+wKLAtnFb%j#@Ggl@Fwh@wGDc;kh#nt zeUoBm0q@yqVHN3)^6tm8)eKYZ6kV+Mlr2Wo(w|*tU^L5UPN03w#+6u*gKMFrD5l3YK2|%@P`yHzJ{J2=eD_1blYv5B!ekLpip89{Kdi*j*zro zIEjP;^4NWz>XqN&`E57G-7@;lzFv!3y?Zb9?tN{dp-=fEsA2t_U96U=Kn9_e-qlVc z(l3dG8B(k?9u#WtKBpEFK6=E%2%)NapWKFb#QxcWOlg5 z6r_8T5WD$$Z<6UfmD?NLVA=Xi5h-xq|C@9){Ho?whV51cYAfTm$NL9K*WZ7gzxufM z>DQk5tBt-ts)@0ME7!R$t%Q6JtCCSp9Q}6LR=E03W!0VgX;K5#pA0hZ41bZ| zmb=O2$ny3mV6>tr_+d^6zjEUJ&i<6X!T7%Z_>cCPH;2Di`($1kr@DXnXUe6sOkq`P zU(f+RDBn*%Q<u~<^Hjv@9;B+Ll^jkZPY&Fz3ww#pZgFAAZX7JJly|O_L*FqPoPaa zEa`KNC`GnQZKtSphbyVht;Dv>_8`7oePLp)|tZ^Vm7Su?&vpw(m0k^K?V zRcEr)mu4ozHQnadcAZ^ceQI0v`E;1Rq~oU{qZ53C)iC)d%=jLn+3Cj;yRx5G#$ut> z)P)DNsgIFOrge7~W1iHTzPw1I!IFt>J*eIw%7}K~A$FR6yQvWp96xI3u2h~P6Wu;= zELdCbNit+Qd?5dgv7dFHfs1&aa_ekYOyk=_a+Pq-%~0`#8~eUj?<&`EwQE}_v3r+g zsq}4TOx>y*M}HOE7LSZwk_p@mIgjs7vrW+yad|rC=K$G0!O{1f%F%!n&7S&L*EgRw z#n7}FNjQp^U*u(nnYOoiO<%B~7q#>nnlm4Gg}d#B=+)&Uj1(A>7KEXYMk8Iflo?#V zD3Eni-zmVQzb;$6MD(4ue%@|)TW=wn$IJyRE&BwUYvZV>+Y?kq`Y7cp3fAt>b;V8E1w80v9ebN-phcm#|4Is zl$I6AYb?}6g#QtGJ>_ch;c2#;$}3mPg9MlL_oK#DX*3=`)jZ>H=0XhBT%|AC!(uq{ z;hGocs)BI4-X$-a-k(;IuMalxj<UY^ytvM+KTs_gzt>)h57hil|4Z2Un-|ba>^eykwvU(HE;5({Am3Z~G7fxP}vUtLp zZ=28@J|Rir-ug7yfE#)KkRK)C))`KP{MarAUMWd zh%v%0G|}G(^{Hv^;0_vd6V?fcz?W$zDKdNZ;i4{0ft_Z(XoywueU+w?*5=olx%TVB zam}a8ek#(dV6H0Q zWMg3cz9n$8norbgj=ni@>!qRhRWeG(GJm$Zk-+^buhn)bv#)aKmLIzGi84={V<-pD zo2a|hncqF%Z-tbhrgZt*{^l%k_ZNQqyJsl7GcyI(%-W0hB*{mVd!?T-AA32LTRC0$ zUQ|$|@#ruYJv{0s1S>HcWF90h?}>Kxy<3lV3Y(IdKdt3;Mxm`;gMH=+7HLzxjnDd3 zcB7@{X(9cP{F{lYutzEzBQ7_B}SgqOcHzL#q<*A@)*2sA`+qUthkiaXPYJ4%4=QejMiUX67zaWS>{nWykB<}F?F_u0&|@5ei~1cEpX z(JwmUmhY3@_G*alK0`KwWOu2V3Fv=)z?nJ*zwW+fb`T^gOtCJHXq6SY!Xgy%T6;bW zHz9Tr4P!4J{?PJ@LH-`%uHBQ5*H|F<cI<*E+#q{sT`!SYwoPwF|YolVd$WJ-j-Xa&cGmL?sUie8phn&<0Uw} zoic~T8+^)Y^~Pe$b$6ZEBb{;Wtxk&3=r_hSQ!Qb}wJ9O5Y76J;kKkU>l(~sNLwIVy zF^EPntSKS}BemM*ySVPGm^%~Q(4^jXTnlU%sxsfwa!iA*p-`6v2hsK^ja5Q*`4(H8 z?enOI7S1KKDRaeqgXka&XGf$^U5zO?yflcOJhgT!rgBTjtKP>muz{b_!-Z$C)Xs;} zL$K%^rH5lmYOS_Eph2zF zUNObUpl`kz>Pip3wq?k;=FB>%o>r47Bo2RRmy(`jh)hXWrrRDum-dQ-Fc#)f{1(o9 z_ug4-5i)F?@dzo=6HhV1`Uf|NldqvfUIsTL>qG=Mhz`DSN=X+mXFBZ>Pk!KDeqoJ{ z@Prwn&+Vw#=7v(+UjRwyao~OC;#|VFFmE#@QsUyQd(q<$2vZvi=e!d{3Y&$*d5G2& z6N4Hw&#fu)1~iQNSUBt42AcT|kXR4~{C|eQBzk^LQ8%ywTofHF#b4Km6%uziH)s;! zE_P-OwRjeJANz{LBlk}}CdIvCh3bkdw))%W3xKdlJ<@lB8iusYovQ&q48aXU@V5Ci zFnDz)Ae$iNx@`B0j`^kaNlHjfFN=igaz293JWG+mQj0Cyj(OX0aIXW@r8A{RiQlzq z<&-(6{}?^prfohSn)?>Q!db0j9!wN4A`V-tU8nFc0!e`aSn!_qFalFA-31bn0umt> z@(PIX3~A_?EMbD^_SLp@s$3va&ttm$Z!-RdWJt0Fgbeg`#C?i^F6Llk-6g?6pf!I#oU zu!JGf$8n-@rcm5yKdF2+~=!|&D zuFpt(G9uEaeb+NvT^S+JI9kv5?9DrrSjn`rjg&{@<`k*7C(JbuwylU*EbJzg;32_N znnbq7;^Qfm$hD59!CZB;37IGH@NUyoZIRaJJo1!pja6(Fr^C~$d8yc%JQ<81y3pQIkq6xlj-jdc-11Wykja?&ai*{X{! zhi%)4=E7Vf{luB@#F?V~(!uEJk$#SZ#$j($gAj|h`LJzC(`HfpObS{Q2;hDT2p~P5 zZSkU>SV{S3Ihd;&`yv>QAM`+jSLYDnXY`JB5e48-^Y=3Xvo958Uqq?HTuaW7ddJ0h zDz(CQOPKJT?Fk=P!CZCc90?y74A~JHvo8)Qww88-d*4w*T{7b7<#?gM{3b;Rn^%o5PAPm0$2*W`VKZ+*= zx_H7zHb8sgH#i~z97=zYabX)=);=Kv5D3T+cLdY}GHd}E+Wvm&fQ%t9xGf-~`gbxM z{u>!XfDBte2I%sH3|m0P%zun7uJ$Jx(hwO*imfH#enyOVE*$vIljrd2`ej>70TxO4 zcy(avMvj2uG{hq6JoPpQ+eVZh@4B8i;rtlsem7#VxOSR!zbb8%v|h0_J<`u8QmM7H zpAG8rBonY;awYbp-cT+Q8bi6rc>NN-b7HVxvhfV|QERwttKc7j!{#Dywm{q_TG=nj z*%lu`s!$=VpC}WRZ?&1BkZ*lw$s6RSmQ#6E<)HK?q4A?1>oC_JKX+wYi5fuU&uOb_ zNxkp>bO`h-Db9jz56QGz%|7aYZR3mlnIp7#$Rq`$!%QeiT%k`#duB#omC(3XPYAy`t-k=-YPFHdgr~#^G9AcP@@HXLgUdrMm#gr z6-K;iQtu9+32)Hyo_&Iq!e=Qn+dR<& zQ@9`RtSS5AfP*3=4i^c0XE7E$ao!NWbSNee!xaipa(IA%&JZ@8+jU~WFFVDD!4DeB z00V(~=4?}qfRaTKsvAZChW}Oh2#BdsYVFu9IsbS0K>kubD1l!7OZm{XA)Nmmh>FBN zO9+&)gvJKLhmTrELBq-2fH5SP3j+VvYz@fI#Fwsw8FWS}gc+f9-w2{m??{+SXQ(8K zFX2bME4zW8$!fg`+jjlw5aJiEJ3_i|%eIL5MZru_e&aPx@i12{d9!VD*2MsY6JS1c zoP)2EFzcSf8(tyG{~H)`kH|>(1CYo+@C0kBQh)lDtfwwefjlVLAR@Ad*pVm}#*YHY zqzNrEGOeS<)UG&Nu%gi7Dg90kSc5=ahyPmFnemiBE@^^HJ`pSL=ye?~P>>@0-tPox zMfiwO;pv^C3u@^8YheNUn4$9iYhm$`{a-CCWO7q1cvREn_x@g3{zm}+bzw<_78VVR z=I|QZB6(|$(Ddu8pfG^~Gv9B!M_|eYk$h-xbF#pIN?Hn11a+0PUe|fqiWUy1MbR=vpa;>Bt4>JV2O z-LH+L(~I6gxz-5EDDkt*N}j|$nktJD#X=HMI*Ss93=&aOlu@}a0#*v?7EdDTfg+NK z5|LSvc_A309?kr=9ZCNy6j~!|{wq9$ zxk6^M_uJfbSR_pEJ-l+AN|26OTvWnz=~P+)aZfr~R5}=cD6ZA5x_z;}2)}12(SK#_ zMVni7*jRp$xlu-yut`UKf;bP9lj)Hdz>a)D=$D!%rEdCsA7fBDD=zK|O7AE8%dR2M9P9wYoXl zEY{aJgF{{k=Sh6#+i_KUi}g7HH3U#A7XgVfhX<5Vf~Aa3}OHg%n%Xx7hh3C8NKsgu>m9u>{zz#2#hUyd%h`NoEly9 zKHKItTOmr+le!%gxPqNm4Or2s%^G&YU4FJ=_vS{Arh1zjkjJlN0C@ziq!UE}c?7Ni zc?7O7GP_7fK=L5&`BNTIKps#;InS+iu)}UTHm;JDRH7{Sn?@zj381B?RP|q40s$>i{RBM& zWiGbQR=NUKfFgK5p}Hm(y{`aPUjYTsNI0X;F^lUi);C;soi`SjaGruQi#y^)T~aad zbv4#(oArlU{bvC4PB%bPDo8aa%Dh8I5tW`u-1D_wms?pjog}J+I->o7>wBV}p)ajF zRU7Fu@4YJ*>wzMkK2JOm2*{1P_0v&C7yVaIL2YhoL{UZngHq4H6_g1O%x}p7$baC` z=BB&i==#8Z(hkC%lBB0}4cxoi>ZS(KqbKi!0t4vUyB^xJKu8ah(ESrb=|3?DFG^Hr zID3s}??`Dqa}J7eE4LRBc*|jI>@<~@y&U%;$YNQmC{eBx+4uSh$B_;vqrgj_UH$rR z2M4T6&95iB+Q$3zjc6sSd}`WS;iAwY!@4-C-m1xuob z4b!0yLWsud>$+d=+>(E5EJ(KQ6QoQ3_3c@<&(4yoCWX#oB->HJmy&`W2ks@(eA=sq zpY|-zDX_QLs#jejYKSFnP(caSbj~cP8;>8rbky`%q zT_0>$WSog4HL1UafAOC$=`?Ahzf%ADc zPyh<>4|T$Z(u06`6gO*~u0hNkdEopMM#kCkB{;ktGgpk)3t2I;CsvHR5##Dxofyc9 zS%s{a)hSl5YFX!!kKkU>n7J`1EM1AGx*WaeNut%--@$NvN6=7OC3E7#tO6gV?lwdO z<^}IZ1f{z;^(yC(;q91ojHyVkx>_lsSDk}mAF%SJFLG)lo@tV1wcApUqjj z*qK#SE3hJp6@NT%&#ijko@_9Vz0shXIJg-PdeQaN3lQmjqX3jZzp9w;2TU?nae#{* zk`#GG09dTlZ;h-?7y*-TM!6LGU(z7EWjjNRrJJb7;oU^{+pZ}N!|AZ zz$asce6scUMrDX-FWonZDgTG^@Ve%8@gI>UJYRpnT4zAlYvQ0@eXuG(vsw!XSpSOi zVXezQ$rIE=z%VUP0$(pWNER4mtiYK9hnE1!zaX7-ZmH z#$L2N#1BsfFvwPG*YVw@)rs8cbJHUU8sOUsnwiC4{pV4?z|c5%-Z6n`eY}*VKXOj7 zW1jL!17wT5his9%kS%f-*dmz?kS#I<*&++`z!s5*Y>|#PkO=@@JuP?kgKQCR7usdW z7P${?e(yUDHqNA+*dpKlv_;l|En?w9=}QrHVvEcJTjcCwV>~SvR%0eOYA(Jlsu_E~)Qz`ke zqGNZ9ruvSH4$0wlmEIRC3z&mR%40>wUMw5Gt$EIL=b3C>0RlVaf;SE}zfi6z% z*U>b|2Q4oYitT&7kVqu5zq7LK0you6aNNk)7w4fo7HFt4IDelW^EjRHxXh_ZReNP2 zva@9fjBk5&zs|tqa874&VXb)E#bXE@Y9G#F367qEZTJrOzPt5csMUW7pn3<~d-ZT` zV!y7tC2{eo0oM_Fium{zeR~z_rW5l~X*)0Gi_g=u$6{(7Es!&DVFARL)ZN0%)IT=1 z@5R33QqsL&r+elI4G^fM-LI?RIh-@Ra)h3wJ+58%dwhw^!0XURv*pDS)JmN07*+GK zy9L-n-7TU=Z=4S293(;0Gsm?eN2NP17rpPmF^`RE+FHhub$k#Jk0BzME#G&xl#XqG zhOD8VUfKIz^!A61#YeYY=j;v}{rAOzH?q6{ypbL7Wv=iY7vPN?iyI~$yWnh(7YZ}? z#d}Te|4K$uan{b~$o3Xs6775jCee;dr@@6BZq-L#D*Q z$GPjv3(EeFb9I*%?1uKmi@A>?e@8`mWq~RDamlRd$^zJPt}HMfJBuAfGDbhn?O$2| z7a5OH0bYd~hfI@zmiNbb|Ip$d253>tUs{0ds^iacJ1#&GiMx+29S$2~0jpMrb9^Mn zVkO~^)5#C#jNwP+%5~UH_AhT7ZI4Vn+*q8aX&lSoET;!nz@=AKp1?BfQvpm---RJXc>Gsr0NTzER2B#jko)&RgmluKu%%{bK>AtrBJ=o0MUR#IDN5F0L$i>bK^aOw1COE_T zoaAP95S}#WG4Y}``>E_=o3JNw*}V^hwg_t13fkKq+t?*@bCSQ+B~7JqIfHS+s#>?i z=lSLRJP2wv{c>>XOEJ$w-PXHwntBnpLUa>H5Gt&m)+S_%r49_ce@qeReytSassBbW{xs&I=h@K>SJ8(b zr%5f8!t&id$+>-6ROMn%Q?I%}_=t~s`IWyb?~BbUnKC_V;sm3&L5XBu(lLu$Ps>8R zyjFI$+C6Qs)ZYpiO~t=GC2ZoOAR|HF4x%7It9OR{Jj9peD;B5^FKJ@IOrN^W8FjJU zDt5(XqA%6TS#0}~(r~sSOyASi23}M^=xE==6Xbv>P;@L&+cR9vlhQD;qsp_VQumz* z-;=pG#!|S9Bf;cIjjY>K>5$A4h-U1`>}E@8h0RjWvKvpo7-LZ$XGz-&6(UskiVU;XI)gNkSHW1tyvYZ$v|_=jw7N^JO^&_E73 z0(OWnX>xb15v>Y=@!Lrp2WHUIpVVU;W>a zN`j^Vvmi~|(>D}_!ceNVr*gbvM^%!BQ&Q%G!VaXTC+RTg8fQUi+ea_ot*OK*acpZ* z&%5xe`0DfKNTISqmPIQBW;_0d${eofn_!Uqsiv1{uA`W2bF}7U#)hLT0ey5Az$vj! zwqE+sO^ecuJ!+dGzD+jr8HHJb>2d*_5|1X6obQtjL%msfY*>MmSjwKpxqt$xBvd36 z=%~}Iys?&e${uy`N41tmv+Nuv@wbJC?~1y>Z~5LW4IX3Z`siR~AFaHYUzkES6;~;R zg?H_7nL%`-!9mrsMPVrt2JhhEt5pi~>@y8-s+3xn^JP7ei76mFc25Stra=pIaN9TQ z+6YVG5{{&pYBN@KB6x&l>BUsyp3DhSPuT2ct-#i6R(_mis6c82&{_B^Y8#Ht-aws+ zdtA5lnACg~@CA`wIQ_UinSVg5ea&K{Nd%k93B_oh+tjo*shUQ(I7R;-$!lu*!458D zM&}n@!N)CCW;={wo0a%dwB`Oa04YfCbV!|ucDv}y8*wk`?pygz1npIvQ0Oztf(pZh z=(^2zfc(Qw0!^F;Qdt70F3hqg7E)$QwR@KGZd%wwn81Rw?4$E_bD?w-N#Cmw3*4(H zR`Gq(Ife@uMAtLEBOo;dM6CA1wZ&mN{8J`q7DYcqx@T*r}O@{l8pb}$_ZLqgG~bh4s3 z$g#dzYC{FhnHOUS<#9wBT^No~J)EzcNj==oFmDD&3a%3BCeV=$K;Q7IXGI`$J%ie6v~_%7(>|U;(AqeGy`a+=-_!GENuO@v@lUjF0#M$RupD6l2VJw zuyXU9KBnt=Vz|(gX#s>P`}2_4;&B9ugWs~$ zpRUqDHe6r*ITFh_iuh=aCgsm5bTYAroecUvAPNO#H&j>Ckb^H73bH*s+|$_%pWjk6 ziH=*th)FG6fn69$G^U?KSBXM~V-?^Rxh&9{NYxcsj*}uRHdn$hZ+?BXQ2Fg^1SqI5 zz9Og>EnY(f+|067IH;*e1w4XEB#=KMP9!lO$-$kj94HUh2|=HQg|1)#2; z(9>@$G!p_<{s!6v08O?e2Z_o#(fVsd{tl_8ST1RwCNsa5v!}Zbhl^9}>xDQ(|$U4a7hwMEsUwPw9jm6@JC)CNv_)7>x*jRg<#_KM;-WIARUNV~ezp ztuTh7B^4ByYI#V83!Tw7Jjp-)ll;@LGBE5khVxg^=q6-6sp+EQj#LV*Vn8ZKE!)Mq zm&E5H?puXV1k+WX^qMw`K&1j{cp7$syu*r)AW-~vu#%796uTkEQ!HgRk~XoFm*4V) zme`~$``CA$xsd2Z(&;Ke8dUPAhJ(@oB@HMIN1JL{NbGNk=f?8}G#9Cn3UqaiKLBA5!x0-2P6p7)g8b9~B}1o5EQpRw zueKIPdV*CBpX@kdU_%iq5cU%M0RTx^cs^3@ANkvzN&Hi*TqOKj8MR``bYTjXm}UHt zDjcaHV3+)a-BCm#C}Zumv`+XuQFPoVRW%uCNj^N~M9@Qau~YqxY6BdOe#-%obgUUZdCL>TNlU#Vp??Jud19i+%Haz93UFr*hFz+b-7C#u2nQnM1-aNl6K+9grjzGlpPmfCLOPHRcn! z1EA6e^%={IQ+Au3H8$j+3FF34R3zmivAUy(5)CAosy-9HWnwqG!t00t^$Jk(RZmKO z6o0_FT=?DCliUYny6&3=GheE^t%R^KeGA&2qI z>=?pQ7bIsNF0}oZBn=)%EU&)+CpB)H9g>gy8)VaCUmZ#QF{Eb}@{7bM&n=^LP;(K& zK|~WW1Kps0VEC)>Ax3w*=w$PWRy5`!csNL)f|d#uwE6#SLHn1{KMUIb!0zvYru=t7 z`+QQ+fKK~X6iOt}XaRnjuufV!sD==hV(1KlcvLmo4=lqIPLSi_P;$flSz`Z;=>I}w z-p6|vL7C&XitrD&e%05=vu+xwLNGpJ@GVNBlK6sw^g~TL?c^VtCG&%!Q@e{dq07c4!5(w)4 z?=W>16Y+l$x$OjMAKwLyTql86!@rhGIcT|jSP3ncU?qabLCfU?v|MhzM!az|@rLmg zbAs=H(Gs*&5SgWE4-d`Pi(`acJWYHK#!@QK9?Eswa|Wg|s5r*1(J{Nt{_zQ#TsEf= zjb@-J5=cYLSYs4y$kW)lWv-@ijB==SsL-*sdRo84!bJZ93+aqb8mk;Hu=47X~=Qw%OrCfil=+#sl!_GUZ$l#-IHUZ12a$mly zpdZC!98#EOLlB){lq>1kciuPe299hD7gnIYu9%*sWq(%Z{wyJKoYU?+j;xpj9l&@y zJ?q*iCln?c3e)~LU1*pST+3#(KytVx7*H{oq;TM z4Jo^LNzGY`iRra5&e4&Z7Mc=C1?nUHcJY&Txu>PDf;=ksIph=G6}I1}RZdSZK8YwD zL=;v84KfiaCajjPKG;9bX)A)ZEDIC^k5%a@kYEJ>70L zZwVLHz>Nzt(4FPrOM!v}PeEQOX2fXAsX(#5vt2J`9-;-%G?YWMboo~Hvz^8a=qg5Z zLUzb5lAk-;I<$&ew>}!*K0eMd;kiJARq{lLSfvO$$3FhWC?~227p8lEwi8pJj`bYj zL`m75E!hF5F3oa0tx(Tar>!aFM_by@DvWcE7G&AS<0s@ovk}Pul- zXN2>9P7{40U{L*pL2o|wbba1jbyRNTd;(Os7%Z~($!kvVNFByyAyi9dNPtH4X`9R{&{W6b$R;Ypa4Od<(&f^*9E^-+ z6^g?P)WuT8G*f>gQNhqoJXH+FyFOrs_X}*_i=tJt)Pc^j)W1l4J} zDx=mTCd(U+uA(_Xu1iez9TGpRf>~FRTF2Ze-u+MP(gAj|X=0-|l{a>0b$HMLJU~)* zvxKFAVzRqHBP&32zd;vp0<@j>2u=mBe-zRa1{ z;J8$b!c? z!6MIz`VW}Gbg5=n?K5A4EHTLB3Jta;4_^avwk(YhGl&%HAL%%-Oixg{tY8qu!=mhu zQ|S}!*G|Ub$iUAOzA299%*;x=Jer^)#T8%CN2ip+)n7(yLX#9tIkH5OuYHl+pjat^ z>xmPs`to%77Y-FV&5c{J3R5-r2*YwX(^zH{d^l#Q#WI-(iRQIp!gAI>+)tIl%*^s?e=bbaK8z6T(p@^i$XaW${cZZe!i_o?wn8fq|T3+3|t? zQ~N&#-pQh#Lzas>v4RdN+ex;m24|HR7ypO8EaV?t+VEd*_hB9Kv75>@#R5BHR|b9u z*cluCs9~S1YZbuGzydpC1F|zJPV9_bnY7&ztP-#@rXV|GO1_$9$QIZc;MO!OFoB@1 zPE4TeWdkam>r({zmQon)$?hta*m^ZtJ88qXT^U}>zkQ%7g2XOb1%0&?L7AY+znrNm z7F!d2D(z~PwB17b4U42+pA-<&AlFofvDAjel>e>}(<`5pU5gVBZwm78s#pqar9?I$ zXKEL6rl0_;4X8Y>=u=hy9#m>qHH+=0KGhZYhGs^wSki82rwO^-A4343Ipehl-hU6Pi4f#xj?^dW zeabsh*n7hoX5dBzE@1&w zCHJr)iI`okTe?gGJ_^eMMA<*5;=tXADJvo$E>nUHOJGN(1duwCeI-I!V3kr&+$c9G z4R!r!fiY}|t&~HT4=Jb717j*3^pt#zAoVmsX~r&OnQcIp*%V}%VIj+`-3PMFrhsK; z3oNr;V42xMmKhYysMFMmWw!gLW%f&uo+8oYccfkvI%ActQR#IRIanD)E6?W_dehnU z)w9?k-K6@b<#!nMjll3IzSA`|TnNjo_GO<0{S#|%I#&QoauVfwmroWAP=?zS0kV?C zZWqXlV8fsBl~301*yTY;EBqcC0h)Njzqro_m_pEm!LBN5EgZ;oQ$PAHOW8jv)7;@p zvX&ab=>O$^@|P(Y+=P4~ge7ga&tGOE6j4agUvvtoSxXH9I&A@+WtqD|8?8PmfX>0+ zLpqV<|D>}4&}r~1ot`3Ql0c?WyUOpEiY0W>d>gQ^Mq2o=r3w%*Y~ye5Y?mvX8}iN+ zBL0@x{S}{ypxp|QjckKxpGx4J0iC!_bzlJTlR#((19q@GUXq4($9M=`6RvUotRzt55%C2h;u#d-7O`hDnDutCGdTEUsYe7;;RLP9JDGoVW_}(X$l@ zwi@^x6~N~(fP4-RB;<2=JS4-08c3r!O#Hs#C)QMAl|`tvbz&lH z3}7C**uOnJ;XDyW$kQ7Y!&v?8=`m?Bp+F*q+9DmgG5R)D2oykxHx6Do)r!%tF-Kwx zsu8G2{S!|Q4taXm(0l{f5C(X9wveX>&1TFA)j3Oz>iiw1S^!h!dJiU#BFhwF5Prg7 zP9-0&Whn-35C(0XW)YYKMRtXm2n3^&8&P(n*yn;r2fxDB zAjOjjZ?l<-gsZ%lEs?Q7^YPM90+0440Y8%-VJS~pFVCNDs2*V=T_`*75tbx0+}!@! z97pm3>z@Wd4;+hYpPXNj44X!%A)fnOx(wL{=fD7{MVOHgxhXI0YmJ%*Kinvk_i- zB6MZ75iI1kK(k33!ss)#WAy(MCe%;;*ylz1vHz-GC=!Un@&5~_&I-hw%OCYo1ka@v z%XMjcQ@8~Ny{R!)k|Og(Qm$pp8IK-Wsrh*=?Bcf0vPi{|t^=3Q?Npkeu`lVO*jqmE z^E9W(J`98n#ZJpC?PcJpaxig(TwY~9I<2~3^Z4nUb)bssqG(U~U6%vzvn}JBpYG0G z|E321Ec&xt>~p>DpVk)hyKc86^{F|c>sOe zWiF4diCD0%!A6GRWm&6|(`Ux_@eDGu^|`Uc2F8J<4bDCF#)C`f@7*!Di!l5`g6R3Q z=q>x2AWoKVO6+>YQlF<|&RTDax1L9Rp`L44`nkUKcF{DdvB6!XoFl!-=fVx@TDE}7 zC6>5Bv#@-^_sp55__4l&ymI@Vw%pR-pS z{WEvoDijsOXO75PFvc%NMYV}h-c8+;W5MOQ^a!CWOCGb?VGb`$1T|Br6%<5Brhcd* z8d!bK{^R3kZLL%6W*FNHYk~n;F;D%ZOmlAhKRB9s_p4}EwUv0pqe4{8bCw&pJm1H3 z*^K8Lvfs(}PSQCHOTLzdAbV-tCRw`H6=qEX&oyWBk>%tVq$bmO!sYH4zNn@Pe#HJN zk(^A&w?LAgz6Y47-m6q(d(GhIWULicE?lnMHXOOy^OEh`vyW*OZ!bI$TdO{z_g&jl zdSKb{`K5;vts{~4lPuC!M6+<@zvnLo2{ z&sXe)A^K?;PhSrCWWoK2FO^L@PKTUdVZ`zycIVlv&&{&Irm@OTY@WAk#aaZA`hD#Y zdli_M;}u|2BJ_~#iUaLWc$-^WSwKO2y5z-|aD1sNn#NtVE)&;j=B~D{C+EDV;^y?< zQq8?Yv{b|VF44fPA+#Jfku3KtBb{af))s*LV$P6KK`JmvdM52lT}H;ahf9~SDLQfj zrZ;)m=&x`l#zZs4V?u3u4)3Z4N9d9iZJT_(oJpqPSdve^+3Gsb}X*| z@12WH28AvwHH2m#zWj)IRrP8=*n*vKvSMdFM>@b_fTfX;!E0@y@ommoYE8Mm5q=4K z$tqL<>!HBUu8X|7`hT2pHvfqn6X=d=i4g03ahg8rU6;qDA(F4sN){4Hp4G0AN>(xJ zFy2A>U>OH*qQZbwx|P_ksTi?f|2x*Fw@qWpl2isDz?!$t-FQUVeaDH2?%eAp+r5!g zf25|w{;Sl5bICtb`CS7DsY!PN9MmW(u6LyvF^Uo1CW_^x%~F({(eX7%W!JnrvaV-n zU@|5c$D0v#_Of{L**JSP_0y%H=Prv1=Y?fo4rB93?2IuGwCvS^$**BT**r|Zp|oZ1 zM5o5fP&Us%*|iv{iRg3WdS#}aF~x2y9PrYx>{)90AG2OxL)o;?$_wTXm2(D*2;)SA zt(|#uc5f1&43mdupAy$GxW{GUvC5%3_~}zj1Npte zPpWq;LIS{lhFkT{D*KRn-lKjWtU+RLYlqYe=2NG%cPN~=E0ISXY8^JLm~UDbGk!#r02dXrh&KGANtw^TpwE>eV?P%J-`shs<14T&>ZCGS}5n}f%Wj5w@s4iX^shZXre~zf$ z*&7$Dk%VJwIxzFuNe+yb7;=kO6crV&Fs15DlW6kU$tw(-aX0pIKiC6^nCYA`6PbDv z%NfysF`~P~CZatG$$N_-ax!Do+a_<+`yqC;J_@JFbr`u8S^SELJN&pq5v`B9!^#{%R`7gxwYmoS zXlntLY8BqEYR_FR*k3L(?zvmi^w4_h(_U;5_$*uBi*2Z#Q?jLWxsZCWr#Ymb7fKg6 z&lX;IAuO-ZNvF$Zs<$~siw60oEZ%2isf}ZIV zAdj<+n(AWy=&PJ|jVJY*;X5ggYUl4UH+Q8tJZ!$l4DP;>zr5j1)i?1y#-W#0^ao2^ zu}{rP%r~jLf_UWv7A-?Ml?8e5Ee8iIaci;UOR-|REOAAj*(SqP#=gghByvz1PA+#kr$@MYD!D(jdwF*I^A7ENVdCc#pqB@o0{M46ZzdZ zefNt|hGd`rkZgE8xco3VEP;X4Elz~=n_*s1#wr=fbFdG8{#zdBd#nxxSpavSr+^UANrp=e;E7X^J80eTBy*dR`WfCM9K0GaR!Ao+`OmQqIg0OR7(TFrikRtH0Ic-p@ zZ_U>rQ?k{v;5YbVu1&m@wan3cJuCe?h3=9C%+XvuD}6h5?vhCvejGi^z3rzs5Ix>f zqTnm8`>uTy#(Jy%plJQHO?)ksNm|42BEA#0vm9~HX2xHqss2#~Qf=VWzUsZ_gudZ$ zS0Zn;&`qg8hpw|12}3)|@n(C?8XH&Vg*xn)ZlBSS3F>=snIWGqD{}l)!hY=h6rQy^ zZ^aTReylLuKpuXX{26I3&&#WmWJ>DqnUo2NaN>@vx&%d)G7h(tl*yDG3`3N7L$pd+ zlNj$g=&&}Yw#RCYx|CeYV0>R{_tV=U@2)7Z&dSdn9cInQ?=m@TlZMNt)DLCN31X9+6O%9F6KAoWxI9X{IFBx_Wm{iYJ(B7j0b0Aj%6!ZCmVru+yvtIz{T zQH~4&a1^eYNiW(y@Tk|T9s?A76&p`I%S|+!pfZ8jeu|CUUz_lX`*;?6R2It#H596c z>6Hu9&T7iFCyW>8%41bt#Od8WLe*2C)FSvR%4Y#l#rE9kIzz^b53@X)(Iq+}!i@v{ z$abP&bxyf-a0#T&>6m zJ~!wy&j@anvqTMYheJI_C$aQthe`pn?q8|g_|fx1wu4SWSX$L1_eNtfkM+?6ET|wc zb5mKuJq1S8(VhW_6V=fT3Mv$YweLAjDRV2vtt1O7@XhU5$Hp`g6(qE+AAQP}uh5Mu zRF*;tD#``cR2jkR#Fu5y(Q}#6H2v!|7T1A5B8zr;Vzf_M&muw0SDF$z|2bfs`lneA zs8LFb0jU=FM_sI9&`X~I*0hlpp-zW1agi3wqEREFUZ)XEN1gPXE~r5=LesRAL$8e2 zxH1_=mjJfu2sl3}tec`76{5?rv1Z${2;|-Zsv|l!vhS_=45-(d>P{ip;HBC)iB^HR zR#p%%#ox%%{kQ;P1-B<_#Z9P7KakY?I&hOgfslZxUJLYxG2q$=6vk@-X)o4STHM%z zw2xLbT#77pCwVjNIOu$vI3(NFAgaQ77hxSZ9#@x&dn;elT`^{s%-IWiHISM(@oYIV ze47?4mR2>?a_sE*=gQX#7!E~pJu@4H(KNy8HP*yzXucJtUHOBwXTX=yZT`CiLY0l7 z+6V$Wwg%lQUm(0kY}{h|-eY$h`y9`0HB%vqd+yV-xB#n1 z@TcVrvdX+v(zFWS#g6l6?E_$g}QID zm2JYTmP6JmfIC@pCgta(X9ayMj9CWUNcppa97$baPao;3=%5}rrLKZfby`Cz^bjV2 z0QO`dT!gThT-BFzxJ;-h z0U|$HW{m6}d)BUtuJCl&d_tD!pAjot_t+XN1g2)vv4q437!0#S)*LH= z!L#Xah<5iRYkE;_q~9*l+h)NkVXO#{XVMjf#B4M!5i854XY9dvK`Y%1uv6(pnRyI~ z6IjCaSWna$GD@@$tPI`uVy4gYg&og=9~7m{x0XV*Ot(TSP_+G?2A{~#*lp!11c z0uUB*$O%f@RK1Z@Y9|CXSS+H<4Smych-}(|wN~(rZHl9=6qMEt{|fX7a#|bOZ%`1D zw$ZpEsVqa8vxfobK77rS8Q1^~-v-gp)MsE-f6B@>koLr0sl8#n_CE(A>rCPbA5QR71xfEV{J1Gp{0Hv%T*gRdcT*NMu1QJakd3UuR%Bp`lW# zW86fo+2S3wszFdcxm-^0dzG<(FlrSz(X^Y&pzF+uTVM3Q;0+dZvV|<`Lnck-n;Ugs z6U7i{ROHh2*wS4TH6>cOBEZfx@tM?n@}4XjTyR2 znxZtNb^*Vuz#1ysEZ6Id6xkkkb?aODn-4Xpq$E^do9!U1bWe75qt<{68U;<}L|q&p zpO+=TmmC-Lv8j5$snkyCZ?-r@*&dS7a(HMu3UyHMeQ8R2sTB0ljdy4N4MN)(B5#Qj z^0CplzWG`Z+xFl7=)QbSQrO=t5#9zt*nB7GFfJyjmea$5z#pLN{@?%3Fq0qKAH4^2 zr!kYuw9Fpz8Cz0jzU*AEiGQnNa2yQDbM>erKXI7#!RfZJNCv=@Pv(-rL?JH{z$1wE zF**P2PiyBI8A6uD8EK%Eg&l?)PFVU{UJVKRgtEp?qIN^{?B4}}n71}Ou$WmVFVBOF zN1GA&DZX*nfsuA6keHz$6hkX~CFIN35`NK#BGHronFK|Q^BY^Pvr4)~i_z0ps}_Pb zS=>}D;UNPBlPMqrzxN~beGN-^@D5>IDqM_X${!n{P6LBp5nEaN-{Q{TXu48gWC4gu zY-rX&2gP>602wU39Nyf2C<6jZit7>HaX){Jg9u27fG-8`)=zb+O&<-%#eu=K>CoCA zEZQ5qgJ=kItOa~U58%ijgb!oa(zC1KMyAt%v}NII*Si7L9;RqfE9*7nF7jNrJEwBD z)6Sce=QYJZX#^*Zn+(vEeLZXnA^s!{`*Ibu?3F&g}l!@Oj4+t#ypH-)?Woxxxe+!P6C z9BbLp>2Y^&=sQy~=tRx{u1AZQX$xwgB^RTe%uMfMcdt)kG1m!O-y&2SV;Va`CZaz| zu2Lntt?+j=0}_!gKJU^@ZAi4{SFuQBSR**kR1TU*m(D-BGD&P$BP-VwbT{Kv81$6~ zNbC_r>S}9!(vmjglpV5(dcxfeWOuE|+b{m=c%Nqq@}8+J%G*cskM955QS?=(IB6kK z(S#r>xs$7vJmGF+tcR@B@IG0gMdf8|l=M1_N9J7`j;`mXS=yfLv1 zXN?YxNs@}GRL>MJNE6!Mp|gP`)%^G36sfx(;y4w6+1o?1ryH^ zyWvUV1&K_mIXqgcN*VQo3s;VDm(aP_AUXm^qkl9lF%8mp(h<8AOlp`81gJU_Mv%%I z3mmk?JUn@!hLEI`zV)$|Mhfr9kh@y$fn79JAQes@jmYZuHA zXkajvBmg3Hk}Q8UM8Hx`Gae~k49^+a50HOd*S+T*f-3y2l`>~x8x7?Q65T4(0Pi^g zdMkJL!bO;+`U3AA{4nyC`el&PSy)x0?VtU|`UMZ@_=`97S}&yS!2jY+-TvcE!I16$ z$D3Z*dJQxUa%g3qyGM=>5^lLWAj;^Xlag3vfVcDg46)&BD{;d~_naY)();lZo<{`6 z?{(Yw2TE-t!B+Lv71GtM{~SnzgYX;<%!BX+P1AT`MHT$n1iW`pbfb--l^;10hHC=W>Z|o z+TLzdc8O1vGtq4c)T46Ig>1V+uo6CcIVEOvxJv9B;6DMH*t2MW8HJU?7HWjfaOjSj z2b_{BCzkj2;m*(18Qm9Z@Pi(@{oOO?t+emejCUV!u^b8qlk@UxRvkKwnPNFXihh=VZb~XU+O{uyS3(ezJXSN-C_7TYuSWnK~Q^xwZJp zwLOJeeW3{M7sUR;^Bv^4$}IM?s0E{9eHuA?{AR-A+~77V?8@j_iN8g<_W&(;ixkaAQfKV0E#=p})NsRsR_KED(Q7?47Lj1&JwF-t51C5;XpFaDcimPAHenhYymI7EEPnT$hp z;%V(WMrNW3*U-To3O_eXz8N8<)WUv$o?#)n>eFz^k5U+8Lg^H3|6ffno^b(kVJ45| znj9|`vl#M5L;+Di3zRIp6|_N{>&(|ECpalHJlOsnOV41ZM%;we*chTwz{H$na!6%Q zf7h5JL}oCRijfd)J$CpntwkN$bEyfTrVtvdv_CGN=_#`v@^BsUZ3I~9sj~y}$R?D> zjR6-E@@sNXSh*HMBK8&?5YCi?=D*_&bcnqvuLJ}1+Kw!jrlzS05LiPlaxI_~-lM{m zZ<9={Fr)5B%Cr<_7XtG~7n=x%W(N$*R;c4GDzxz@=jey$BDvy<@och-vH2&pFgVgn z^TZa~($eXd4eFFRY^n%-*fkUKXzpfk(QqvI(|%{n*PW)L)1{}^z-<@GnAnnaym4jL z?s84K4@6j`*V1Iw%HRl#uyLl>j`pq`AY#ORDF`@nAtIx&%xo*Lm^o=6z9l})y)kn- zsX!gfahTS-4@s_S#j=>ea+uogk<$c)S7VwMSS7;B3<8IWzeg%mHEl8vQ3|H_NwRPz zTiCLj))ShV+L4)>S`QUtM@ALl5lpVkkODU&6_RUkv~e>yG?4{u9_%$}hA7q54oF$a zOe{QEp}9)T**Je_uydGVAeY9Ctk@p?AW&GvJj}CcP75c{?w!(3YMV!x=7~m;F|$c&-K=)0RJYr-E#X%;Cm>E z!99-7P2hDrG?!uz6x}`1q{ z@n)nteBrzO;2M(?VovRZJNiI^L#LF)FC=k7*`zW-l*doo5+8W#ufh>URYW0X} zft<`i|EbP;=Dx;Dy0Di*d|BfmwO!KxTE0CD=_eSK-UIS&k|T=hx$?6%%A>P3vK8jC zyp&q~m}V0e1{Jfm6Jx8mzD1JrEJd>{bZshuXBaIo(2&cySWs0W=il@K&#+oxPJ1}q zOw94UlO$DY@o!n*$P`?{@O)z^)6!;_t@weG+xfE_6Y(1pFb4S|yp9SAD|o)alJjg< zo3;9>s6WuyC%c8zU_*)v*D0uVC-4F86X~j7YprC(5YX?7(wL8XHJMXT&$ z_G}A@U7)gW-(s#&3x30IM-D5ZuX<^VW2Qh2_o8A!5uh@)G?I=)EPg{W2}h}g2rw2| zRgI~yxR%QXNLVPjN&iLqFJ>wza1;2pQbJo7I4r+ZM0FVySZA19XGC=v76dLV1h>p` z*|NI?E`1*imQ%s@n17e!Y$S1zZTE?15JaLC5L6g-Q<&Z{YX!2oc9r(e<2Gv{!XEXE z;wq&DHH4A4elro1AQ?0zKcB|LlQx&)%(gp*sD``{#^ma0R9rR_UjiWd2knevwWdzL z{kNM}=A!#|W(!;p8dc5H&l)W71EzaP;zQ1+_%gU`?jHGrgCBRb=q_3S6}>n#gqjw# zSAOXly5Euimm&DZ8Nsq3Sh?W#Y(B5(mlFJki*dV|c%My9I{`tqFexN5BQn)Xa09OP zeaJ_Vkj?{Xbvwd-tvF$gc}jXRb&%!`OhzCemIo?E=tfpv*EYVc7h$Gzkn$#GGTQ+5W_NjS0=>! zXP!|1wi6uF?;5VbbmOUXIjubn!aE|m^<=%nL*;9|R1Yl{v{;Xhx*rXEd(dI29vTCD z&|8@k=turs_jo4m^EHBe5LeQUp_Ie1nF#tbJql2K+fWyM0&)~z&WGJ zTWK5qDg2naA=8T6Z#Mj0_%T&OrXaWxAbk~Wq##**IF4#y8q(kLgzx=|C75HO`UgJf zLn@{!3;%LDJ?yN=rLcvMZCwK{fUwp(<$;TxU^2JrcIw4@sOeaDiL# zU4znVH>}<)F7M;U**3q}-(sdgAGN6ncYR>3%)(O<;LhUBNAw70D*q0(Gf3Lu2+Y>h zyqrUNA&|!~>@P@DN$UyYuQ!pcC9Zn$$?8AskJr)DE?rxgB?N`l4yeW61XjqTO2+$e zTbU&VElkaxRdmVQUCg5|7%$>tHom8Ar9_#=((k8f&yex3Ky@1?m>Hud*PUwn&|nmI zCR*-VX^dLCZ9l=FYefkdqozv)3o7{}k^-?L1huC?bOGf*&4K3|6<=YhSSvwSG zOt{sCN9*wPuV;mMma7unFTPiW-I4Ms9TnQ@;nEQ2$2so`@;LR;Pb4C+9Tsq^3EIPs z4f%K}b7C_l#%!tbXcLdAo-#zN(Gthw9CqN-mFx#vjmxApyeN#sIeT|fNBBjL)_wXr z%P-;ZP~seog_>1WDDe-Q`3kzoFFg__Jf0q=R!lPwn|%Zvd=;FcW%%q-7WmVyW&&9h z{~JS`X6;;v=KCHp$}&>NEXOzzAG1ua?KivN<@a)fcVF6mL~07$=@E-`7oe)XF&md%&S>NRh6mMM|8C<-8}D z@W`XUuB}9oUZKP?Yv!9AMtP3%9H0DAII@?l^&cg>Mp{gXc6EYjwh8m+qA~|A zl?f=+>tCJioQ<=5jFv{jEHf&mt(!)@$-cDVtCZ*U6P((9)L(`BOgmP{R#=-XpO&v$ zgl$61G;iw&Cy#X-eMJJo`GIMZqTrEj!ei?gr?#P4hR?&&sEkEMg_7X<0TfzhfEzkQ z3kJ)E3;Lk`@8}}=pAxEyOH>KY&ffaeVI7maaK)n~%!X>kqrG<2LrM1J9iLvzCqG?H zp+1B`rp*fZ+1v1p5IV+=hc?C3OnVli?$XPWhAiTowG}UO}Ws1Jsuz}q;N>YPDy$*jgejGR)kPjI&rD6v79cy-RE6|o-@^2*ZuLU z89@_-I?gPVPk+<5x3Y#RK?yS`vg(|0V`y9j&Du8sebN$RV)uAg4HCD|lpYF|gV_6B zFr9XCJ3>@(2t-$?CzW5@*T}pc$)o+Ygyq;h*$e1PT46U;Cd)+~TJ<_^Hhkz!Phb$6^IlB~oD`3iu1j32So~$nPTa2Xm!+dJ%2YqZV5rIb1xq)1o>FuET~Wu-PQ$RMv(PsU z_?9geuVka{9G#jt92mX>+woweQCB0Yt947!RjO%>>(d}TYFK(6`;6~WC7d# z@AZ&<48ETlb@F6`30}q>aR3pqH$j0*TV=hl)tk3 zDHa6aseiSoxlq$S&6AW@?eEI+w2A~f1U$$nt}f#wKEUsK5!orjCZ zEVI%Q9VVxdT6K%wkS~w?F@Zs$z77~oX?JHRwKktovF6o}FL&`1q~=S;l*U*kktmrg zjtME|Oy-zvfRb4hcs?Slloa!ID{^dJ_k)T-?TfA@*P8Rb%F!I752h$H^_1-h zDBF#co87~Ex(Tx7jgD2M2*>FxnKnZvrNJJPK^-=f%A^oI`#LRjuDGS(TJYSgJXT^YxWdtWo_KhAHm@inBq(DnZRb?o64E^Fn$<7Vt zw;L)1S|7)n06Jl>W3PfT?XaN~YEH%9?I@KNMW;yXe_VO)8DXYmKx<3I!nPW4@c^g)IDl6k(a<=!rImSoCw80mYpKs?T<#RcyA zu#p~Tz(w|bX?A_;9lO$!|Fh%#Wia7h!F1Q>{)2a$y~|-4CAUX_Z`%v^ z2YzDWb!g_M@3pw2dIZs8#Hu9qKh$4?hNigwL!IgHA8Nz6|4&2954&idyZl>(+))zfnZd+UW*?5&+Kxwk zXqIs>mb+o~Hv?&wN}1R6D2k?4=)3ILX^vf%mYLW5XbAB;U7Jo__bkG3^*6)XFZ&zS zsra{ME~=-F`1Mnv_us5^CTJ{|@buu(p9DLkDU&cQMdsP-6^A&EvsqgvQoBsYg5x?| zuoH=7m=E|)CMX0Hd04kX>qo!AIS=iPN{P2PZMaHG$BR9$AO@T7lFX?B)=HLpztWU~ z1SB|cv$QdVzVC_`a1(s9By=@5PL-&wSMUTU`Q5ZlG!x|mE7KxMyVH!}UiRxdbjs$= z?=De_RPPV=;4QVi01woB3~^BrO)RH1GfbrFwE2Oazk3DaasS+Ao~bEQ9uz!KH_m+fYX5Ja4ETU2VFw%dVD* zBuFW{4P03t*f}7jiaIhy&*<0zJFnQQ+}Wn(>)GqJu~Y{KJc7x%s*2E`{``$h^F~U} zr^(({fZ31vNjEEQrGzMLVVssaZ(_B(^RwFTR5de4dc7LyFN?H*3GAMXTF<%UgNDZ` zx9M<_WrveQlpJJE$avI|liK(BwAU4890JI)yJ3py`Jp*|*G87;sMglgmi1I$pjljt z7q_3%V^FFTV|%c9XBax{(RP$r)M!pfoR;%g{19Qm-ziM@P@2APXVzU_7gRgzCg=Ap zQw#;XrSkF2+j$`8q1iR-AOH#%|8f4V};h$i#AjT&{E5vZQIrC8q5e5sp!3f{ao%$wXcU}|4~3IFGM7*9U7@W9H^ z7&!}R_B&_*j_-#O{0VVE_>M)MHN__0iHXno;^M+rGHPuUF6J8A?OCQ?*WAsO2#uyg6sr{T$OJ zWCz$!uh$ELIY&Xk0l)Od=;n!@Bq^Ip41Oq`R5tQds6ZsH}>Z@H6hE zCm%3K51)Z0N(7daW}v3lSe%9h4@W z3Xf4VT4w|{k>Bf;`qDxx7RHEqxq)P(Ul@Q9A+%GaV`tfq#T1|sfJO@ho5>0?|lKk2s6HZ zKUwe(i7Oy|P4ST*qP*O59SR9gzOv5>Z+qf?DXzx@1l^2h2?>t7*N_ z)Iw^joT|CJH{{0BTx>6sv^9WSBYt8VJM8q!%~@2hd-qAZ==KEn+x4_H$@y`YxxyWW zYX6-0W-A^c7WI$Y_8;uOHsYtNx8B1=f4~!H!1od8(%K~HwrH_ppWyeB^|Z+R(tjPF z)r<7^cH7|G`^Sahl{1*tYU?*%!R+9;?B!4aelJMr${W@f$SuPM-yHGXLH{b*PwcOk z|H8xBsM>90Bb%Rsh2E;n{urH$HA+?e?v74UU=Y6C7fm06*$K0&u0&yC?Zh#H2`GSo z{Oey2?F~6Z&J)qyf-?fLTz7eGIJF9ju7}N|uS6O?uq~O+dL!+zea|b|<0vP81y^>I z89FwrY7%sMRMsHGvXq!|S>8q{o7I zlAnV$`#UGdum{KeM}L)aGR&?|aPIE6Mn|_)?o;e^JRPy-nm?nag`r({;i(UFcY?3{ ziGB-G5u+$RZO_yGbU;4keL%?lysGhXb@Z0q^5rG{dEj|n=+*M?wSNna=hMge{q(^o z_%1qzDhZ4vWgypbW;Wl<_Aev~qG!i`_Y8P6b$k|Q`(yQW^ZQOn{>iMb@-?F$BKRMx zf%70Emcq`X4T-N$sM8QYWh8YSpJt$lgN@tc)06vQ9Us(p{mYv2*)v9?pc%!`l$2jV zZ8O+$#F=8_cCuqrerlX};&f<4tI0}y?x)qRAK=LQH>#Bd>QNz`1}ns=bYd)uaUQ=_ zMN(GfV)wm?a>|!hkaA(&V`L+qNeS(}Qa-T(MZ_m2;(t^9yVuS`9m#D5G_jVJpoBnj zen^aMMku*&5X?JFC6j>#AN?pf(Mr=>OdpL=B_BsAa)5UtBEk*uEx!8F~^B=co$P}d5mf@hrZ zZ-n2DwcBV2zme4E+4En_D54C^A_BBFpWea)I**JEsO(z)M1wcbc9AN=n%UrEe2O5^ zoX9_9IZ9c?6N4~TailG4Z*Ayp&EDGI;krWMD6C|T)L{10~R>R1*t&>g~&l`$f2Cy(g+~0NLG@vjjU0=I6kEJKMG1< zA{;9K^MG{d;35Z-3ac(WoPzpNw+g zYXaE>n=Ap#f~z*ac%A5!*H*5pcbzw#FcoZhd<>sPus8tV4=K9OY z?8N$wZ(^cpqH)Ud+NYa)UP{ zf5;rddM&e+YYbpJ*_b=4E2@)TY%_ZN!G9HLz(k`VuIy@VMD67$kf)}6D@Np%WM)LS zyfp6|7)C4&c*tvS(fn$>EDE!yQkHn#0S|=&F#RjMAfSBF9z2|6toZ@a*o=%-R@-Xd zT3aWHR>40U8q`7ZlkP$oZQ1XT>s=nl>5Or z#KO?EeUR>mNwGRp zr-08hGFA}~sGI&=Th>5w*EG0y{xN<8z46AuZh8d(`YM4*M{3<8`Wy@aP&1=7w+PB(9 zo!qq@GuEqUL2@XHOTrVfqoOg>VIz0 zLhuawe=lY-2QrddGT=wtKm$2f`;B5FCAh^!8A%?)Z^o!ovG?(b=6{-G zNn)WiP`-?!;vq%RGL2I!jxPll6>b6M12+Gv+A}Sh^txxLA6&{ptiTU8)%@4l`hM zr%KvmL-6z`(4fw_&1ZEf?V^Gl>(%xNEZi!MHB&cj1-1}tI9Yqz@Qef?cg8OU$0{<- zd)8CQryQ>|+nEL!t+RLp24Lb0gPbHG^dp1ka@BmyPy;1WX^^~R2_J`Se0!M#-XTlagakbu~O_5E(ghvxRD>UK|Am91Ww~*3;^R-f&DAM{<$+r zNl+NCby73S;H0^TWV?eeS0IWM$Gin|F_g90wC&)JZV|}tF_ZxkEX->Z9;UjkowX%vA0$=U3N9F8;k=t8)+27%e6sq>5CY{ zTE(Z_6jqAdq8@*0zU{CB4Hg8~UodA?}lsL)^gf3 z%X@7d5L)J_F^QZF2gK+T&d8i$)Q%T9#TiGZltS)N4XbU+iVUTsnxJ${qF< z14IRjvDk5qXC>d)GX0wiLl8FP?!#rE#B0Wc)_FW)B_rdVG3gH()*5hek@MUGS;#-X zn?y#XVNluX5tH%E^<#P1@LdC`$BAEkE=!<`f%=Z`SX?(EJ{UwWWHgY z1LhiHof#*V1H;#$7$`*wB$y3JWkYByK%KH$jAqTi;$rjCVihh~#!$Q^;a=y#r~pn~ zqhy*H3%CYch!Sg9`ra#-`~~fj-wQabfVhJO>hhiL zyb?9N?Wz>G5@AS4oJGoUozFWYzg72cpL)aMMJDry_T#~01NND8859~Dh})K&4=M&W3V^nKseG!*?VeqMqtZ8-vY zjO2}9$eOF-xz^GZdde>2<-#p4D|xU|XzvjEK)E%XusNfNP>PayBPHJ&@-XM~DVK+b z5_wmt=SGKI`Lr#wDwKdE=Lv)(6{>-tTp=t`d0<0ABCbtCy{tkydi-_!eEPcY>pwqhY1rnpuEJrR`jRG$>YZp{q;xlA@4Eu1xKsVv5{YY_&P@A%gn~)o1dY z;&!F%6MDv)lT@hnEq17}#D?z#9yGgtgSZN1%)zbdJ``tRaj7d-R%*VoXCv&A1+h@l zQCo-;6rR24-HM5NP`^q9T&!32Vyi zg;ljnMRKeJ{>v&J%{Ddpp;|E8YFABSjt?-`xSLHP;q^g`xL4EXxk|o2(503=b&$%3v>OW%aWo$zkLe!!31lt=b z?ln2ob5$S4WiPOYGm+sQ4~?yRn&AlBA5~xRyf$rW^D=v+_k{6_&V8cH%!Bd(nY@{Z zB&+>8sM1rY!@>tvehZt_#)Pb}3%{Ho0h0|8F+9pk$@R#0m16bBW=iz}!@MM595(sj zR^!ZIfO|lD_6@h$>S-|_s^ruJQJ4v0HXp4-??F_oaq&%}S2?pSVwLntD4%5sHFng` zidXaqN;iX)@Td#uD&wS}{}aEW@)0&VBTvP2&SfLZeczIBcYg~zOa6SvvyEUWjiyXZ zNi~|{rO%p#U#%HGl$`oc>`^RKq@~Ap%ao4kF$kF9rC>#J09|UblkuBP5~w{8BYuw( zOdr^q;lyu+j9>1oUH4Vw@BfjV#_b0P7boK~yZw<=ZgQE_SoNi;6OLR-V`)al*yf=~ zT9!8~``tO&`h!C1gTVJ<&KFPD(e^k}56?VV3ciw76aY09)n6e2SYWX<2rKfNNYj+& zBJeniDjaR8PyK0nP8Bk$39L*#I3Vy_<(%w7OA%!8Nnmf?3(g16>Q8AAN^9WZIxk<; zDI(h7PLw#c9nq%grbQNDvW>95=x1A7tp20K6&yRcrU6fm&09G(8^>a+C9^alRl@=u z&%tWNi7XpwvA-3g7t=bC*S<5#n*L{@IaR+XVFkC;L!m_}h$@22kSN9O9DY50*ocr* z#=U^$mBq>orH^|BN4)Dqe;(u-cp}v$JWH-Je(vcTx?uoaNrx^@VX)hW(Dd^7@dpT5 z*cYz%)8k-+${>Z1ecav)k3yX|f1uua|5WVyLV{h2{2#n!wS`5<4|j^jp1GX9k{4(` zvqr%219e%7QlU$*fU|70hHC9AFyni|_sTs*9P?0+S&C}-22`8ohD1|~vGseIh3_jY zFRgs}IR@@ZWLFF?9UGreFpX|sm_7Y>>e0)kl!U_onTabhdFIhAB|oWWmY1{U(b{EV zD5I^Xzr9ghx$PaRA>3<|6wCfO*hbhWS^XgqAFUXWqr+k{86S&z|61iX)*coEEa!^s z(x^|}#e;Fy*gW_HQLe+%5ZKz|i^12g<&LZ(qms3m%}g5OT1xpdX3VtXbzU(^z4#?> zCoh}|IN%H&>NQFy(+$)he#WWST8OywbWa|(WF{x&KrXbu%?WRd*F(4Kur=uHa|~Nr zM;I~m%vob-&|l+6oqp?>KW8rF%Q@wy`2PQYrH+pmauK51hTj;_8f!n4bwhKUkZjI` zrhIxkDE|ZrtX?3Uy$ldHXcUWtVQQqhpU$CFe~A2x2E124AQ7e`bxhe7NK>8aDL6j< z3*D|8|m2{7MZ0q<_=5J{1Fjpp{-?+)jmcrp5bK(SXkkIn!<@u-35!(cff7mVs&R2n*|^{ zb%8i~cn{(p4-LM#aW{&W9bx%KKpO}cmVn`(i!(JBlFGm^GGH3!mft=o&u6PKUDp|W z=FykDCWzc9qqn9LwPw&C*w@9jr=dE#@i{kZk8E0ydhj7T`yeC0R3hqGD!afun%wTH zAyyjG*t2Q`%wqemN^B3zw|lZXnQ(Gaw=Zx>doN)l&W!3vV={Z?@j>?!I}qZ?zRe!ab=I+`65KV!9XswR>!J*km44OOfpGMuJi`I$se85pc^=~W*^l$P@BJBqvCqRI|ux8%;~pd=c<(-@fUzhGYN~ zdnF62iHUu=Z#Q$=^ZLnr#}q;YJM7L)B1Fu&?f14p@l&chHb-QNn8R;Xa$H4v`;AKw z5^DyFKR4DP0HZCCFP!~57h&c_cZvGb7U3^$+fRtnZa&-ZM48#~9yy95-+8w9tiNCR zeb#u0Mt^07_v01NB0X4uZHV=5r3isqbZwxv1OsOlha^s##F zMUt2;NEiP9DYs2I3ntV5N4Y^VufCWa1DQ|kDyz1(wyN~pLwgE9L>e4Ao6wP{Yo|AN zb1_Ce`IRfc2sW!$1)0@XhcU`Ps~`E~>vz_}j2}r=LOsTW2IX!I<+C-*2!A16%&CWH z?i7`2PkzG>@Ki0|3as`2nay;I84G^~aF7je6?H?apTf4`&I(fQR6o7#Ub}`!`6w9M zDcsb{x<&2eBNU_OS!WV`?-bzYS#eO6*sp$oJ_#%KXdu(Q9*L$cw({tHdZW{9Pkv^g zm3pVXX;T(g^QG0Q04``v*VKt6QUTsx4LwqHh?v4hNO6MYnLk?_f>iSwgVWQW>iUcY z$O$PzA0l^hJnOp#;WO25lopMzr)gztg-C_?(lZcoA@SUAFBNbHPN57nSLh)AfoEkQ z-};jsH#fIPh)P`BW(WbC3Q@Z43c~b?|31^;y^Xl2h}`Wa_>Zw)TC?*zgf1J*EN0hL z-3UNF4V^#odgPR{^J8HRM3YG9ucG?7f3v$Y7(MzkSEHCS*BS8fGK-g#U}!NLioxsZ zPn|6{+07Rk(J;*e;g? zirLbyDIu#2jJ@l4q1h1;trUd<63V2!cGcCQ?9U$uyHVgxuze`ra&_k46xYa?r}3M- zjN%sN57Op=nsD_dyoTopD2#TeJi;r(shK!y*jQ90dP)N;Zae#;Cq&Q-ag*Ch%-`zAm%q3vCf!{2L&thMF~g z9ym96!_rp4+bs#zSD!r03j);h+x-H|fK-<))d>(xsuc;41v@T-s;%#z(GOVFF6+B4 zX$MT7zv;<&!N*W5x!$NVMSg|&%v}n=#x@wJ$&MGyZIfu=b=rOvYrHJ6l{pJ)#+-Ih zmLxaGGG6SpL}ZfFFAqpPN5*giMQ$FRROp3r{bB=9kGCLcTJ`fCy+*w|F5Tt#Mq3*| z!ct47AGas92$Wm>Orq7Q$!1II?K4pP`HRl~L{Tr#k+$GXH7WbO3(+~Jx|E67QS{T%BbQ8 zr+Sz1G1b|&=SL5pWrlFuBC+zK06ZR9v*6}_V^yj}1etS&>u;uCq4xcvZL4S`HFzg< zk?m5?A}f@9Bq(hyraSkZ!EUL|{fOrcC+j=-igVmNzY);cDpLjX3C%l~ZS3LjA2{!{oigF+gB;8QB;Jv&@j4&K>~K?<&+LnYW8O z_3Vg9JncB+Nt}<&@RGB^?1C z>vt8C4|11cjJaO=$Xvhc>4A4eDHZ;wOcwc4rp$KenkyPqCtkF#=_H?8x5kp!Mfi3n zq2BBp;kfy1E6zYvbIEB^(&D^^#*-KFWrwE-DH#J3wJ22=?0K=)NgNd~p!P)#cU@Zo_=i|YwYl@qOJjsX416l-1C$9$AsTUylqZQtQ;nZgwc1se zys}dRo$e+_Nq43+Yxuq zc*h>$&=lRum~qOI3hm%$%jTK@w`*o0`FYPZEbVzCA<9fVs%5_>=B0Ul$SzZ{Rh{z+ zEFD|u-IKD*BKwwuP&`h?6Yb?gR5)GF?D#1pM?-21;$u`3UkqMK=&nKk@ z++I;RWmzr4wGf8bSuE1#2oj9d$;y( z?cJ)~s{YVj)#t-G)z#hSdH(<36X(fnW5#bYmgvo$CUsbS(l77BRIFKMnT)WbHmYfX z9W%(6dF7!|d|v@Osm0k#acQ(9@4R#$Svx_zYXGxm>9zQypO5N&9}~La&D%lbS1ax z~?! z{-xGw*c&b{I>M`ck7YjQECEeMHIE}bb)OJI7Kql-BGH+aepJ`W0#C)Kd(o5J6~HVf z7JNl4?^%)FVy%$`E*lI|5yW?eUvf{%E;EqZ_d$wAsHl{-n9fEtLl1Clgxy>S;*xFQv-_Qu5YpNE#=(9M;Gov74c%s}=*r8_HF$GjF&z2T)8thuzq*v$+LDMkn-a8Ds ztuHR+TIkI8h84V<_Mibcx@|>A{7t)yn0I8e_l>1}=%nun@_o~U#m<;RmW((ex|sJ1 zk~V*~^YA`t>C@_C*dauFW0n=%hfKjw{B*Wm56WS`k<`*T9Jcy040Lk0D6rw;u`#2f&{6OSN_u}lOzu) zuV8Yh-R{q&fMSukIRp$|8b(8L*UeF}Z|kYzz27p&Y&(Imn8S!GgIiB2R7^ zmR+Vy@hb}ZT^_!G(r59c<~7tf_4nU*!%C`AB)&oRLaMZ)0k1@+H8jr4D^F|L%TQvh~jOM^J+g{CKJtR$|)(^ z#*i>6d|$`2E!8R^-70yPDQb{4lhurcoqgV&M4{s5 zuuN22N>(kPV+p>b{QV*P^AGz?SjOqqv(uBB<7Kzj#D-^jNAhmX_qXQbF%w*TP^mTA z)Hj~?;+l}2@=n0}*CprkGOi1bzEn(tI46d!PriLjKH829ha^I+5#C={W0|>h2nfd( z?#=sy5>gTdlX5S`odpXO)6$0W6PF%q*0F@bIlLVu5tYwY`nvT;@0}!MOqIW>!3L_- z-J)~T{ODI!#@7ZB)gAAf$&rtKMMqS7_SeQnAtdI@mibMZ;inrBE0E|mb1XJ?Am(RI zjz$C71X}d+@_+|soo%Be67YXD{l|v%DMTNGi61^atbGxY5)#mY#=&G`)*(63Q|Zt| zF@oppNb)J6+;m>cK**Qoh{Ph1haTe1W3VkhOPgSO!pHn1bviWvfT`kCjE=Qv>)7BR z;#rc;@CLSj2D;En6(IClV^_|d)kKJ7X^IhFT~`#gH>1z{r#|nt)CQ$WYa<Y5yJgC%qMt%(GQUZZ41{QleT&PqMoI!T;GFx=Nmpg61_{h z8vtGkO~k;hlKU0r5oXl@_kHjk8PosFtvd&D!Z^r{xXZ-4it_#X5wt&Ie#1epLH65& zKmm3bB+o(Sf&O{Ch-%4Srz*81`M2HAyP6kq$a5RkV~7oz#}91(Y%RkTJ7`@PfDzzM zBm&=tYAPBDXE}w0NPu-fL`ZhPC`Cx9`Gau3t+=lgtvPW?;E&sp!0=YjXR z4Gh<4GIT~g76}?_^=~dy=kN1G@dVH2 zhT9Adkb(}#zJaJ&jf0c{)pmLgH1@N4x8&EYjq`5I_HHzUXh~yyX8AZ)dqqh+CL`;48iw`He}h z2TrKt(9@>&#i~w&7Sy)@6ecO2(|KvGuY0-ONC)!#Xx8Or*S}uClukO#3G*%`lOpbD3;YG4~TrT90&qokfiUy#0n z?$HQI^Py1FnN8$?DOX1ZtR{E47}HbZZ47@=WqK?=Jr+MLBYmTkj8d&@k&-+sBZa1v z#49tpijU<`5%)&_hurAMq;jxHCEO*A!OcbjdE_1D=%e88@6;ofmQ()PB%2exNyvdD zNT7CnZ`9vP#8PzFxd(VuCv{gZD&?#i_`kEIZqM{+%a{@(y6S_ zl170sQ+#F?=E{VzCmjEi#9WgVa8L8P9)k&$&Th;^QHI>T=>T6r)$xxXsSYss!KM3j z6HKvkDN@QqhPN~a_M0@R^VU991^ffC5p{pkpaVa)9dyK7lNbR!w#C%163-Vu5whM8 zLs@X3P^s6BXj7?IkNBaTsqSY%1zv*tI2-*9 z?{qWL4aesRhZFz2q&`J^vE+l4PN5cokD*t$*s_eV6x`yTAzJ+r&MW>*C17k|a=ait z#f^=4lR8}^Hb(r$_OCY)5Rpb|ClbZfn3V#Xkjgk_qEsBtqLgSEpGrQ4u0$Ei!@n>} zQXH(NyP_-xdz~bv=r|&R5Hw!c)_0?1wUC zeP|n93iZi<6xDFm>4KQ)HWf4Fc{KCV5kTuVqqEs(Im#|c)Y}st9X|$IEK67{SXlfo zv_U4<34PO_65%lIG-|exi8N;hS%7hDQc~D3)ru1HGMOr0aqYs z!daD{0a+2*0a-)zJO_jv4X^o!a1<%Na%mLxTXtr840kzyPFzQ6pb4`qjFkOhNJYsE zyG6{>(%KTc1wvew0bwsWH*`sPJq3>7w%g}I_!(*u^l5++po-BFj;=aaLueKuN$aJ?zFyr&NcKrk>aI@O z8oqtQIl$9;Y0>z!`Ss#b^$waWI6@7~OY#Xh*fLGrS{VBZJ@A>J{!*s~IrUm(05P%EyYW7;f(vVr zR-Ff&%~)^ESavo{h}KM-|McE1Ja0B1cV`}VubQz0)AY7879gjrRuQJGg6T3%leRoC z+%nz?0S-Y zM>fUypNMCj{XECD@}=0rUdF9cyocE1;~$kNb`5%jCS6`B54XdWDOcYEv#xi~rSTkV zCLlwZ4=}3Ht%~8XI>zlvD`R~#X~O%CXKb^nd8H$|(JgCc$hq1r%c)BtGbSr*r8=(e z$*O74+on#Ru1z29F@C{Yu2b@2c_8Bd-zjv*H3TNF{yA}NPR+%Ee7u9}oTRgl1#Ii; z`4N2&rs?cc0ozv|klytewRZJ7HVFre9GW~5eDQKi78!JIb!~q-Gw7Z=)^yq;Ce=O< z$7&tY=c+AO)>3I~`6ykV_ZT_QA|}N~Cj(Py$|eKd<5p!uvHt&^N*Z#$M<`Vtz59ME z+LO1B+=rmfydQZYEY;_yy9ZGpi`^fK+HV!$ZxwEj0KrxLt`;CqBk;B3V^QG{P;fOy zS$dA8a$hCgt=8K@`=ma&S-zl+@uz~tPHn$Rx>L=MllCfo43YUjlllDoR)<4LM@3BA+Y#+awy+_(zvAE!$ol<#fslpjVfohsMDB@h>l$+C6<&MT>44SeQ{ zjLV)(mA9KCXvGRUxUh1aQ0LTk*E$ zlhq0q36DUsv9{y6-Zc=w*|6#w>1<9JSX?@x!*e8+!OMD(Nwf*`JTnFl8C<3(%+ARw z7lmAIxUm^fzU}iN=EH$khLge5zBpVqR=@pZ7Yv+Tv>qxzVD}KL(c0qAq~L31UY>&e zWd`DyIt?D*;^w|7cD32- z^J@M5stWlw!<&HY!}Ib(@T}<%%a>k?$9wtuv z{9g@4@I>|cEk}URhwHh72CefJPB{iEUgkt5kUnkKI1E6p!uQF^Dd*)yHT%}(gP-Z} zK3Pr%2#ciBgl!r{xuRL~Bw$!$z7p4QUAB)OoR7Sy^2Li<#yy{xHcTl(K3Jqx3#sHT zGy}Lu^l`R6GL{6_(A}^{hs!~$w4HXR+$-nkd>}PoxOOHBwnL>>eX*ZjGv)2O& zRU;YQyB6ObAn-Fx$C26vY6Z;kH=hjl^zEjTJOMljoG%LvkTkfwN6_=Hd$aiC&7UIQ z(*yJ@khw0}JY*`pr#ZK1*OPrq4`&jRXZ_BPFe7JSangy3-YSK#3RSB)T5WCj9h#4q z_BpY1(W*$174=*H?+Tl;5&?+Fw_%PC)3a8~a#*J8fw7V~_55E$X*sITuB40om$pe8 z7De9GH}dqy588xDy_tCPlecd{FzXmZTkaU62i7nZDB|hU9=k<&dsY~Z>omqr*&iy{H!YKq!%+tqWC@>FU!AFF=F#Q%t8qWjX^tzew)t=a( zeZ4HFb~dxz5WKAF8Es{7t#p5hn52HcU}$l>wj~aaivCi5>0d(q4&SK{XFz&S~ed+KSK(lxecF< zX2a|RH>m}#r;-@k@UaYy(fxYs=-vk6e~wplaf?E2ybIv4)nHSM5BbLoAM91GGMSI; zGhxYQ_wIWPQa^BDIT@Bak<>g^;K(NfB1Tz0O-AW{g}pm6mt4BZn=ZO8n{n-}Hw`9c z{7W3CU?PYFM3iw)tFWe6U(!?6bfk7Vae6q7w-LJ>kbH-WBZj-an26@Tj1aBpQxM!n zlo1=R2cFC?CKe-kQ0{t$co$|n}664YuxBy@<9agIGeBj*#a@yh8}I=;6=-Glsb zwlEBzQ_b|tv9Tdn3W1ec;)!kH+1a=kM1?0ZjXcEHmJgugufU1b=|lugoM1-3qQnn! z*jK`YMbGILoML%HZoNZ9ufIDF_+gvHYdhJptq_qiyL3N-o&I2C(|d#zIUSMKU&4bn zQ~3H<7W$EEvBNzX8!T%f%y((YnI1ETTc%>#!x?)jawWbJ zkE%3Cv$;7njnBB6vE$VmvXp=cw|3kKKiD;S@GXsxq4!mL_efJ*z}%cOG5W2tK`#Xw z&d7jCY*ZHtd1k_+aT({AB9xOlKiU`xThcCV-0pyxk^&=SPBTeVT^91;?M)Mu-1a)6~ls-C=D&p2gM!(uNHS`q@zSdWC_I=U^Ls$-O?@a5z zb|K$&)6IBFQxjm;OE4QtkvgtI9S%Ou9DOM7T><*3p_BK#}t{E;fv?4>;9rC5vN@47~E zK)Av^OSD-wh;%g|1UKHzc4oz~@BRzH=NCa&@G|5T%D}NsB848tV942lwALTTOT-#AEpIjtxVBquj#f zLjaz%90%;RSda?qqSffkc=r=FQM^ z1y^HVZ7Ns}<@TwnQeh{d<11i5Cid3m_mkkl66X?b*@wQ3P2E?X$H9d^Y+(G3EllH9%=dLixa;EP1$fW{< z4{h`)h+l|iJny;h5D7W#jpUa~A$QqpwO^2d(5p*fk^wNc7`e2I__8t)G*;q3joqdD zv^9rdV+3Az73q-#&J$Mqu>=p?aKD)hw=R>Ht1C%pI zjJlaJ-0AGFBNVXnnqIqRjkP!8UYex7#D;Ed+FI7JPc2tLP3R?jYA%4qxSeep;(&q< zborEJ%5LNEo(rS5vJ=S4x*Nc|LZN-{CZQdCn+TaEbqn-sF;&2DmkI$I*Q>TLetP*T zz~Uys1zOP^!X$Bv<1iriCIJCD_Kzxg@)pNY(#lPO9Q2G=;eN`No`qAQ1 z84d}(UI@e3b#|9y zKYxARro#YjZj=a81;grrKz9;PTi*g+?Z!@dD;UQ!eQ&{cX9r+1s>*Z z+3BR*b?Q|DKC*bKm(?7ME$j$Yr&ioftaE%BEf3717^`K=C^S^qAsnx!wJ_&h+Q!22232;Bo9W5N>ymXR4Y5xp_rT%nq zfd57v8masW#JCQ*&UOnQw4>&791Z;CE(-bBr%IAN%_4cEJKPaDhzE`=cKrhk>b;r1 z6om!>nG7G*e(FZET}!0!c9=;|@(&*>C}@w`0rCM~<`U9iQkW6KHBaw0A}(ylr}ZEV zIHs(odny$-BT8@>;lMa@Myn%Z^iPDQUn{r}fkUWCAengd3B~1xd6Smz#epZGnocX? zO7D#4K!oa>ecIq+h#rzJ5G-(Y`z@L=IgLq_8O$R6wXfIoII!7Yx83shY(a#W{D=kA zASJ8VwEkYjH zy^X<W7oj@jT9FH+Z{s)DY4;ONh(EdJ{axT3F_xXGTl z={NUG&d4aUS04@Tr?zrudcd57#B&NODVfbi?3IZi5tnb*+1!eS^UEPZp=_X*D-1Lb zn1X&AaoLw%*S9PfI{`a)GG>eHM7S3;$R~7%A1SnPz-97cmv1pxh1$*b zGb@-vF_y>wI(#Rdz;yI`LEX7Tt=>hWNC)3?6E*mrAGs`3Yrb;PDB-#)98SWUi ztH1Df?eKM@V|BW*(JB9Y#=dD@Bo(JL2nhO25?M!Fe*ENk(x2ezLN3_~4+5d9wtPDI$~gP_%Y5!1 z{pY%AnTQ>NYyK;v{>ZE=`TEOsV`!-F%M&vPXXxv9rr6QHqme5n){se#9i{>eH+}a| zCcXhI!rdQ8H*+~^w1X?Mz+3**V52@21cui0dT_ZBFvo~zmB%C&Usv!DcxOdq@l3tB zMnZq##8~nE9IZpk+UD`a868G$(8(yil; z!XWit;w@C|-MF$5+?JYI)kEU^ngNsH4o)=X7uI6-A~};?Ii!Z~0rHb1bwb^yOI*QO+M2tF+%E`)> z)Q^Bku`%D$a7Dx}#M$a~B3BC)jGyq_BLI}S9PtiOM1jD8)xf3c{#q5&_lF<)wal-e zX51_&djw-|MtyIpM0xW_3P^^OZlaCg^ZY`BzIt_57ZE9mWl9y8Ajh&)EdCrw7Fy0kL#>U_b zDKq%nq1Q?>_`7=Wt_yoom#eCXD{|@gM{a=)B*l(!F%T>0!-MezxRRPfy8&qU_cz;n z83AZRk_H3HsW7y==p)t2czN<0S`rgQUaARvOg$!(DdeYUzH#ZEX4uqy!Ysc=n3Odn z0(J%=DL>+MIilagL9|l=ySQe>agz>rvhlhg5W2>r~Fpu>_&$TiZDk!k1dNldY%0(cZA9sw{!O{6iBJ zI=e>W6<4nj(t-#Dmk}SlN!s4d8K(MEk2ZhSC+xDiS!1HJq3=PXt{53` z%r%TN$BxUDQt?`oNB4C-)_yJk`ePz*VS*u{W%JV)+&2Ja*BFx(|a!{dLC|lMtgljhJPQ9-F~G#Z`^rS zrpx}rfSZ@TH7%S0x6<0`P9EW|uOj|Tw#tDWJ)H=6)@FohR{&clhVw=oMeO?3XD%q(E6`&WKbstLI< zt@~;x4j~i1DwflGJRoWnWOrRj!T=CH$H2>ag;MV5&}~i!nv9R=|Lvqc<_CC}U}@9k zKGPD3D&BE@&1GSpnk#NBZd2Lm*$= z0$Yb@T;jjD6!|)CctnBrXdLAUp1UhTKqJ^=7^0u9k z9VjTP(FChTOPWYw+7ZE#mxt0(jRVZrt9LQ_oPE~O@vpM7v;RZA{(ST=Lx1YC?rG<) zSIk{~0%uPgWi9}zji(#cQAi|GAV48 z==*NeijZl-0hCgc(+mXX9KowCAo^<`0`Ps&-|520rNfHW^^#Nc)m&W+TzNK{m>Ihl z*VKxg)QF}ScJzkS!YuZPw?VD9Q8%Kb*`!=JEzM^Te$*Hm#0zLFRXTvOdRE8}Pzy|L zUQQ-voNA4i`cm~+9UtJZl=`<@=*otg*3c`5OB6kkQ%*1d4~;C$r@ntFtEj)EdUO zVx1Km8)eT9OAup1Xwj6O=NCxM9&R-oAtKwq4HN95N|U{10UE|9z#^h3Ba_8gi?OP5 z5SDcxfK;<0(kH|9UV!H^r0Ge(cV0uTg9TYGGlp)Sz@-_Na)fX;#E?{!L~dr${*OYs z-T+0I5uzB3jPOZ1)pi)j2HH!&ot z+m>8!ose?Z-`Q`JB5ra38=EK#GNF$ey%?$;1zp~~B&+TswApv>S zfAoqgXPk5w`zh$@$>y9)m5#`b-qwFxg(*@HT1_q#p zg*EDANJc2wW;_-`s3wx?hh`$y-3KmD{qn^#_N1VaKj_Eyw{i^o5OsQqhK>*QY$UJl*^RN7kCY_!R_O;LN_jqP(%76q=xht(b9@tJ z1gL`#FH9avl1gq^88tCFQADG~+if4pFs1C;ZIO|p+>BrMuKsd~C1=oh4b&h{;I6h( z0!!Jy1JV8V1e?#3KaZw%ohiYr6P6JcB0=r5e-IXJw}&}t+&Hn|buOw>P2zgUwSxj- zzWEW;(-ey1?nWQ&WkNc@IDij-$LBA-kIC~_rn^(%SoKx)0jT|kGc2~kBQCf%qTl0B zjp72IHDWE^Yb%=Rrbu59(pKo#Xr8&gR`-1yAZ>nC@?6qyD>?jKJ)OWLyEYl9&Sb0~wMYRJ;c%7JTBB9wAXXst9T$8({{=-{JSIWG(HK zSQ5CYBgy5GVKn^8XS4TT2~Y`K&WA$v^_Jpa$wRl*4&1ji5;y|^z{&%jtyb|)JNSp+ zLw}mcS>|t69ja`3$J{vA$c7ej_+p!6V{+3`CL0wLl|z^42jRO#X(*NV4bQ(<(zdwH z?;(@kOJ>1Zf3@GqwBajRL^b5grwNIFa<b>P{`(|lCD_WrwGwl7O!D!F%4$`va{_=_y z+w=ajSzEaqc!|^8PH(8ytnn&axtVOkdfU2wz!sM++V#1#kxAe1;gdKWzd0o34tt*Q z?LcIx%lZN*8kZNQx#>#T!W zwG9+(Y7~G5DURxOW+-3D3G|KfV~r@4Dl^PI2opKtoAALzDrJ4;!!Gr@J=t3yPdEqN z++E0XeT5#{2ma)wBCB8!i>+DiMI!s_XK!Ge6JuVYpuIqa2t$VPT;XLe!EnV(4av4n#GNpikTPig@5 zGloL}ogHp&7ZsNIQ^iHcxz|ZaD^-G)+&8bcma_e}k1| zxhj?BG6$7ukzyexZb<&qyN4c4_IN z*vgq-AxB;!6@>0Mm-RBV2kVV{=gR)|VNb6X=IzV4t8*XLDsq-J2n=OYtx_xD+P0{+ z@3i2>mn~KSn`(T^s56t)<{r*WiTx;m_U|A!TJoOPxCWnEZY|oar(W&p%HjBSIwHQipbN*n= zu2z?Ra{l{FhOk7bDB$tbJ_OF5X(xnG*4WR#ep`k5H&~{2rsfywdArSD0{J^P5+hpt zZN^?Qkha-2)^!7NI{Nf~5xG08He5^l2D!8k=?Vx>O zd+lz-%inC<_FQPGI26}l+!VXD)vDzza%m+z)rC;GJoxY8x4gZccU^MFzngw|>)s+f zoDThYF!^@00KD-={-DG@c*Y=F=z4q)#GPq4$`wexjHGIdX+r%uin?lI zh)fKBPrr71=hR_yH=UZ2ag9MbDqbdDpod;jV;l-QA9L>z4dx3K*2D(#mL12wc1eU3 zrc}a8BrZ&%P(0+LP{=xD$y&gADq|^}a`#d`z(Qpdo-LeAl^Vc=4|J$;;EJ#1;)<%k zxy)gw8=e1rEH{`4FVc>gts#^)~&wh7?sm{=uPouF4i=yO0-+4t@&iE#1S^mn`D z+%$*kUiLu!bJ^!NB--kph>SIKkH-uNzo9TP!^gA|e#J}E?o1blfMk9m@4{w`lH+Qi z+^eP|{^D181m#NGSZ{^@Fr)tDAd(xO<)bt1l}=EM#`{1JsLhb7J_qN>5Hc-_> z!9FQ%aMn=aCrIN!%Cm$dE+k!U%?f>@MOjoAsAQ;7Imlmiv|5gDTAZ@zwSOW&NYU;{ zuB>u3wYVB1jkd*gaE80M;+&8dH{lR=m;OfMOtZ4-2skn=-YAJap<7d;t)-yYD${l= zpwV?2Y+%ErhM3U|oP+v_BaiLomivnYsDQ?ZiD{;-;0VA1$6H|2EoV6r~wuEE`}5ujv3=-6H29?WxzRiU(Te8;6sm zCLjPC8AT!#C&L1NQ_?LHxo4Kl#h5@)*9S$H?)G!b!TeXQeZ27@Z;bEGsSOxd{{t@N^u+DROtsV9&S5>v4{Pr+fuNNg$3xDIvfv#%4E% z1LpU-J^~s73R-Hn_#L-v{eojhvoB`HFYlh`3fN2=|KXeK|}6)Wv!9inFfj*#fA0we_@`IFPLQq6UE$0|iG5iaFPR~AmangHH zs-dlglXGrjdFlUo(LmLHCy`bru!Xk4Ge0el_+3Hf5=1Fdwk`E!Yg~3(quplv8NZ~H zHQu|b_qBTQeD2PXnE{w$$(@{@#mpLEG5TY%wL3NKm&Wzh-~_$`J0l(eC0R9NGB z6z}m}INC5uFx0qrE?5av%>%I)svRgQoG#PYZ7O%BHR@rLvqaev&Zn^_dzL;#_rzVb z5$U0esm_3vd{OI|C_tOz&mW1iSm&RPqs0!cW$!yBoRko>?m|IS1y-Bd5TRKs;M}G~ zN30K{*ZLD>^o zXa-Gv&{C@Bsi-o~Zjjkn{2g!fq?nv*-dn@o?7LK3x(w=5JYO5?voic__qkhsHs+Rj z1B||O)%t8a4efc04fgSncmG9N$~y_Km0FW8rs>0MPT+3I;zM<4UFl00#OyxD^maA+ zQ<=3t91vrND4*IY@SQ1PgWBGb*@He9tUdGqXbk{qe7L`_2+rpLUQp71enhoV{Cy^^ z1St(H#g1V(Tn82?7lz3GRD0mRM$3>-jb#__hnuf2_7XCJx5{oAc_OpIWF&nx*V7Rj z3q7RI0*G44qV@D+-8CuKUP??bt;^j{zqe*Yw$oBh&_V)6@=4lGFzUU2+I>IG@N=sl zuI*Yc4NePb-t#~&$rrYFjKz!JD=5EPk@{C~({&(?-;(G-o~+P`(yx_TM;L>1rX+b9#11L=!)ok9Q{~bU66dc9@E*|G z`3A-kG+%v{m3jU_x)dDXLzt7 z-};5FN}bugc>4b&YwWd0z5X|nZDY?6l8MbdWrR=gY|k0mZU07-;JJC?xaXIUV8t}m zlP2kOSey%taGc~d=sE*t)l9wOyCCA)S1<4~q^rZ*-h-Vu>4VlmziU;eTIrDZ{|VGc zw;wzcpSjt|2E^QVeu5|;13@FjJpVVrc6;gUO?#gazpty!*AN7YG8+jReFCIfN4E&= zg{Ls#A{qqZ)qch1?fg}P$E}*o0>b;<{r=lvQV`nxHhcB@w?;IYxeWUSx$)h0U(|)k z2&+{5|DrQtY=BP~5J8@&YL zxZj{`u75rX73W>tg?+DBLLVE3cgNfJiJfoGB99|Cn^Jf7U#x1$qc=whdkQ7cbb*<# zzL?5PDFg1j+b)u$E0556GjWlRKM1x%N&i_U&|N{zMKt{GbsC;$qCy4Ti6M)ljWqQMU&sFRPwc(U6BaY|tKz zp@oKq_e<`d338Q~vx&CA#me{b^Z?Bj**{L56&d;85w`Xfr0bqx_{(R{swI84ApEtS zOnR|TBrvN9_T8l+zznB@uL}=xux-}13 zJ0ZH0x7k`&-0vnm=jc< zT$RA)tZrA#vF?WgbwQzj1GaK`=`sgQVVraXKu_-0{6C0$W~)mXmyl^bRkUgro-^Ma=EMl(nQv+GwH;yX!}l77Ztq~NtP z)xajrTC75lq;r@1G7s11o9F)C;edj}-n9ldqDSw<04)?My^S4qF#bz-hA-N0haPJ_ z?xR-H`_@-nxPUT8epaiHdDI3q+InCXo?yPd1te{i(Xr}duxvAu2nLvLultGL zG4Y9KYxUe<^^fz#S5%<35+|fk8LDdd@Wj=OdQ-GlunXD0)UGNO>eMaF6qT_mBe5ju zl`GxWq12^*=3#-Euot8nqM0NQ?W)!e6DF7ztgBnXLH6s~C1CtgR_VNg!&GNDqJGBlpznO(A zwn<5;2o{k~zJ#+ni@{QUODVB+1}7Q&aO18kVc=oOmg^c~e9So~0%hTPrdhqOto?Jf z;&l69olw3Ph4`%8oi6~-wP3qmMoB2ELOf{?)TZaaPI#k&7_UojjS}>qFnsf91QxD7 z$qL-x`}DBmDQ@b2tGcT*g~~?M(y>?rYPRdY5POZl%--Wkp5B`Rn=+~I8KkPMuFhZ! zuu*L_*)UQ-6yet(E<1lOsv4H6VN=p!|0bS~UH*N66+hBrvK!pCV1mXnWaY`ixcrm~i#bKgn87e1o#h;I z1i$4yial6u-t52Fa--Q}V*09nzbLcX#-cp7jzE_N3!L9f5N3KqzG z`gwI7$886$Vts@m@&ql^AoO>!Zdi_=++ZGe-`lzz5;3^HKaCrW)Om;dXA>g z1hmwyE_(WrEbBVC+>*<5JYK-FjX7p4V?aDoJgOAwIl=17W}}H`FU`m49B36aiNI<3 zrMsr1z2fuj9WMR=)FP6+T}PcoQXiMtP3B{n`mqYJI1& zLEro`{p#=i_t||KQ~;DztJ91PLZ>qjA{=$3w=MehKNx$*;7G%^T{pIE+qN;WZD*p1 zZQIVowrx*r+jhs^dEfP|U3;%ztLmw)?y9HyuI@iweO~8v9OB=naA?U}#hFYNs5aR2 z14`iEmsG_bQV+v*y?mH&Y1L5Jy3aHO8a@0K2?j4dy&C}9laIA_Ky+%eo{`{{FIPsl zVvT67q=b&K&ZiJhu39I*%XrgkU|?l^8{!0Y1EuI{^=80F*tpL)$_~0Nc&936Ou># zHdB2%;0$T@p>C9}c=tOh77Mt@^Sbg0K}lMLUUiPCrVnK#2NiYWsg0nWChUu5r1?5xHzL6K-COgS%2yt@vs;e39F7P< z;>UEEjW8f^lsm4SQ|!lLYPht9xFUj@O?9}&I;WGyKUSzBSDX~0czQ#WM^n4GqkN69 zCKgRQ-dYnfbj=^1el~R%v>wi;k+T>XBjVGg6i*f%wYW&qJcghOr`}Vo6JfRawtPqMs^p6Hb81&R8uqbTPW|foYq_m|1JA}QRO~>vclHdOsYx}ranYtHD!LBQ+o2>+(sN;07 z7UX|Gl-`*p{>aXDYNsgcb1hgRjWg6T7`~caTY^B9woRc z6q-UJT$w9b)POCaX=VBx-Z>rZ_=s~kj-z<%JWcv}d2U9>%kCB5Ow~#@;I#+F-D5nA z_+I~f64&RI_4Mq{K?BOFqOEwzZPkxlAf+|2y?ws0bbUA6RjXo`I5AL-^eF~E&0#){s+D5Eqc}i=qA$RfkhkdDjD#pY98~sYMJ$K`Frj-TraeH$Fe|GX zul+d&U7(hr;Wi>ajgL%cG#`#TcxmelpNU~;QAGAAvOHZ1E2@2s?-(Sh9eZTeT@^9V zb|BHVc0(YvX!sNN*ncR#$>Za;H66QGR3J@J z%op%v==Yub9jzy+t}!;(-@mcYm@An5(M0ZeCR!4ox?*R-6YiAv2VJ>Rkw@4QS+dpP z_DMnl-0`}VZ?Z#>C=HnGBJ3}wQ7P)S2u%9@E@JJ@GqkzEscuQ<#1GaH>A_=`YZ@NO9RBV5!He`5mCNg7xrq8-@w57$@Q-q0FCtHzaVbC~ygk+V*b zn87RUA;lpRw~EGDt{oCvo5eNsXKG<2)zHxZNkj>fEyP|jlpy#sL9u>UZjf~-V;c3f zsNU(yNZT);u`4=-^Pq&P3~zgnXMGn7u|XHAJH1aWEj2;5&46EIa*#G`iov6t1Eq4_ z+p1!)@lKgLcNl_EuzpE9`=3hlDF~5@n#J9y&o7uVp>(BMFm{6U;rS8GI(uLc((g3+UNt!WP#aD*D zfBojZSDssu8_ffZCzTGCNwu)wnTxK?+stxRG+NQ5Ld*7k*sA@+$JRtjD^NvU z(bG(kLd|Kw?&gfpJ}YJ`>qA0Y3qTo<<{M$3j#tG%>scYUmv-`!R$1e5Vy}B-F}z@2 z^^^)A>RpN{=%+xOL?Wn*R`kM|86q(#Y4{+Dpjh{Wkc zYs*#_!(xcby!vlcS=QH@3P49bJPztbS0MLkG^NZ=&t1x=$w>CXajbhwT?+uH#B{f_ zz>H{8@Hi@B4%~U6#^S909KK>wcYzw;4%qP2J~p@GW6fW0ntfz3_ITu8vu@Q=e&|Ky z4Ok(6AGB_BW&@eHA52(3N3`B=&WNx->i`bYyA*C zY0KKsA!pfM$HsbgG&nz5l!hwv^Gw{@yik@E_sN`tq9c-AgCOA2MxB$=_NLR|BvGg; z1Np{okF{@|u8E|_dy%#PK*LD7KZz+L;kaPD)WqJX$u2j=_oSv`ZQdx$n)&l4zZ-sJ z(V30O0!^Mbmrd)qL(+7TkW1-3%w8>mFxHH+I8rWV8&azB;T?#XF0W z#%H;s^R?{v4YI6^S5sYC^`XSQ-CcruqWwnsE~ZxaKcCS2I4m!a3Q-?@UJAt{9aB1@ zBAM#vOJte}=-HQqST>?h#&TkXCI7cLDH7o!DIL8$S;;ch)xddwzU@r@dbPx7AqT?& z`&r)hRm5&P#q~|pOpQL*Z2XqeIa~W{t`@HOeqmxJ3B?@bsD|D~df6P~JiR<4gr`Mu z#IfWzHS@0dD6j@580*vT+NJ?pHlhd{@UB@_UtkCeRP7e1pLMx)qvu|TU}0b-o=exy zR6=q6Zv>d6MZl#C&&N1QeQ2XGQE2ydwmW7mhbloMND+Q+dX-s%6cKvi5stoU#Qtl;}M9E#K}IxpmVp71zuz_qpX(%E5bS+(K!(q#8Y! zL(V@mxr$`lp+BI)Eo8}CExofk7)6yzl2+r;x-O6;4I|MC-2cD5XJ|oJ=ot3R_U6#^ zCM_vwVbBjh>*|K_lW7kT&ZKuDDGF>${rBoqvnpw;2HI6hrNg>rVQx$_`&+BJ-J{Q%s)iy>tl11&mWslxxBegD00eT@Q1zI72?n4Ibd6G7SXKX z=w!n5`v*!WW43=N5byo3PbzpfZCo(hAj?lpYW4n|03DcXE+hV~_o>W13WSE38V=~5 zFzo7k*Wh_@TTig93nzZuH>Iss{}02;vThpNpljyG;7wC)s4A1|*!1oXTf(l^r5ojm z(T&@mBD>;{*Av$?IV&&Nt1qM>IAp zS)Lw1Z1JimnRTD#j(qmx8Hub`P`tz6bsTpfz7b+D$|0nQ0)6XID0=`dNcf+S1ep2! zM_A({?ess;(f$9)NY4I-{dj)Dh0TkBAMQ9#orzxO{}*#K%=`ajjt1iYFh@&5AT@}6 zE_PnvRE0EF{Y8309BvS<-TxKDK~lcoSf+GyhB+_1{9jmp;#CM|Mb3{Bu`;fBivA<{ zVLTNp_?GS>E@N)M-jTb&bxqCg}#cRWVVC|*CdW;=p@#*9kIdgc@g&+<+AaGWhsR{RcQ&PT;=<(`)6p#1PkwPL>Te~dj+|;xx9XoztnHK$1HWjO2RcGu021E z8dnuYs_T`#KF(eMr0VB|iqG%^j!VSo!|~q+;;%4}UN-byk2$LnH`%ThrGWb0(gX1$ znywYqSeVrEzb(ikzZC~vB=@E0AB%cAhZ3{1v%eieD{g0q4$50vgN>`2Lp+fd1DW^y z%he&5Wtt?$+`R#32c^ft z! ziVf;*rud?Ygqz}SIG}NGbPHO^5yh1%)a8AkJQ087q zx>1I70Nj)0JRQ+4Eu`R~_Z|zP9sY%J9FM~65>XKzeCx<@uWo&sTV5ZzT(+sbh*;6K z4pUuw@!Y)A{!&}b_w-BrDt~r$EEzEx8h3Fr3wU;!{p7Y#IeK8PG9^TeqxpyhPZa=~f?4BH$R%+TU>+S0Pe* zO$TSq`p!1A%1~Ru6 zqU>?NE+Cz`>W(0|BjCcL{c7!bk9Hq8ZV`X>^WEXEbf>+9#b5NW+3=hMRkI=fzDLY8~fYKdh()$}#1-I&=%e_R?N({h42~x<_RD z_G8TX_wWL4tB-Ur2lQG?20U}qTUOl?stf|8Fr>`@K|6pKO(NCL9ekqNaSPVfsf#c{ z^b};VJ?T@6B{nPz#(&!j;zhxQ9_0eF{kEVVnx0G^2@96r#MCwXt?6IRvZ|Vxhu-hn z3j|9@Ow7JMvNGuf=2F%`y@VJDAv>@Nev?97jod#@l{P5fKwxI8xX?bVPed|w;omqP z6t^L@cyez`q4*`w0{?Au!iAQ#rPo!WzzV0h`WMM4a49vPBvzfP;GWN^*)vl`Ib+BT zMn#Ph*4_Nz`3G>Sw3IL=pb?n6*7y0VarLL$OlmGOCai~UtN?n|LalmX!V$EMk#}_% z)PE>qiktFMdh!5;4L|W}h1~Jwe>&8^N4!c)e}_rfA%1y09j7(=UHZIu_r0?RVAC8$ zg`Af^N6=mE^Ffu?|6TF+wfCZk|52bTsG2Jl6_CK8V~1-4fAoLfg74=^y?{9Qu7Fm? zHqEItr!_In^cWYlRv-Q(Z6|rqt*n=`Zk_k_k>ReiJ zT#ib>bgeg*T2jiIddy@o&0!)6oYlY`aPQn13BS^4XfQ%w46y{m!+y4adZ{K4o`1A;#PY`v%t_gU|_?X~Bu|DwKz?VAI0W zPZ>S2JVvw7Olj-830^vP=?_707ddwSr!z|_n>d(Su@OUP#z4>oN;8SZhn^a;ZL(CG zR#uxZ*w&d;==R_8DCHqlT{KlKUeU-Lpd`ohKBm?msR#IaT5l)JpNK1FxYHccw-wzP zO{aB}ZxF=;_oIhrmFpba?jp4{Yu=F*nK^8a z4x4lgMPpzd$z*(PF`sNmuRuFSqcWxPKP?gNr5Ck{EyGE-P9~q@bu)5JiCR$jGi690KxB*_LG96KI`#>uruP zQoAhKFHC-G2FmH0!!1>vf>A%Il+OO(%+-;iVoFpLZ`l>b|DKIqL!w59QK|K9kuDic z0Vi5&Ck7kT@5bP@nsGipGA^f{Gc^RM%_48Q01KwFr5aQ1x4gWPOG{A{1$GjNaC`Vb z*!Qy8O-5T3(In8vtJ1vX9>*&KH(HGCtT1AhO7HLhaB82x0AF9Gi%LM7FKO+Ur|V}- z*IVY=qrvf#Uy2^#fj28~n{5Xe6NZ-$Op_qk`rrqP$H?!tgt2j6CaPV6rK$x#_&2-k zuZ_HKjb3`JKXuz|*k*(4>qLlOg~Z~q1!BngQwzT=QPG&d zA%)n+iQ$IFSDd8?!~7o{&?E^V10NjdBniWU9vsAeUWGh3=t}0o!&lFQhW*rStz`gW zreZ_6P?aRRu%jR){uH}VP#~`UIJ+TSzyb)_&6{A{%H5u0o_7OV7m%FEnX6q2Tx{xU zxuO^p13azOe3cGEOTS%W(GJ!dYEu5&&moV1dmH#Io(SdUF${0uN~tF4(#?qxu6N}& zc0FIcpRw+o8=yn^t>gv4ko_U?iQVS(Rj%#-Z=_celLgjFuiSmQeW8HVfN5SQv~Y^* zhspEx&J(UpTfNNn$8^N6(;C;7AN~7^VZZk`Aj74D3qJ(gFJxWni( z$+Q>pNq6|Y{?L#8vgn{okRaz;v>@3utJOWHLI_g_pz(vr{M=!dtkuH^a6ky|U#ge0 z1yP`lWL}wk9mLbl9y+?b>K8CO4{Dsrjitp*p2Xa`{dl&r0z=L9!;Bp*-Ja%U#MvDj1Wx*tE+LC;5G4lYBNP9?!3%+PrVN-DPos?+Ym%KW ziv~@TxbtKDh|4D015CapgfK$tG(!C6UrVLM!o=P+Hj5iFNCKPF$$WX>mMrV* zP`a0LSGQ^MhY0dll&C;(n()L0UPzFY>)Q7Wv0Y&QAEeh;vow6iLxXu}wGdOcI^|YH zx_DS*w^JxkrX`88)Udr6MF_lQCX2e=z`}KuX`sIAB8uH1bxeWu_ok}9C2@tYPPWkH zDyCaVOBG3fMUu1$!Uq~6a>ip*wJCshyQauDSR8s~HO2l7TY7;-V&Myz;YtZ2nhb`(0Vh&S3@n zzC$O#I{A&|gp!Su+wtYd+xFCH7z^MD?#4r4%5gS=)m;U_Z0QT3uiK>j1IxGZ?fej@ zK=@@e{$AEYYl9jsp59M)s@GRVV}`{hKE-&~9d>YyGMCdsn{Stsz`2j6>eGgpBLq=A zn2x0ETC%jxPEA1*a_yC&?OpOPw)EXsYS{I#!~JGZtuB-MU1MiM_a8W`dD%C!Jjr1U z=A1Yy7TLY;1h_~3D?M9p$Z_lJ2aF%w-(2wk6PB{W3|p8Nqx;>VB4xmd^i$xom#PoX zA74dPCgK;im*4=aAnu#1{>&Lcb#mv2dkpg(KlkiBe7Nh~r{K+d*noI5UXUKO! zwKA%^=`X;Kx$B!ufg0Hs$c8SFR+YZ^J}Emv;3$-XlnBD|`LW&4<7pq$o?`@(x7Kpy zG^j$5_2@YlJm&vKFkaBQDz{l1je47L6f{T3OxbQDv0y| zBEuCIA>}&PQNxxX0Vj8Z1avJhMpJ7uRGG~()G$s%BoAGof627shnN^&Ug}zv;{d>0 z7iJBLl~_iseEXMHh;Z1(qbWRwL}6FN#n?q?;7ZMcTfs`htZSW96MpwKFQYyfjnv*k zX`Y8L`>Curmn1Qs1=NM)v&!gG<-{dtr+YbyTCVjC>D4lEqa^Z;5rg#0Y?-uGE0zRX-+cQg8yCqLb;VZa~e2rS$66ri)$fHiU@^FAUO0}D}M z+Fm>47{qB!DL(#HO94zu!>R){7di(VW+DeWFC#FpJ?|=T6m$vc%Vlb7>{}U>PAYjE zLF!tAE`Jbe2o2DkA>zA>6}%&71FkQF6evIPYDi-Qw@P1e=^RTf>n4gX7JXE|xy(M2 zP2dkL9_(5X?nYI=4o;wYcpe6HlVqWN3puc>g8WPG>|0)wnP4h_A*~4l*->$%>PR7rbgs6>< zEFE}cf4oq~2QwcQmBu24b@Y$cZEb@CHO+nXo_9RJ>}3MA7EumDX(Md;S}x?Llz6+@ z$Q&XEeRXbP2@KwVjkJd*p}=Oh4Z!q>cy#S361A#O)DrqCJwb~_wgWW0M)2-hBs|JwS#-ppyIzQA?sm+nPli65C7V!7QZqw3cu3@lfW?yFU`k`Q9N;wrA% zMtg3`RnAIN*O6>zTr#|kXS0eIR+P6jEH>>18b))M8dqVMO#(q_*crN0LsT*Oxnd+r zC4sR=ejI~DC)7#5aR}!OOHWd#&3uszySXS?Hq+(ZBTnia5effJ82dt0-)saD)$5)E zA-qv?l!mhq@&iL#iSj1|uBgggyTX8zCPO>%%8j!SLjE<9{&OJ0dU&@mT%=aCFo{?Z zs`nkQo6U~GsrioEY)|BxR1KAR5EI#o;XiPl95({zACPLd#i<0dkmhp7-c{t~^NeBQ z!~Ro#sXy8*Q9;~$omuJB{1phR!MyJaCT3k+ukgWg*kCS#zz0d6o>#T+DN~WQ1#j`_ zFT>4l($-IZ1hF(_rBx0w`UB&Mkz~ElN?j|{Rrz}s8wnvy)AHnx^=~;^U@w&jrx3f~ zx24`L4BR{46a$G#+VoOXzcK5P4M9mh3Ya=?7@U1;=3|k=3`P9|uFM2Im3qBOnpVov zJ2ZAxIP!(cf6-)fPSiP~*N#msZbX^m^)NjnC&GxfECX6WZ{!xca5A=|y-yI;w64be zDL+CwXm+jXz1GPeJJRIgU#=YE#?w0!6Mi0B*a{e>ClXSYUAjUzQDY^0 zI=VQtsA%z75n$Bvc3zkO^0{O(fKpkc5kIyLoi|+r!_~bhPjJwp#3d10enGYNt^>!Z zS3lAGjE4pEQF2&18FlXg8L&Czy3c>BqdDQU^ct12dl=7o;c@^Eq8Y`mX)U`o13YrN^^(-s|5Ay)5Q{Ea2-a~bQP&%wC(=*Jwh#iUFr z{_Zg@6ToR0sS^=P=+DC{B{Lp(0D>dL-%YsT@>icu5udc&{X4?K6aTTOZ=l>>v5%2o z)jhZW0r^k>6UKv@Bj48Bzw5Mp(rpo$MPab6j;cUd+&y__Wq103PjL5u zn$=xKak~h4pA6Si&7Siwd$e7@VREU=%#74wgj_~pwb>z9lkIADrGd^wAkhzH)Y*m&IR`M`FNB42f*um^h|sD?`ABU zMcr4}NZq$~07nfv)lY-<=9-z1F-3Ey>FQj6kItW`RNm=xX6gHshRY@f^)s{ddx`Vn z(Np=`X$9kLM^=C}`Wq=rY?lT5EoI9a!M9!ST1p!^pGaE%oTiM7U{5CI43zRybuNeu zONR_cpZ9S6`4r%SU-yj{NQ>}!T>o8{i+y|A0KOW)ML6)tt{PDAeddf|buJ>OS5^+o z-h4@kpY7;)`*hz!O{LW%8FC4;*PiL=B-d{K_|MMchbHQpFBWSR)zfaM`#Vwb6&vm_ zdn-N?ytv74U*b#1CED8U+zk7(9KgrlciChi+@|S^owgmx{V#$Sx8xADC zmw;bk4*xD`%r)LalObXAb%3!1!oGF%;T`n-O)$A62X1w|AL4+kr0>)4o2Z7`P1hh_ z#-5^JQ52hd4Zxqgf?!Ur3^89F2wJ|C_p2{XxJHPD+iRO4RWcSiBHe=eL$SF^*~Z@D zIYg9lk5}h$91@j{yi_%7+E(YsD(+^nvKR%O3b&#T*V*b*>ozO<1TNGFPec*$d)RXq zMmTNi4=UMm4t8Q&f%^6g{>cD}0vy^}KucD79t}QpCmZlak>;=*mP1naqV0rQC%I>( zx<-UdGq12tGmvw9z0EzGUEY-eMGcu!eC)*HqPf2%ira+k!JpK@iwoWa z{A~eSG8`R^NV|QwRW5P+qXQ{x^0U2{4HC5Ox_<$w3u&jK$`Jf{go@6n_3DSjR6HH> zImfGTdE4eNQ&^kN%qL1O+4_Eb9EI(CzkG)!NVnQl}U5c!iuKq_| z%WQTO!Ox`IOjE((fMg(ytkac9pcS#u{7&g0`GT7aEU0fUD&y`=ZiFDE8qI|orPSxb z4O@kpL^3!jBm1uK212$57~XLSfZfOn-?yqOhY;zIdE3S-l; zKzSOaGr56p{cvompvN>$D1Lm9^Qv zMA>c`qblPI=rGj+b$<%++b_LVNWd~{#&^505}JQ9d^1e^@*yA~g%G%OFz^MezAPoF z?y$~Ye5n_9n!dHz_#0be#aMYYf0oN;?hCGm9ou4Ux%BNL=pYVQck3UUMX2YRQA1UP z&&wR>kS79_a6d_0e)~*L!nk5j2af*Reu^iyhsQr<+Q#~rvX&tD*Q<0B$p&52RI&_y z5gdj=r#d32%4A2q({{w|?C9=w1=QI(aDPuP^rjmBYC8}f>Ev3iIO?{CXnz0?q;f1z zm%ligtOFgAfhNC3ad#5P0X2lTIrxw3E1Bui)h?!Rkw314ZG-}J(1Z#9A){Cb$YcYl zM}X_YCW1Z?=IH|{H1IRU?XLC3P|B<8UYpxwew%FYZcp}<(b&ki65T|A5}0KV9y<5F z=f+1#^epK*2k#n2g^$aPfi>Bnjk?!`ht05D95x3M(@t4<-MqgLQ-2nFo*A~2?@>e$ zPx<Ob)s%Bxu2sb}qq3%!^IFK3p4?dp+Db*lW z1tx7WZLnkl)a^mJ$OYwJlh7{TG^T@J898ND|h(iqXl?Kce+4rXuTfes%VWh4N4hH0noW!ic{N;c;ERd z(?6UJ<(;hf5hmw$vL?T+oFRCxUGbo^)|o!uHj>4vY$`}fH8wliZ1rwensgL&a8i@4 z)k2z$AVCWL()j)k!j0jRF{?+dylY+wYLY421BMGQ=WAux`9+>@$LA-%{boOeYq(ss zK})D$B1~&mHmD*l7-DjQutnCFVAb>h)-@J{K_BXhjq#4=fhk~-hP>p|xd+3IXJ5(W z44G_*eBJyobg{i963&ZPt*`Ge5p!r9`b}V6Lz2C|=JPa$b$@7sq%FxCY~JfUsN*R9 zZ4``6ke?3`Vj&@0P;O4)hzrAu_M6F;BeEti3i$1ti7lPJ17CLpcUy1-C0$F_w!c3` zvQ7S@i6VD7*_3-h1VICH6~6A@jtEF>_%*)$5RrLA>-*X1mC^m}0`f~?y;6b6L;J@0 zi@qSckno{lL!BhiT56#P)&(6oeMd$2fFVi7ER`jzoHZd;fwlj5%Dvr}i|e}gM37V; zXTFz|Ta`U>xArA|j;bK(hofg9G5A0(0>XAq&gaM3Vd;?>mtp=!JVI?ylDc3)0{bxh zvyBG88t$ldT*XW$me&E@tuN7}DH}xHr$Q1vp8Aq6{AdR$2;`NdXH#w1 zh7 zLds^C$KT+y7;u{QOZb047&A56Wb;YD-Wui0lO^7}xi*T-?D9qiq3#Zt($Dmwvq6yO zWt_!ns1OhG&|Ut5vLaHu=El&PZE@U3#ZV$Ub?FkLi!maBaTDq%uCKpM{2J6tux6`Z zDQE2nRxY^YHk@;9n@4w^0TWm2?Ddw^fGcUH%zCExeU1Vmw(CdJ)Ug=e){ zM^&{_9zGD=-!bSai?jh!lwf?HGA)N_WTmJ-4M}#H=JoX?@i%4|5Y08Ug@5woI5*Z z=gH2(Ic=@leMIm*SJFy!-6D<@6C0Zdx(hJjl9_ft_Ul*(C zYBz4Gti?igD>PGo*{+_UIj#<{4`jtVC`;D6AhKu^pRm6Zh+Vs9w+}{F_n6(WGLGE{ z_%YRv$ZE@7x;E{< zTE}u6MA30sfp1tfO8-ZsdCNnxj*Lh%AAmZS`fvnd-H&qoVM6Nz4DI6T{_wP$`^~j# z=gTv;%0DS$laO$jN~)?jb-+hFh4sOWV!k#p!ynEr@x1z5c{^7hrKgFd5CQQOg2ah+N@&-M^UTHTA}BmgumD*4_PketAX zeGib;DZP8K!EzAT<5TR~h$JdAmXxo-x1RQrTZny8pvf|k&|9O~UMJbS{v_7oKc#(Q zVYMCz~XGg}+F zJQZcWG!>bV=f#O_s%lQ^N`=*xh6=#n|w zeQ4DqqVL7BO2scYjFQHMXD?@y$Gh9p#n-mynFX5HR5H9c$}cx>hS*Mqu4USK!6*el z1>lXNgPlhKImRb)@u?>V)=qw#5FDeAq88e)w_2biWtaIX&izAwybv_(@XFVKm$WRmAy?>!N3(OnCtTJGd>vo5US8Yd&vip%oC+4J`zYsbf|0FxFv zDxu9Zh<%i-S6R6(aTMg^~*pQLjyC66Gf zAEU6@NM{@b0-jY(&+G&NZ!!P_;u_5mNBn846vW_aQU5+&OOB zq3=52R9nd5jp4TwTP+Mcl5zkqY$HIXYBE<&5TUIINTKmKD)?0q;}3? zDdon~$SUFFa%#Iff6A?N=(yS6{CEW!gm86AGeNUN`%YAobQ81#{ewg~WWZp;WB#ZP z=7ZdX24B+vgXRHWo#0C6fmF(*#=^0*-x`2*dufTENm&G*OyplKC2_jVxZ)u6TnQfH z!w|rvmWhN{=U@P}&}}M*O4nXJc`fA}u53t$F60&~zrfM@dj%gbLpWtcBDqpbo{Rzz zbj;C8#Voo!yecwgKBb}hKA8wOu369L&t7(>pbI|0i#l4Gc<9R;n~?FV=~&V5z(j}W zbjP2{=O)|~y!hWNOSqQNHyQ2qPGk=4tKU@t!V6jDSKWGLCOajWzU&8zvz4s9CS22H^7WAi=&YP zy>tA3h^1(?*MVT?Gz!oz^3A3-npnjZ%0KAtA`jW2^8|c`osb_t}o&yQc!Hh&90c$w8fQj*+t}*WCOq@9D&7{AbCVE|qtx zfzN;>^QPuJ$7v@gVP}MLZ|wh&2vlc{ksG9d*^4~cKVI`^FwDh=O!a9 zG`do|^{>Y%3#}jac{jxCc7We~k3jb+$rVw+tJQ6t&xRli>mz8%jT#@~+qxq#hL)4b zv}C31SAHXHwod%}f@(PV$%U|^z=CyK0r-%SsplDDDz)(0rsYPx3FfcWodw}wDpq^R z60m~@&)#Q5E;H{=v3+Ue6wn?wc=>63B&G38;oNQ&y}X!GbLXX3Y&)cZNxd=|t2G{@ zg02l-vHR!FZl5=Bg`p2#-+gpmoCW9zj|9H6-7e#8>!BTHPsJ%_Xl(h+J?H^c={nCp zI4iC`*pZYBJ7ooc&LO~G;MaBq7Wo)9oHlsm6T5P9yG{#m&F6h-itO*zraPtm^SBxN zNwpwv7<{H7YxSq582&pY+3Qd^f1_HdUJ6;4OHZn!9I8}H{ch1n2L6%UZDWxJ+bq@; z0X0{*y4kW6E-b!RE(?}7ZU?h^)nN(TJ9-PcDdZ1b=Es4kTMoKr#5*<3TMH65OX9D} z!{GcVQ=rXc(?MAiqZPaeWEJFNNNVh7qIx>+HBQ0)p0olll{OR3<(i1au~lwh()JAu z9cS%rlhVGo6nSb0xfK_-`k>_A0x6Q4un-CbOxW{%m8zXYa-ksW@n&zD>AT0rowcRI4aX5_m3|aJbUl0{u&T zktMO5$vE;K2!{IPcHItax$&rD5q4=v(;*Zfz|uh3J8E_-&`tfdBharB0X6W}-$yFl z9u-5M)`onlR5Et71M!>%j*tz~3vv$O3IB*E^p%K%84d$q4BfxhJ{TVTi(*gYpG2US z;2JFgpgEX;5RS;uJ7{Ood&C)R757O^CPX$&tZVRQ9a@%St6j5SkYRd zTpcDs?$GV~dvb~f6yw5HHus0JcsI6ow|zzpJ1ppRKd~nGB;YNui*f3ldiCI=E^C+( zN9P^};@hheX0Z1g#HQ0WnotZa&|vqA3uemKIc$YG;(+#ZRL&tGHA>I|$=df;u1LU$WLAywhEpqu*hrFpLHPUEz3Qey1Y#T<6@l*-!8 z4#a>9@r6qS7ahNFOFYR;|te$I3(+^^zO+S(73#{3j-C4~9t;8WbdPW@> zn4-44dw5N0I5*&d;?^z~#tXS7fS_ZvZgWhxeD7oat~2ey6707arm)RjlE*@^qfo3n ziLoYc|6G)4xJpl`|6|Nfm{{!``=KKShP*QrFCv6btzYRD#5{gD-kLV%qW8ol4)b~q zqDBZ9oiexjq);=-uabD&&`TXvS=AN9>?(VjnRfvkt-e&pKGel83V+e^WCvC{JEru8eDm zSnG8;j`vXiiZy^#7MmD~iZR(x{m5^c{ab=Y4Meatg}>z`7_cgi(f`M>0d5nIZZ$RJ z)FzV$UOb?dmU>2dZ9!1(aTR@%S0P4-+5BqigmC76yMm{mD_BTpBK4{MFdkikFxOum9${}f-z#HIm>rwo)y6= z@l8s4$tU#FFq0%d2$tdmm; zE1{xN@Rt@h&|jWC>^M~;=Y!oeR1@kd0$g}2p_80N9(OJ~r?$6L-WlPb%BBcQGyM`Q z1UD8oBa6rUcvsHNQ0aylG32DsD8#G&dL!4X?@G_@*Na0mMdJu$krzTuC|>$4a27>b z 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≤a|f6i5Yr=aVR*29!>c3CtBTwq_e;>Gn~z*$Pu8 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 literal 0 HcmV?d00001 diff --git a/tools/archive/boost.tar.gz b/tools/archive/boost.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..13f57cd560eb68e1b8281d43120f7c1e58395dd8 GIT binary patch literal 1285034 zcmV)IK)k;niwFqQ#z;^A17dG)b963rVR8WMJ^gdqNV5Agf5q&jUKR+(*zw0Z+wm60 zB;leAW+xb-Bb9{IRe-Dn2_g>@gz2n0Qzb-#N?Cl-zR}K!K#r_YKz5Ro|$`9ml zOZ3D(Q_rU^AwN7)+rC@W&NlC#gPv#pFm?V-yKhYgY}0a(ZT=6BkM<6Z_7C@9{y`4* zzt8`3e6;hwVQr9o{U7dEDn~H?hkMZc`}{w{XTkgr9hcGm*ci?R)J`SAVql1IA z`G38CaD?msV1Ivq@AU!P-v%X$OVWxln;`6_|*-vhFmq@umnIU6F2h1fy(_%Ss zx8_V9U2`<{3CwbZ)LpYrnkMU6%q`>nOVjgRvp4nGfJ|-d?2j3_K#3$BXXwwU%gB}4 zXST;msazRijpKcIw8SQ7QWmK5<;q2RaD# zvHjThCnvkRv)Qc7CBN*rquoT80yYHr`o@;o^Mdt)<0k{BKfPnNPko>+7`e*^rth8L z_h0Desqc7WlXR%>4Co2(fqt9bu^h9fcZ9Rc2($`yN1Q{(fK3>X1m7&j z`81svW7_|e`#pz)Sfz_`Ppv7-{c)PhAx>{XffNn^fGL+GG>Ku;@-JWtyeB6T*U5=b zNAec`<3COq&cZ6=BLD-&_KZZEo?+oioiY61n7GcvW6+k6&V=<%YMGyL!a*odETvQqL@p{A@qG-UXgB1)d9$=83c@Nzkz8cFBY%XO!vn($zip2CupW1}p zJLZ7PnagK=*W!Q3fcX-m=TC=20nul76N~!n45>glAl-9*0~F1)?-SiHpPkXRV%Ug~KWGQB!13{S|L-|Io7QkE`G1vzzpDR7sj>-o$kEgw8f_$wiD)|K1T z9s$1)Ov2NoWJVuR?+g8&?oa|If9GFQDjhpv96WRak=@8<-vs>+#D1t9m-k+ANbRZT zftexiO~5S2`4$KmGiw4~sVkga2dH!{AWrbcGQ9ycU2@Gh%f=b{bbK}h$Dm`;3G-<> zo`wxpkN3Ew_h9D!huNQi&q>O_ybc6&uFbydcp!KnxdR6CMy*E=ENE{!O7W(-pM2fn zT!G00$qpFgdcgPzQbS%$Tspd=z^y(*FhrX4ym8&B86WEH0(tq8gulr78?py+aUu7D z#Ci(*2oQwoCTD%m9{{X#<&9fi_|Sst1rT)XFU_dr0X zY3?EKhj|59zYZkv~RapAi2 zp;qFYc)eHQ{P{8D+D*IuwhCba=DR{+1r%@Ikk@jC#kK23v(+|?47fuSPyXmf0TQN-0&A`7o5oe$=r*qF@S_R0 z+8?S{w{_#P-mTZVjaC!H(eju^9;jtGGwv%oE_F?qc36r%^zuN8@H_a3J6uAD%Z9M( zLAHfj>yDYHLb{`$7)Ajmfbu-PxS%`Nb4foo(q}4S)PTanbs0k$6#CWSjg z53NfXSh7qi&rm8WmF41>CX*;J8iBcJwP9K=xzL=E%ERH`U$2EjVwjgnMZApKufL+Q z>A+O-5gk{=GMm#)Iug>y(7A2iv|C24CWo-MCZEzVT-Ixnc24(ExH@5 z(g-gR%5+|Q2PmMZr(73=!+J#Nvl!ZUE;J%O+7%iN72Un?N)VDewLs{kbfK$F-A8N! zW(`_^F?S|l(|yO4LKa_=3&>ragOYu53;?fJ70fc*h`7oY{;dOk`8`YZ|(EBy$7otw* zQsd&fc5{O$l2dTB%0w@~aQ(5~{-vYCP`*e3c>WHMqh{pZ3HtGx5b>A;ky)~#$D4hsO!?lOf9)9 zl?`SO!fo2m*0@K3WN@Gi2+PfTmcplCOyL&^LEl;iC%beoKzGYYnf=6OG}D>{}|PEy)wV7iXVM+d};p z2D)e665I-5C<8OqH4@qN=~E1Nd_4yI)i`GSjf>z8`dXmpH=YNu|1I|GWg-S|+y)Fm*$ zYk`*4i%z#)t#u39DFsb+7RzhMn~I$}laz{2NokQZPG|C#GLjNedW&x_n6=W#l60?# zSc`56Yc!)5d6p%sLYkNO0$FYQ4X)kyk9LoFDS{_bqmGN?lqCv72QxeP3v8QfIdtH~ z4Ks}G?QN4AUvP1+Z?3A{y3uMQJDcy)Qcd0JJ7Dg`pRl*?tAR?5&=x9uKS*-fj3 zKqZ9R_gc-xS8o-T^_aQ3nv5vvujx&kiEjq&O9B?xDGqP})3ErBSZqZ5k5Rg!Oj>d- zG80HeB10B)#KeOHzh|jBF$%T?ZscBVNxzN}vZ~-rU(&K~v}teqnMzV6tL=4n3e+&s8*l(vR@4VIzxv zj+*T(cLhz#LRVU>yu`EAbQxlY$`BFM#;5sGm>&<5!y*F24Fz7H=XtnQAdMo3A|PnDJm^c54VfJ@KIi6jjXBXp#!%m*z_P$Uv5puryjp0(Aia2ZJv7O03F3|O47 zHbFN%RdvTeiv2wR3@+U|fP)MeS1!R11@M|MdG7!w|G~#U2Tfl&tJ_Fgok=0ul%Z_V zhow{Bf#~JY@OOi++(^7*HZL}jsV=VOCR1OOjM&8K{S&wLLBBxa@{IV!4mb5&mMe&k?@%M0hl0u#^70Gwjj`k zZsssw07?KF?$&uC{0+9;I8eCHnXXR(ar{BH2jeI0+$M$yA(?Kp!L?|b{V3K0=k6}= ztBI&EyA<2L#+^iDc8F_cT2^c;UBHeLAOS^t>)FiA-%Wi! z2V=%(k_`eN1M1Tf@?Y{9vq042?J+gao5>%f%g1#pI45hK<1;Qf5lNw*$BH_xg==n6*b*~`##s%sd>jut^04fXe-Xw$_56H??! z17_H_BT(|G^+UT6I=bxH9&(R=Q`gr>F;cY=^fcTY@6)FKltV$zpU6tqgC zOWt2VooulxjWg_QEF>^$qMr!NtzSCieZ5`hP1VgAQN4u*0;{eFz3Z8yDY_CAY?V*O zSP|yPJu1fYhlKN!8#&G(tksgEFOvXfXY5QZk?OW6S~~1Qn5@U?Vc^UtRu6+wqQstp zc>@%8rp-;hFmm1}a{_`=A}~}5*2L{H@=tU?Eb|lNZjFf91JK}3AX1L+XVL}d#C!~ z5eOSF*Fv`kXg0b1rU5urzDfuMh>tn0dD&!KB6+oO;csJRS{4LWQ6Z|rz@Oxt*Xr>e^6Jf%QSEf< zZEWx^Px3#;G{70U4Lpu1lt`mv;8HNEO{3awSAR2FZKG;5Z?CS5ZoPfoXjZX~qtnF% zH!!yg&b-_&47_+b+J-C&j;Y8L?QbmHr63jfC7B+W!xQFAHF?A5 z*xB-!Z}7n(v!WEH72U}5pD%ks)}#kwqh!tEd9>{i={v^6cb82kZa9gSN}g2`Epj~A z#0T;#G17fWc5vKG)dc;T7QmdY2okDL7|{smwY?gGe3i5 zkft)GyfUc#%fkOQ|F3}mCC8O7`gmDCxGiRv2cQIo&T#qMyp%0*U(hc^UKTHW;x+)c zK6k{qGx<=AVDl5t;&JmRCa8?|qg$M}9HAK?xA`KnBQ&pI6l_5&S6XOJOgxI@O)Z~W zUP^9@cplSdbbwCSt>AST{W#%f07-p3*Tgq+y{SxuN;bQUQ!#;`B9Yj|#9^rVWqyL+ zktwa{rT~-ZuQ(?64saDuUqYuap-hPQR^Y;`EtSo3o@)ydaVgFOCXW4qGsw70N!5c_ z0iE z@`5W%5f)gP&HmI64YskjB5S~&?5|su<&j2w42dRGLBR`)PIDob{>5% z@-wMKyCXV)!KU{bW57>QFHey>vbFA`{aQhW7EXnU-mhV_%C=t6Uc%tVFOkse7ZQ6Slx^gI@Qn=7FW=K_Yd^sp34sW#hH&U&CMsEg ztQ1#o!h|WdX+_Hvm2H3hR#d4TPq(Uxq6xHSJLloVL$ra4>@-MAX6&GzW~R{Lz-~wU;p7w->X!sG>7B+dhCC>$6*8ed;mL%g>=o5I zjj+FTv3Aa}YNagC80NvszroN~)kk^)UTO(IsZQbtFN4iekaa;XF2WZ78KNFjJ$ATW z4u2-;Fo*fXGK^xv<#ZM~@DcOjXS8mW(= zpw%bK5NK+ELZ~UDUBI>=OwfYM1U9MX_=7b?S_qZ+@BBOP8~gB0c9tWT!I68>IUc*UI!_=ALKkmBUov zzlDz=4PC=@NJKd=K=^rqlH9EkrE4*F^Wyd$`~yD_Zj0?Wsv;Ntf7WQYs}Bf5NuW2p z8*H1gTrE6Ge3rEF0pI{$^i7)XV$S0`e+Ck1;5_9;AKc-RZSgCgq+%i}tOV)J7V7eu ziBDCV$x2K-Jc!#YOuFtd&)xKY@*?)*G)X3^X<`j&y1cnQn;uZCtj!qdszJ|fGm9yA zQkG>g6V-v(C27s)bNHcm9v_>?I%mU%by5+&B&KL@0#I2hDtsoLICAPSc84(#C`#f@ zZIE&NHHPR4BtATu4>~l;a0lTJ0!qnsE0598q`Hss85hckU;0TWS>6bCH$yV~_^x4E zf^*rk0JO{vxf<7Z+=I@gOe%<|RzBrbu5}Z@U<_OVCojMB3tP*`^OH(=hCM@-=)9Dz zwT;Kosl~ORnM?7FuiANX`7c`~0nKHp*3 za^;0%XE_dZ9t+p7Q%nq|Zb>;Ihze7)qzl=W?9w%7_^0W1LNrJbovB;ECmLq&As*s1 zcdBzU;+2J!S}|K)qJAXBtmYJWv}JQ@vj=|_k>ign!cKF1+Pa9ndbOH#ZL4&RTaZ<`cQw41trtpT+mv#(2N98@Omp+1x?* z+l-2J15bE{S!Oh&bLf6+@$o!+FxQ%eC!6vd0nmgbJ)0#lGxnQ}O^f9#R3y^Yl(y1=Lv+}?L@+>iugJa zvHrom;SpWoY=PI!4Wp>T0D^#~p>Bs6%9*^Ih2e|)b^?)(4!D%SECYel-xcsY~Tk9x1t_eOJ6% zYGmFckH+R;z<^I^D0}!?A4;aS`L8MCj4zWWR#Jfdz*hu`d>9CiJch(9Qv)_#*>EFFbz^KMdol(X1N=e^wZOAV4q* z6JI%uZ)X!_^Y}QmAqbbKiO0IC`oQ#es6E)JIndDNj~B%+U3*}C71b! z0(n?G*P@ZQc5`FYU~mtmkYsh0 z2PrSV#>L)x`_xk~_z`D3vYa4M&j17BRCxS~tH{FRq?+{zp0cllBI1-mP%y$*wQ9U``qX!j$zR_ zo+5ZEhP4E*@O2&fZSMqc`?LqLb}qam--rq^7=JPcuQ2?~!14wKr}+FEe2?%pPFjJ@ z4(&N#aol91Il;p;pOhDB?AYi;EqYC4noR@erFxBWyBPzr+&RK=)x(FVu1anl zC!0KJ?+{GtG1Jcb*6r1$flK>o__7;Ud^Gd=81S>Dld_8D%BbJ}pS^eQZyPrnh5NTZ z1vdLTS;>)QNp_rF+i_pVRuXT0JGQ*pp0dX}H+k20TkWl&l-p4NZp$$ak?fH^osOUBSPHKX)jRE z;>%aQzEVz>aAI+p?ipId1ih)t0a!q8pg)n|DSwHYTFlHkD~00A)(bK{aWdi3bk0J` z=!+FVv^!WlVp_yLh6o$NvNBR3ePbIj_byEQWJ$*5^@lRBS{K7B-+1ElFt|xw)-dnN zP#ah72-AP55YV;@Gj9I|1JF_aWmjehdm^EpH-ed~CG)m`pU2W1<&4E-5Q6zzu&9m) zSj$<=(K(_lBvz_9E!50$c+gc&+``LJ^IWUeAMCo-mXi5V^=VRh*3!E5@Tl_?`t{jf zej0mOM$O>cck0Srp-xF@TR99Q>VY@f>zqXB(i?M-Dt8#&0LYs#7+%sQC-W26ik?ii zKZ(I!B2tSq0cK0{Jg>nXJ^b7>CB?HS$Qh|WtSH!_XehXWFXtz3lO(f%R@i!sv%03O zINyu%k8K`rUYDI4@fBYCHYY4%JKKAQ53m(qyv?a@dEUPT{5%qe$3OQNu=e5ZgACWS0Yl%KhiL&n|APl?_vr8e zCVGrY-hh!C&x5pppMn8Hf17)^P_)m2{y7idg258GV|Cd6z4H`fMeaTi(gJ>-daTM& za<_fbevtV$jqAyk=OJ3a&-X~llLu4L#gq&mKt(?bd>pU`Q_)if>;Y8t^MK)iJ(!A~ zGGGs&qW`CB=#vLi(No6i0aWyNu2&vRMNi}U`>W{hg^~}wfrgRh%;pyOnGo;sM34N4 z$t{;6g6ln~s4jNmA2Q*s%;`>PCu%tR^J_Z`} zYr1@u3w_~#@Uy%q;vZs>u{{rZcj7YeBHG}rCkpuNSf{b3P01_DP)tdIWlM=lvJ+o* zceeXLMWi7f%wlpXB#X*<8v{6h7s|2b1 zwtZ3)53?7MGanymAGokh=_+COeT=UROtF{V7HnH;zlsNJlPINXMo>Pg*_%Rzg~=5yGP<4>!>P)TB95QM@cqT`Nsb(TOfh_t zBZvREV)$exIs6b}_+&;o{GE#7lSh`r^0@X-&!0c;$GgQ<&N8v=vOnzhCp}O8a-+x# z$C!uqo^3SXv$nbl|E|7y(_F#d%{Q+b^c+5|l{c+FHJh(jTdh`eW%c!+;4QrWlW06h z52t)4(bx@z_|qM%qXtFghW_EY2u_uTr5dZz`1`b==)Mt_Rvl+x(msxq|&X5 z7K~;M|F*<2daQ|Ee-K=gzxTnUKla6e*YjPmKkn7-wcnWaWE;Ca?pvHsa0g>D?8$}m zJH%3)1{dQST!ioYU2ll->VM`h+i4$y+0=9z z_3`akkki}fPPmlQERd;`XuCgL6>fRxd@G5E&Mn!f^YCx z(ao>ag^=C7Q}q9pB~G*Vam-;B6{Yg*w@ccG1}x{}_Tlb+`-Co>Neak()?gBacsuQ4 zG9*KpGFmSzq%Wy|Sy-S*2;5sJ=isGdXw6K%P0m-fMDlK-;HDq@m?EN&ZjBfyph__} zCjeV@BXgHtUY7r{h$8gwpJURji}iICm_Cj8kBltC**QA_ldPk|qTp@j_jm=*G43^M zx4<7Y8*Qr5-$G>TSGb2Io%%%3??KK>Wn_Vux1ryi1xS(qo?B^LlHw#Cb zE6N$JJ+Mr^g2l$(`@fdqE6gTdNqbD&`2`Iw*2+2l;#tJ79|bUumqpHuOKdZ#C8$t!MrJ6rW`Hrk#)Noxikq zo!$0+yVG_)9v?eKvB3gi|;;e}>xP=yBKXOD65n$%{gk*6J zPIqt;lZ4Q}DDDU_20E~sRpWpVh8>gT++5S8MW)M2$^@|#ToJqO(D(Y{edyig75Nz4 zU^>c={&2{d(x~7A7&9|lGqag9GV zV7-a?HzW7L8{Zjm^SXUdRic9@OL6?9BuD`xBSlcM~$f8=5)!Crly95wIxBx{-NOy~Td%USSw)Jdt^QGY8|zdzk7$f-#c)$T50JeiEh1tAcN> zw4Of?_9?LcKvLqpWQtLCuU()*`>)w-y?NbA+kY!7&1d`XDL%~78MU!S5fw5b_<`GNfKV+6r^twXB1O%cCb7r?gs5%HZzI*0J3Kc9&mK#T@ z7@@Zet9`XYgXtgFMWQdF3#<|h#AomBCIBN3pK;LuN|IlVGV;#v#9zE?P}}08HynD( zv4cL|@X7_lRpuAhwdf%6A_VvyFZ?f0oPq=&d*^{!m6PxFdOjO8Ur#L#yfA|4#AYY@uC|1bM1-k^U%F=2lO+<5U8Kr{%0?&nI^FbVH=3z zk`;UCM!`^S_39aA;@1f<6?}aie_b=T zk-8W&ZyarzkD_r8xY2xs#JKjh^O<*xY2krpTiLCvV0htQ@`hFV z9V2Cb2bRLJe_?+&z6ygIM>m>N2#v0B=t2w2e&mb-G+@K&Wht1&WEfGdReNy^F(HfF z3&^ar@g{J#2p?rF_mTIVQRsF3D7P!JEX&OWSt+=*onwMy3>40qeBom>`r=5@6 zCr&39d-N^b%LrDg-T8QO^vQX*y-NbNa#|Cesz~up<=pK#rfjOjF*Hkn3?^Y07MdL} zJ-u;No+M6ff~HVU)~<5URQN5SRO7wF?AlM7;u<&wio^{~A8K^*s;!Fkl@PeNojM6Q z7bqLwX{5xu7){RmewUpO@imF% z*0a+{@>G069MMQsUdn-@#T||t4Or^&!jGwB)v|IUuF#;k*`!9#VIqB|SOO&MWe-%< zcyS{0a9jJ3IHu>ldm;=;H5Aq2CF4K~BaC`iD^Z1U)m4yCW+g?E6l9YsDFDU2nu>QK z?RXLlesn@`s^u!#1Lg3O|!Vk3po!V4H-HGRo8 zS{E-;t{C)r!F}bpL+oJO#V|gCy;y0-CIr=jc9a{*ad}}Qjl%oCE%PHEWv-t{qMl3V z%(&P~nY8^Xm+-L=WIc#;C-Tr`EC?fxw{Zp15qI-gFA?G0F8K&!sOluvmZ;d27(l(3 zTM`V)K~OoPmDwLMD7#@%&N_(y@%Bk)56u44SX(9Ph5~y-Dyhf9iq-Z-P_ScGJP-X z)eZi2#?!Et#q#lM&S+?}OX%H~P3fO}8QAlB6VQ!Zo2IkIPKvz85kW*I z^@}N=Ax0LrDMTP9GK#a9+A1>=<;3L72yZe-o8nD=YUPA%89Ci|_~JBWmjZ+a`W{b)v^xc+bA>hw^(vE1PD%_x2d_Xm z57y^iKe(yZO)$S1;iVKTI~sU&3mny@mAnZ854X=J7Z+g3(k@Q_PA$dprbKduuUx~- z`b~6Q;#CDyLA)=#8+l$FO}baOEMVJ?Y>h<`gl6>|me}HBXSWYFK<`dm;nt@+ zC{OWjJv2{!qiHqj{{@S%rKRf@#!4d(ivXt1Kn~v9;Nl`tgLg}fV|holRzc7G8SSt% zU8FIFH#PD^(+o6frfBpexOWqV?Kj1pgB2!cBT2+{vq(-qcuzgmo&4fz6TWl>qxj;? z4V0>3l$RoN=5}1>L8^%@{PNYo3Zt&_INV{QXuZP-}_Y5GY`mS-~u6)aHfx>FTQcF z9%1?l&Gy+YD+Th+$I_}oz!v)G^+(b{2v>%eq1)$`XJT=Ox4$TJqg<-P0;oIblUbRt zC=c9QRRkffw9YXx%8=I|;xY^-BV1U&_9$xu2p(Zi_ONP-am zH}e4ys;pQPEu*|ybq8g-i*acHH)WW6J(Wcgs1%K1{f$e^t}5D0>@ozfPV=sD?JU>p zINBF|Om;HFFgWB|PB~DnyrEe$>&K%{@ZDZdkSiD-%Ow}@7s*|Q;bh>2z}O6Bv$GX% zup}5qbP}BN34{1#yG*yjDZ~%Dll8q+X#a*~iC?%eoSu}9!pWF+88xuKcd*wvwWNrH zDR?^PEVb;sQLz;HWH%@xzg%^^ny0Ek)mKRFw{H!mDGA5Qy!@%A)xd1T5Y5+XDWR39 zEU&3a|9k0Z189&eez(^Vn{P#nK%_h_NRV3`e|FpNn-!^JJNA?-v0%>?=nBA=5p!TY zpT%%4q+9tiO*&^!{IUnK_6}A$)oh|v9uh-uE{EN5Lq_5^{n~q0HOfwt$pnS1el7`dFh8~FB0Vq7iF~>rPK_|UO zW68_e;gYr0M^}I0y~rt|%YgC>hG-aMI+`fWSn0wQ(5IjhdSVT)(orT2Rs{(+Km-Z8 zB|#qeout4k#1j4{5J6@1`o4Nxu|pa2S*jC@{+pr!2kxz-PzOB-T1WgspMCN2kqBGTSZl($+NA)T8l6t}9 zyziAoH(mPa@um0hRK+$ zxH8F&WexSXqRPW|G^w5g|)yMs^ozyi|Kld{o zE$MWUa2PnBTsRl*=d@q3>Ue(HWcle1eoVu0pl>6|7IE!RQT_}%#zP#<;l>SzFheV1 zG>NVR1tZ>BZLY4Zi^%wAKD4$;`}_w_qVJMuy}hzo2c zv$#my2@z)43BJNYXfE9>{oGh>rq|<{E93eNU*=D(J$Bo>XFKg(y1{X{eb5$(+gz}o zW^eN>X)7JJfAU=OmG{zY&19~ttB>(QOw^u+yfucXZ5jo(DvVhg0=YSH-A&ODe-=v; z(z*m`dis~=nP4>g00yI(+_y%Pahj*|#yfEqqK`;e1nWxlbI}4EMs-+IuQ^P(IlvFK zZzq=rKiF*dj=2?A&Gnf#Zvq3jGi+F0RiHu*R5y~C_kzUFv|ubPoCuYR3X=@| z2{UiMWS-#X)hptH4eLt)$dhL?IZLy^^BcgA5!ui-)9A}T>?q(TJ4NMJ+x%2)VgvMb z!TQ+FXSR|{ORUN4Z`Gi~L&>{q{ORc>sruST0*4k%wCL0iXVAvFKOVYB3qTA z_+O&gIJ4lC*B67a*~CZACZ>PIZB;G6hGH4xo+V#=6*pIY->VGMQ$m_o=?;FKX5h#h zh&Lfv)pFnY3aH*kNvyAQ>R21o7n|xbM(V0lEiGkYV~8!Jd3)VG$04y1O_D467h5h74if8PgRv1VvF)x@Fi(7PG+JwJBWuduX`Zt*YuA(-;hkeBoH2T4n@ zxhc3_9YY?ZjlX2`+1a*-RZj_$o7xUdVY{_eNfj0^gUNUXjN_Ojo9SlNmU_++flvb= zwzdQ}I<;sWujE%jE2rW)d^kK)u^jZT&6Pw*S$nt+kaZt+c0{ZG%PlCa?&m0bg%A3H zr|(sYAN0w~E?FcnGzc$z%n^mX!PHt5*AmT3j7>D|bzi+&x?Vvj98G2tvfp_PrFZuV z^E-{g;2LCA5fVs@T=fp0_R)KrQ$p%v$Qubc<3oU-ue0B}Eo3%xjXSDH46_g<_fs;Af~i?@|1pM)E%!DHh9ma3uDE><}@9VIj~Izh>yp)e5L@0h;!)V!Gv8(ek<& zUzjxP>6E#Qcj$`mb%ODYVco=ptZ~`}n0ChxH&IGm@yl?C+MRrdu9CUO2Ivx@$;r<* zQ~Q}|fYQ{Z;QJE}zni%!pQ&8DA~0_~#-X1ObIV#m(t3N^En3{?xe5L87}F~T;%^ua z64owq<2AFlw8ML2m=w~dAp6Q~gtn7XwekJAe<{3SFuBa!IE2=&FqFTWkD@!gQ)rTP zl|)DG5mTF%?U_Zr63ou>)NF~5K9O~X4wx~Hlr?n8WTfuPTuqaB>E$og%viK#&+4XP zr><6r@)*vv8_ft5>`3EBT~xWT>@2fwhhj#bB=RP6o%&MA5GRL-H(46aMI?Qx=AlNi zG#1222?RD&U^ULmVcnlhYVjko3JMoH`angl%+gg}ic)Jd40N`%1xw#iB{`?Fqh%=871l6|9F5yiH-3U2&&-MN4c8JR%7bLaK+iW!Ihf;XY%^FCxcigtkep znZYd-atI9gnHun-oeopfR|>QMAIPLoO2p58TdI0y6Q(R~u?#lP?9!{0br#ad3F%jg zu_~ErU%qD0B0GbI{$9rJ=BCBiwcWXr=Uq@@x}^*K14f}5%%e<>EwWa7?%1_jsG7qV zz$-Fm*=?tQ)23Sg>F(n16u8Vr4xo$cVz5tB8En$(iL(@DjM&U&+iGEZQV`mg;_1R> zz>6vUV5jloGUyXtT!K8li;JY()Jqng-gMIIe51VEdCtJwT+fR!$nihln85+Puw%-# zyci4pA}(&>6f|e9z-q*phn}bF(>*F7^$`b&R+f9lrj<%3w)lh4;n0V4_{jTum`^H9 zTcBx_$a+?s;y1Df zb=m;CR0h}#c9?%(JM7VpN>U_JcH7LZPS(+oBrUtq{z$v*3j9pF?M9^s*mXCc-DmgR zO0|M5ceP|H++sI>rsV+fE7_y7Zp4!sfH{q0NLeREbT{nEKwh~*uJr!B!s#J4xL=wc zWf?j?#J;V?lr3q*hVd3_v9Kw>vueHOkaWy8H{p`|XKB|_xyH?1kI1eQAPHf8-O#J{ z1!5^L(m#ZYkXbvufgy*q$Pt4Hk%E(1qBN~utw~n+`aKVNW~VGU;+d@*Nx97S&%Bg* zlr`4(M`qhz+tX5ddT8QrO(R-6ieVms)V4y_O?p#;uVmfght(Xx4c6)q{m!T9fu$wO zo;rR^nWipi6v{LzG<}0t4m*`DbpQC{$r`*6`#ik=vBOIX_2==u=lGW1;`;s=z`j@Z z%n|qFi1Hha-ycWF?aF5!xHk`c@5Wp51mIo+KFk^2Kb}T3Pdc7Sk|fE!t%X@>^2b-K zlLyqSGg9x5tc22MZBI+L?_F@yIUVkHP08xUhcK~A4c7RB$Q(XA{Lk*AaZ381-BHv1 zA-R!npUZYHlxcfv%7ByZC)pa`x8~j2${}3#I5|l*!$~ao4D_f-$}A~*W~1$b(H(rw zp6jMeU~aZ1*c7%CGx(fV*!K%g{oRn>JUuJs*;0p21s2XsQE$F4`rJG^fs(oPnd-yUOHzJJA+{Ir9A(CG4#A%q+N0Fb}jmwV<>~{=#&Wun1@}Ka`q5IIFNBr z+Vn-pnWD1UT!so`*_FWv37SMm+z+GTpl@@cbWfa0M5CJ*v6(r19A~q;4~P2(hld;> zGnd2Vjq5T58z*z^Jp_&B96IS3Hha9Y=`-$ePef)z#%Mu*lYpZrv% zoZSW3{c;!KCu;&3$6E^O*h zTt!XNf+SNQ9zaGqk;1ZKnRS`CiE?8Wr-E`B)xls!ZV1aF+NcHS$xt%#dJs(iB>%}k zwev-B%=FKanOC|)a#Wr~+!`4fA}3l+asPn{*4OCK);i3RKgYGVOY+Mma}8 zCFeGbm#G8uVC9C(%9M=qLS`A&YQ@z6r)-^~=vfMF&EK|g@Ep1k_3&7%I)#19hQRs|J`)E;^! z8hptXblOm3F$=a~|J?0Q-M~qS7J`Z68w2xPZryThFu^-C=T5y7zWo=bPbEX!J=4t7x%aP^9fq16Do`O z+TNkUhe5j--(beMeZT7saVz~dInkQ+MqN}+Jr6;+-EJ@#xx+iOZz;$4{@zae@U-nT zoko3pJH|LGUBF7XV=R9)9*@?Smv3%v>SS2dgYa@WRi$c8Oq9t(u<$4A$GZi77%p>4 zJb&2jPkNsGH4KJ`3a$e%OP;-cnGevsv9`Jj|E|7y(_F#d%{Q+b^qju0t^KLle7)Lg zwVErd@V?b(HJg7Djrp4_|C!*Cf)IbYbBDu0QMsXi{S^2-@dra4GYhANTU>cA@;Gs+ zSSs~_d4gOkDmztUZoTsc?ojNyH(n%~zx?tGPO6o9(R3mpC8kt%K2gp5IaPK-QTqVj zS{yGLE>FgO-yh%6UUx6(P6le7TF>rr9_}0+|8@J_e%twYeC+HU?(Cm|LP}+&%PqDL z@1_tApj8RKV-DrRT_bY_w=OU>!mua%OJ`K$9*Q;}@JHb$o+W8%f>a{1f&qMdh9YiLo1}KN@kx>|oy)LKHgjQk5 zQ6T}HdSZKbe*sN}3=#{{gphUPh#^K9GcnJ9+n%eCM}!5~I9D!3Kt^V}2>Sit26<=T zVT|)gAiv29mZqfDXgqouM>Vy)i$jp)*8IAGDodFWCe_y0&EYVv(_8xQ(eJ*|L1Rxf0B_~Dt{=->oeDPYbOrL?S6v7kN7z`y^kw`Jhz!Ke1g zUryuj1L`;OK;w1=#6~q;Wp8Ikm4>faa1BdAd!mqWg@ehrI-S49tn4hLd|w@B_rM5- zKtC9jpPP+`Y69P#?tOq}$^g`*6(Exohn@Dm%0Y3WsgiiA36v(|yMrB=$-1xVH)oR-Wy@r}!jx!KBgC6ek!gswY0UVb^zSVh`kyJ9Nbv&;TtLSoc;g>D~Vq zME$xyse8Q%Mc3aR_CoJQ>`w+!&jtBtuiJ;$X3hEoSWvO~w6s9c!KT_!rFYj7!uPE6 z{%6pkyX~FdIvnB^#c#?s&M7prQTz}#vHUdkx0e34qQ9-`Z?E;YHT~_4{`NC=!7dRN zbO<83bHs>8a#^3PR5Q0B!~z}s<1RXv(auM-@xG2hzi0XJknn8pHqafW!p`9^V8Qpel4jAMoO?+_*BW7{%@b(8^eL z(H^G;5!#KXOS)`Z1A#a1~`l~_Cp_*89X>{ zL8y5Car-M6lCO@BY3lfSgrbT49HMk(6cn(aibfd95BgZ|!eW-h zn+XidB>-qIAcTYUJRi#No^FkbtF9o*a>6owmP|?ZuKi)}(7}VV(_;{3YJf~T7A84I zSmQY81W(RW3&8f_ZWbKzHF9k~h`7@u9JBymK%l>162&bkSVn_&3w#i~`(kM+0hve3 zM2t3X-F{#Egz4$SF>bE?#L$F@?gr;UKT@*cJrwnB-N6Vcm*V7@iljw>FTrpcu1iQ3 z&5)+&CLYa3ASSO!*tuP>$+m>TM13;*z{Zm_Mqlz9PtyMD*Zh)1MgDz!a`fS3`@lIm z#s$YIy;2nwo4%;mm*M}0*_f~$k!N2>YPKWv>+&%xKuw^tSv;pOYws2ADr52hSU|D1 z2JWV*g|KQ;#)Ez%@56CShX^JyzB&xX-g@OEI7i)Z0&nlCbs_c`@WAb*w|`xXD98Z< zm8c8AB=SKNa{`~9M{MR+#R=|NhiIc1eM>1T!D06%5eZ0nu1<6EyebY*tf2QlPDCm3 zBfOv$VK72gmNXVVPp5#U0d|u%SO6qp0s;^7_cCus10bar60TL@_E0N9T~}*Z28*z~ zaNv(QDMVjR*kGBYh}^RwO~JwLQK+HrC_E3LSu`2-u#2_iSqRHzoWx|Sfeai6D9fn> zVfPA9L-89RIbA>x79%i^LBrDcM5seG`KUuUFy!C05NEB^^d(V`M&KYoWGJ?ls2~Ob zO1(c<1?Yz!vXY);k>p3!qyWQY%n~dZnhM*;OoU?w8P~4qOFce~t~3u^5skcV?01Px zCc?u@S>zA7Jy}hK!6)k#>_M`2BIId23`08rjGv#zq-T=R=8rg@sPaG{uLIEW0$BQr zxq@sAut5~D1oVf7RfLa-j(BMOR z?J5XHkrY)L#h&N(Svbhs>6)3iKR}1=C`DEWJ@(eu+2^4~?7?_@Xr-ahWRe4-ZK7<4 z96JL(yCeHp8HD;$Jhe+AZ4bVpzLj<@(3>Ff7_q|>Xh*O${V|Uh)fDf5y?oA30yFL$ zBqezmV_z@i(9o>I5giIGALZQ=a^a28ni``mnP4KRp=pMzX{2U983qKLd+gJszX`(6 zbnGe>(I$(pE#pb|Mha%!O~bl_a}3JsIb*XB-~p3xOBXU6#!T??fPv!5;>u?$^G@nO zM9c;581}fBB^m{Xx7~>~a@E*dhxVlp6|0i!%V}Yr&KLtNeY_l)*nm;0^Q`U#wR8O)ser-YGbksTQXLh7Xa+7HJQkT|*G1oXAz z4`Z+QWJ@n8ay1xSu@@vqbH(tXizL!(`L7%p@4Tunxx^5}ObkKEON4i7d z53fO1_Ap)*=-mmXoDP5$#&OyKf<(`prUYR4XiDF@iY$O3wQhfI{QKYV&-ulsu9xt- zOElc)JDUFor1*+LTA_TLtS$Ii>bd?>*!@$}&H7(4> zH#8YOf>AU;Mg1Z}kQcn(0z(0B@X8f2sZ~&2Jq6(HTljYzjA0T<@&T@O>D-l-J3VxqNTuhSX6bzRI=iqZ5@{JTQs7@)=XO57pS!I z+Rjw`aUaksV`M%Zo&06{;cL4 z(F+@@>8)YD6A%-M^&53icZC!L?#uEh*KKsBj>%L_CTgN$k$r2F?X53ykt;#TBWwZE zN-$m#Nxs30lX=@$<{5e6$;-DsX8UeG)6akP28_I@5Y6ldIK}^Ob*0ftpZ~6{u05as zKE-Ewxtwcv$q(&u((ZH-_n5xrSmOb=79YMp$%`WLh@A4ew=vPw`_T7#pwGT{Kfu&6 z_HMhgy|=Hg{qH)Q&-v7Hm|a*j-uifv-WGXboIXFy2YXv##;R&nnZ(Lj1a;dD1GTMr z%t?O8pp|?mecQY| z*%4c%0Xy6KfD3}JZO_nv@ngG0YuhIuP7__o0b2@?73DH`PKCa6ba1e(Y>(R1;_dzR zL8V>g;_ayvKiS^voK`wizB9F>)W>ZGzC8_<%I`IUx?JYhqrF2jzftY?>L!t=410Xq z0~?odAkZ@1uy{hZe$jAKOGT0yw%4JQMK&fX(+Bq(fW zf>XkARkO{Yi6nIcPFWq9D+epHxZCTc%R_}iinZTY&>pLae@@)Ke*sG%hkp;<@G`0j z{rUSsY>2XX{kyXz=K1_xo$W#Ie*BTF!8t#FU-&X_)eI#3t3!X`Zs464Z9EL5%FAI; z{afoFGlKhjCWOwsAEmSD973Dm32xbh(UkEqdXvH6E(h0#$B8(BFO^02f%FiZ5ckel zbV2fxsaLG`77%;)lp#SxHy?mb;(${;^D2daNT;$+83^~4wn&rvLbxXi2}+ig z@|~2FPg8Ppo?gr>)lDq^zA&E^mcl`D07lp@!2lTu55W&KM^rL#>%Kvbng6YqUf;!M z`ubnyiwV6h9ktA{5isTc=gL}REq(sC(t3{n@g$$(C}^NqkKIXMY}duR5RceyC@dO# z@Sovge-QN08=D=X@kp+xwhQP%=!s}To*MEl4puC48b(Jw)(}tWjRW?tzTc%zDJVE} z+VKf2wNIx+KPgkgbS)8U;8*vU8<&=2I__Pf*0$@Wf% zt}^+zbg+8*e!aQ!`scMqLo6lYIKrrpFj|!I_K0t(ycECfh@Zu2XFr1q?t=Iib~ICa z6Ye=)x$BN)VZ&oNvk$Vrcd*wvRWU1^&fY;=Td=1TxdPQtC0Xy_^fws^B>uhGTxoLb zio`JLV0noa^mv-cSt9J^RZ4XqV{V1Iw`k6#OYqvmNfzXmi*9|%tR7z$7TC;SQLV`9 zMB~Z1_)-wQJ_mo432whTAsffVS$s(c?{t4i-Xo%&d|+YeC8yPc4k>0bRGm)v>5>)R z6Tr(|$(t0&j^|vISc31P^1+HQg|&ELq$=`g^{qNzz%H@vlG z3$VRuuD$SuF^4vFXzQ94F$+r+SJ3d(zK-ly!l|q%9l-?F0?;>58|Fy8P1xN(Fi`4= zdC3Fjv+)L$QFmr3C=n9GY#9Zd-*a^O5qT?Js3tv`RW!L8ZIA_vdPqo>klpmz?SRul1e^zchzsaPnUbS_G8O742@~EatK?U zmpf&;lSGRaBK$dt#AG{eD5&MjAoRyq1GJvQ$#7}x54`nkBF1NRn5zzr{F&3V z-wc{hP74g_ZG|dhtRsc@*qn?gn!)+R?~j-8axo_2gJsha1+n0ZlQn)?Q(0r{b(Nw` zUMfG^?HE@q`J%EE92JytwAzDm=kTP8_c&E5g$mvv{g)R8)dh2a6k(>S=CVq6qXhJ< za-BhKrV|FllUF7UC{mA=vicFKRx8zH==Lm)jGQnug)JjWPK*W)WH%>>rbbA{sYzZ= zuP2jvBr~;hhb5S_7T%az(U<^I?G>oIBsjd0o`6V!U;1>n5zPLsi#OW&9<&a!v(j2Z zu1v#0ZXI7uBCEoK`tjXw9T0@?VkZExY?4~ns!e3yN-0+Li78Z8xn^rlvs~22o*+fT zF>|D-Z=^c1j0w}rWK5#+F1#MNeH)A7E)fh*-~a6O@9>@n#^>3UOxa1M0wGu&w}7vX zyL7KBEz7Q8g-Dx62)}M;L@bx(L#rjZkw4T^={zG@O2$}*AMh+divj=u95Hb31V#RFyWI(B=R1^F!4Nox zZ@K3p)KP)4@Zw^PVBu{>+NID90umHQPs)nxNy-OB!Z#lft1Y?5Z)ugoE)5ss4 zq#&VMi6Oy{46Jk~Oe=0pn-yOROiJpjOf{3RBNKZvFXb@TL}#(O@I|>zz>|7h!(xqs z#Y2fVvKXkuB*_G>b0WpS7FF^l14XOK)fsv&Q^0B8jFRR^h+CCLRZdAetZ@lg5~&2N z6zR|w8N&)8f>pto>Gk!ic?31fM)9}X|1WX=gGU259{zO(ld(6uE9kWRAI-JQ`On&$ zH_zukPw}yzgY13y*!k4Pzs|u~r~P}GlaS&%-#i|C5jW%cNBmsS^ZbzTlp1KIY+(3% z+z8WQw`RQ&R_YK;UT#VqL=4;zgyJ|Xq}Nt{Z0d5{@U6N2`J+D5<$v#P=ng}UK;kN@0A%m3!ebNuHg`Cy#TdtZ;WNXh0BWzX2Tnsh&7esVvO{sF&wu-dp2r@r^u z2ymIbV2kzFNYwr;K6t~S8wPlpbL`&xqOEMUoOeN5vZ~K4$v5spV7sHj?q3hL5B7GP zcYB>vYXIu}a+Y{!g?D(<@2sKCUMyJCRAn=PQ&D zVWeba5Q@&pJ|)Q%(RzK1ap_bM8IBItf0dQ`FQe6JUF>Wh;%Zcdr&YCZuK^b+=&`cI zwdFhBq}E=4@zvBshF7@(oCwLYDA90I$*ghDf0Ry=DOZ8!Lc|JltCB53>o0gSswTrA zS+aVvU$;BJ7(M*`#_z$>co~l&)bf9EdCT;)r^q*Q-5et_RwVG*8VIi*L>_DQlE8vvjqhuD<^sQ)5-R6d^*HXtJTadOC0`4&LlxGiL@_E z+5;gy?TB{rSRzS&igIHlspWv*GQK88wH^CjWHOEv8+i2x-K9M7MKCiv=XVq{C#snb z`a$<|gdH&I#=M6Bw$!NL4@?3~4E{w|Q8jNc&?QLQ;2I+>ayTTMJfU|9yh!q}A6&u= zb0eH4tyQr-xg?3Jx0<4>;0Cu+Ff3=}VHVrIVYpwp@G7K(1m1=Q(B0s2=>H2ZdZkIg zj7k(3z{sa)kSgwC6iljtu{6Egk;FJvY!PIA4LbT$zt3?|`KTSLfzZHC5!Dy#_K8df z2<(_`GCMs{bWO2*;$573PST#cNMKXlgASvUY*8^D__s31)q>_O95RYcy)JG-cQm4{ zO{7jDS^*4j5Z8d=;>~f|K=YZ5K84ZsFP15QJ4gH~APhOrlW(y^K0zd!P7dJ(3@s&r z?3kJ%jP~FDv7zT<+(aI*P3ry@o_8$LWejRzahX8yFr zHENLeyNo)s!Sk z#+O4C_treO#-o`EqimR0Nqa0K1;HT2_?R|xweoV2Xp%bWl2j3k`f8Ofmg;gZNVkq3 z#QW9Tg!t9ccX9NOjckoquSS-qOG}JMy4kOIHU`Q=k;16@)hH^>Zoozs_*#PdNLg$4 zqkjvy&xm028xA!ddOi$C#_;aLX4IRl#aY=bN!~9h@@veL%a&mFNR6NbLS@p62Kp4S z2}6D!#w6YYegGh;Xm{52*ftwDF&O@ zIcyS3nFuB$Jh)TsyKKm*n%sTLF5qUDDLm9@+AcM#Vp+}WPBm4MqWNEYm~VQMomm_# zTIX~DWAfRSK|BXR=&5Q0&&9K2jLzy0FM=GiJiWe-e=A-jrlQsz)wC1uNK{y~>1C)K z61AK&!Rc@~3^Vyt%M*EUsBge0N|`v(8;e&^xzBYSPb4+;O0}*!S4m}=wo^nVp7BD) z0N|PR7ZO|@C4QBxT zqexu?PH&)Tpp{z{gd=<7RqqKETmjA2%HX{zZpBtIfP(#YZK_weluX={&(`{yj~IVA z;ue0JMh6@{IeVrR#qFKyMqb3fy~EDQ-r?!qj`L~f*P>>+&*>4fe-(b z8)LfTk6xb$)uBH)>r3LKYfm!OQ-Pe(sdUI00ztnA1Ajc$J2=x?AqTqZM#<9b9bCFN zv52m-@Z-cdvdFE4-J-bT-^f|tmiPnxHErl0@1m`$n6E0X!5z)ki4 zd7X~`++1ru$A5d0kM($QyK{6vcW}-QJ0)Cy@{4~jUO#Cbrp%{!uDE=9a4aJC0uM!G z7#dz^Qra}T15lGrrCWb|2cYTRKWVy6cl^ocg>TL2&mY@oy8KrcqT(0>v$iqK{|7{W z#{cI{<5~Vc#RtP|>{JV5fP%dH7=V!KiI4tph{v(`uzqhpoJS6LFLQdUbvU1vCYgEj zklgaOgyG2~PA8Zd+>6%ZNAcc~$~oJWTP{mW!e##wm62TUobzo8U0#Da_r^D#H>A{w z=rTadVmg3lZ0bo=Kt-^xoFG2pD$#R>7?Fu18% zJ4mP58dU@&@7bvvTL!e(b#at-^H8bRdqLdkyJYW_&w)zaNgvzI(5;$8Cxs`)vQSqr z6XTd?OLJ1ILtV zi3gZcmc}d^aneu?0h6Yyme6*C{-pRnF-L@CVEmRUXOxlNIQm<>xgD3$8Pz02<5iq) zP4!2jkPdIBrncUGvrm1z2$n%r6~$OaF1)D7j@{N&7w@VPC*++8`gc_Bz^J^f)?h3U z70P@&RyULI6bTmKH!`Kfw3H`wT`u&xC`DwRG9!t5A`c3OVmeWIP(E@V6nxffiuc|* z$!fq1Wq|d9y{IH5el=V7B1~m9G8U}HB7leJ_)+L>i7c-|Nyd>#kZJ=Rk zfU+Kg#6w9cVdKSdyo!v+4Zj9gLvi5tp#Pt1nBO?t6isT+qm{;LtYYC7 zDA5gztQ%u$>ko2YAC@5?hHhYV>SB*`WXpilHJJ*W?wTpa-^zl)tiH_0>C0+-A&vzZ zOAky%jyaTvIn-Ce`TS0#1!mn&mZnLT9h6#ln><}I9oFjXpnU>t%t;bxrNQz28qHrC z&2+r)DWzu&_>F$EzFH7v-r8b06-3|8DPd!R#B+U@~PYJI<(Q5t%Y${xNTZ^P5QV_@I%+Y#McRt>iR)n#b9V+h{HH}Y1-ZkhEjee zyQLV&xRJb|&nmU7t9bRxy7+BpEyW(3^)_)QUi;*l9dmg4ZpbN@MZo~DA^r;!pK}dn zOr`oYB@##!wYaI=HPz9gCHSwb&Glq4)BD2CFch6h2ZXRkOi`EX^`SMLV1CUfLuw>8 zG&{(KNPL*C2qme&uB4AohIBj#jjC9*k|=RPrpc88vLq^c%Ej?~#Gge|tP3+MD1UN@ z4Z_>|iEsA5m_#UyUuY^=L|(^APm_XrA)F<5<`@@mU)vcZGkFL?5N@QJ(bl^vfPuXw z%F>p%j-X^N?EgGrQH_Q^W}INz@*r7Dosf(fK2!#>&$H((>UpGg<##k~b%ak?1EU|o( zylr}18iXNvl_rIW!)6kN*oh%-J-=-uO5(!(8^weB8Cs?2hSV%t>1OU}y&JBuhbGPxyxrUTw>BC6?)!&V75=HFZsC4y60GK!?B<*W!tgz1wYa!H1)P} zhfdV#hqr7jrGnj*+GhFIXI;;q>}UGrnXMPrXoz!LA*65H_U*Ug4F@nE@f;^S4}2RI&%&xYxIsKfzr*#r>F ziwm$iPdfKBfBEGNK0Wop)&(>^gzo6d??$vmIYDoq(>ox`094f8unYQ#U>xIKDPO0C z<=6!Kfw;)r7;2zoG<|p3cjIWo#yF|J}VtfLOd5iD;QVw=XU~( zq2ZX$YkB2&;o%LSMO<5A!gG0N8;R|n2iG2<6iU@Q26_v;N$iHSxrQgc!3ghc02T;@ z>YfMVEB=rm;YqGp>aV_ye(@kD27jo~Aj=hj3p}Tz+5?<2}wx-FAS+0v4VIAw@csV@1R@jjAv%$;!#v zJZ$+?%fowhrPWO1n?ftms@WF{zG<9NC?~p;#wyJzc_=qqE30XgooM8S-NdPne1=F6 zmgcMDqfhAUnkYRAZoF`0FYk=_MdI1jXmXo*G;%G~5B82v+wZD26tYc4E59@zax@)( z<>$2w@@{{0<=Xq|yKAe}>?3R81848|pVzACXWIzDQh0m+_~UjOlR?i~nqQ<52N(yt z_VTyT%?#%JFbDVFGsVy03ljgnyh##<1xyDdG+9zPwm$7JONSt^SjJ*9BK1lUe|L`0 zr1zHEF;`!{wK@Cznej7y{TG4t=k*-QT<#4pDb%c40H>_~R@Pw6mt6m?yly@F|31kF zop^FbIOC&N{v+Mo472&2H*kky*S*1bSFn=&W#OT2N0htlfTcgkfIYCHd-bYuD|=2C zRHdH@NJY;b`$Rkib%O8iq@UqW7z!Dt#49C!6;ifO(xRgwCowth#i#u2u-Xdk> zaP&6#IkMOo7n91ZS-q!)Edn#DYgUJ~sTbh^pjuy?vj-u1E-6pu3vQV>w2zMJ1TE!> zoA7AHfsUI1T(5ms?NXZw4q^{2bQh%*J-EC>MuNp2Z7s8BGlF!7pGhfi4|}0^2O~ak zqbu*428|-_liMi{1*~l~Dj(%i42Q-;*Jj#=m|R|Zk@SkjNO5jI3V`RZ|99dq|Ao60 z?LI6y!i} zzQ^+HD4sxgj&#zgxcy5PgNmRtv^T85cmZx*5cPQfJX;A2DFqSp;^YBWU?ak&BIxJ( zI=YQkH&iY1`@IN)N`C!r(1&4*s~BxEXpEA_unB)%kig0})SGH1$77;f2WR`+9T{~# zwVux}SD1)2lN~A{ywavM&MiBC`RhvE_Se~J5Ff#cnFJyHXaqjb(g+JA4F8T)Uo z`JDgxNj}!yKbX($-*?)_$bhHL>Dlq|(Fxz?wC@HMl&9T1m7iA>+~@@>gm%d6S9<5R zLo-)QlDFNU)m3rqUW2OnE%=u=gcb4UddcM0xbvLIZJn}O5loqrjR#F^O*(Nw`I`|~ z8Jj1f9a*qC$gGq`B{@Oq>82Pxx@ zcTWB)Pvtq0-dFj2XS=iWv7++D_14$V-5y7FdKt$!i*xUBrIU8&W} z`l_*_YNV6CE-ZXX5G~zb^njx)f9z#Jeu&x5ei7sFF4a+Bgzl9n-^cM)7~E{+RGrqZ zuLV8PELyTF{zV0SW~!R4Y5T9yc#i+_B%i6-dw>z!+q*L+fU;Hk zHnCs|(m%z_oEz$;RFD@-y`Rl`f4n#_b~Q8b20?gdKIwX4I1ILk&LbwL)1?cXHU0a) z0)LnsN)g9dJ7z{X6;%_7ks6t;c*U+?-hdH`7pbpIMC5%}s-c`CKZ3^CZ)-g878V9) zPU2aK-;>)5ey#D|4O=IRwfM?89)pg182X*=^^4&SI78E($li6e^{m zL<9rVSNMC?IrlCB8EVeEtzcaEMlA`lhA`-HLuW__%LTyv@D?A@gZQG-A_IdqjBvEl zud|^7a%zp1tSgJPw?Ay}9jdZlljOo-G>MfU)#9R9UgY4yqj9*nth>Ix{>k;n?}P9Z z7`E>n(Q2upEAJh?-#gsvwAJOM_4OUh07@YcJXK7+j63sn!JOc!ES2xKCpM% zm+-wN-ir$&Y&w?Q7xR&fItR}fI)K&5!x&1*j#PhhR`-`S#Zx(HQ>s25I# z@P;BQf88iGRaj|@7dtN`{f+KQ_Nk~hqid1Kt?5q20glpU7QZc^OC^zhCR+w`%n(e? zl%w&|7Ik4`!8T4bef1QIXVCYHF>_XytuzNnywP23U0#eS!5FYAfgk=j1);)>xGpZ7 z3Vt!>ri`E)Gf8URLX9}tkG_UQ4*;ga>~yc`QGOUIV(8tZy0-a#i@FrcFK8KWLZxN! zOKcD%U4|z>jbKdVN;M$@Lv*dmioj7l^e_sFXHdl$-jH*&TBAx%3o1F6mGrGmyHcO& z_J49gIZqo?;(x6**V6mH&6Sn4XZ!ytJ_!fzZ0xUA{kx9wrRHV4TOco-w3@9oKJ8M= z=lmk<#Li2RWffCj-Mx>wpSLZgF@Kgmf&9_7a}i%ot%*&#oT|bG;Rn7M(D4M<`)y~H zRvEwTtQiIC^?Ir>c@Lu_xNe@c7US~?H+9u@x|6+~4&Ez$zxM%mtfgg9lbd98m<+>o zq#PV-IJ5|a5+0xpN?zMyfWZmQ`2d`Ek`Q0sXv1@Bbp;8lk|oHV4(xj#w`Gznag~>h zT3p(h51D3WuV~YnvfgWAs6b{E%1ds`pH0W*46j7m2&M^+146D+s6NMM_aU^KDHn7goS!Z_} zF^zk3s$w=!ggeDh_(M&ROdoLrEM~YDINC2%WFs9=3dYaHFF1H)*(dQ=cOi_h7}DQ_ z25mCqvJn?hN19w(ovFjl+V!}D4I}Qs6?Y08Qhj8he>35Icen4MVc1Xy5Q3p zd0wHsdnoOLm*8w75Q5)uS@4<(IXz)!zM( zXo!B7X(gv%P7~1eQ}kF$H>IDKZL*+(rRk5yj+@{Ueo&^dyponyu12@fxcAG?Ms4+| zOiTG?vu*91Z2#5h5B)6BMou{!w;v>hCH*eNTDdoch~_TEh8|Q5-Rzkln|a$!`AxFz6oGwzf?Q6 zVis0ch)9AM+?;w-W&%vDq7jHOIQewi*-Z+5{isBn1!Z%rrEG(#=Vh&=S(=u&Xj9r- zKPzQ36GzJtz- zrX^uKE@gQXmd~~eWvOUp3Z!0?XnSf6ORtf1dD1QOu1x<+RI&(y<723ooQLtVGLyfc zaCX}B43ff-t+oX1bKaMonk6dcNC&R@Y0r)dJf95(YlWPqclQqea(3`(`=kwgvk7YPiqikAIS0vha;Jfz;mT;10}` z{q^*^^%w^I{RiiR-KNak|2Osrqr1U5M*PEVOO?1$e~kQy6 z(luqpAJqFwQ~WQ0r(bZ>6fCY-kcba0@wapayWH=UU-N5}0$Se~A=56R;=lN&H-2;hT88`CB)(T+iLe?}~wkSJwP!K$~z8CQsl^ z;3!VPkt7#J){~#NTY?jBCkkMQHPK@4zorJlq)$Vt76NH9kcNRZg@0H6=|so>h2*)Q zqm*ETR~_}6>@K9scsGiXEc7Rg0m42&l;KOY&dxM^#Evs9RDc#TAJ*>4It;n&+Rmed|Nd=a2qOKmSJ| zgAtOvo-=a&a1JMc;`9I2M(cGmo&ReEianqIKfwn@WAaMW=@?YE*y)3oysIT|?WfX! zy-dV{Lw5n`s#@am6sJHcxILx)2?*jG*Qe%jg{|h@rH^a${qtxU`aluL=1SI+no#Qk z|MDUB3;iy7Aux;39oQt41B$M$MIL6*h}+N3&GA4TB>#FK@83tF^;%_EStUE>eZUSJ zbfA2LZUmy!M8mPuqJg5oZ#V>mL5=kw`2$p{GJ;(<81^bv<1joGLKLV^W6KxUt++G@ zmlJOQwqOr6jXUYb4hJ&mf2xB{1hx#GYzN}fqhZ~7^-8>(_Q8k#5rKRj(s;ywiX#VzKD97ZaURdZ^9;- z7pFjh!q7cBp|$yu;l9;L`}7oa^zruINq*2ZTS4Pk*X>^h(ATTMR`#&hNI0_`63LzJ zwf!EES=5gl;(<~n@v@!0AUb>|(%mGlkMm)ra^RPT@RiXdx~gU$%iCV-tFN1_s=oPR zapKLSHfYwQ3umXbCEa;b?6t9Ao1j^L;E4SqnX}zKXi(sl)|$cD!jf9SXul>Xg~(oX z3XtWG_c+1YJmcuWDa|r^f9Ta%3`qkC>YGfkgv<&P@^i+ zyih*gX=MDtXhX{^?QI}zE_@$$c0}dZgDQytzR*nG)2M!oyh%_~*6+F)d4^o#C&PbE zK*>{lt&7qhvc0SsRKW6>^~1)S6`CF(Lt$^mjc={5gF)nSFqH&q@#9h; z4HPUe<=YuyCeVzNxhK%nkLSQL4N|_H4P*jIl30!bm*1uy&w*+huzZ^VEFoLCnQkhH zq5|o0$5aKGf#a+N^0O}cSHUEyvM8n)`0{nOcI+UhfSHDx6`vH-n5@xwhwk(JK1(zTUIA&Owx0GU1ncN(Njvgt(P$g zjeKcJkaMSM;;t?`UERnQlC5JYgw^TfR6w#8MmYGwzOC^!F{E+}!=r++w8|=l*0WN0 zRtnEbVVcC13CU`uE&iunIH-JSf3U?vQX9>t6jJ)=o2Z2RRR-f#YW)!FgB2{4TqMvr z(Zi{Qm08ycaT3O7HS(-Rp4G_1t}U`+`}w)~TijdTCel3>#>{VK*7 zcff>jP8sdsd7pcSN#Xn6AQI=Ei{~uhr#s*Rl)*y z)eQ{Czp=nKsqpWy^;%MVD=B%Wi-MD8Y=j)cV6#(`?%A<@k z8r5n-{U@*7%xpY#= zpN7hpQQ}f>Fp4kj8nHsA-*f)fffD{hKhxuXoclvJymKPY4ZBx!r2v_d|6_HfwU*BR z@#gh&{^uw8B=Ub?_By)2p2`GL7x&BpLeVQ`joKl~=K+C&3z?oYfB9tbcxOIaW>q3sA@6L+FmK{BA@&nPBq9)4K@tYE%<@!*2bVTkgXx86tnLY@!3S>>X~O z{M9+dj1nI)e3{d1wbmL9=c5y+6e=o&$vCX}nf)<_Dsiu;y3H-%3ZAM@gkz{4aHlL*zmwY?7LQx9YN&f zsoPY5S8o4;i<;dZ_`P0VEz)kTP*GK|=`9SNsm=zmDj-A8w?tE&+;LraLD=Z?Jj$Wh zyCyujNR1%q<3Wr+xF{=cGEI$Ke+Ua;D#XZn%DlY@w6nn2;DZsM6312zf zP3P>2F``xLd@2J(qCo#t?;+zKe=4R`!GEH-|0dJ)Ni5a-XqkB?EFZc&_Owm4@~tPY zF*{1@PzsBhIFFdyE=z4*d`YpmUuq0_<|~mXiQ!{>eagxE@}>Ae$$bAl0_(B*Z7q?I zRre)~!E{#g7_&@L=qsHlrnbOTV~Hcfg59@oeX8=u`Ak3mQz=-C0M0YEQGEW_dcD?K z&BXs-X+59+J;f(+E|NU;!;`>P{hlX(cx2N}$QWe*gg<6q=} z!V-lq(Ml+IosT5G9R_(kLUkv%&T`)!ocCNu9`osrB$6N<9yy)%!SVifr;Uk;I(ysu z&gpS`2mamrKieJ3v4^I-{b($nVK{aUW*3TiLuVK&cRUt9ODQmXNmvhOLfhg%Ekl=^ zQ{5Q{JmJK;fb#3>6sz2UC7;zzs~E;+ht0K@TM8Nmc2K~6ad0CSDsZ0HFkHmrCenrh_A_g{w*zaJSDn9UC1W-!=h zXR8b}DG#Qi#0l9#? z^y&YXk!oao6-3_5h;DWk=j(KWggH_kozeUE9GxQ2IAXLqp$_DfEb=~AJ-t6ZF&Z;q zza@{uttyMbJ>YTi<5d$GEyF!Bo`oJ--1eo4av@+CE)p|8qN zOb^%N(JOA^(WsT~bWAIi8+L)S=H%?I((O6R3d})j%k!%4l^cr6OMf_o=XYL2r$p7i zt^8xdUSt@^60K~B0Nrfk63u@kMpYB=H*;Y5qRo}pAEo>ab@3cU%R1(_!~iEck$E8z z)6eA)3BCyTwFI(i($9mhmh4Z9vf`mRFjgG?vuJL{rMU`BTsCcMCPJJOZWcq=vZQ&C!O+j9P}v-! z(KysY^aukq4=pUC6RWViHDRfdiOE?~ndwEF)@KrPwnTC6dtp;e|7<^bJgJ5|8ujl| zhAh73x?hV#j{cs|LLfk-6v(bSJLmm$w;xr~mZsT*alHbZ!}OVUXO@oB8P;3{ zK#zKw z;IP!<8|HAiDO`k5Jf(|D*=O~X8dE2Bavamp9%lhsDMotQ6n~&a<_u@8*)5y0r;`?f zTF#`*m1+8fY>r7Y!>MiVic)W5<*g`n0p!c{sY0>xNz^UFp_U_uhg3Uujcr;!FSTyU z??^GzW)xEy>*t|PBxV`q^sas07%yhVIIrf6GU!pp*F5gXj_yk}YI$9l&E_Z}nza9z z4mLI2=SwW0LwfqiB;`)Fk?XQPx*J~wL!0aR6gSkT^#3j4|K0P3WB9YfM(Z?}Ee*?Yg&=J0hts*o|Z zmryn74=Z6VgWfoYg|7DcEq1BK$be3eDeDK(#Z508R)!>g+H-b6ZDt@PSZ!!E5;Mq* z%z<2?U~czs+`9+^C-vArE6(qUE?E?TC{7W^Ny)~(bjb?6Xwt{08eCjdA`2vmgm>)? z(I+RaE@LNgR3TKxd~QZ+v{R4KYu}DIN!TQEFDU{OVbsBIz?T4)Ql*W(OXOKvo}7EY zv?CWICW`Yr4T&14vu7ITWdrox2-xZ7>J9*QUGzLV_sB&piv08bo#?wE!j;rOM>aRo z0O^t)PMhInx>0E<#QyGahdLND30J>f%+Emlh$>@M4ysGT(8Ek_o}vKEuz@Tr;aTjP zjuGT{mrZHLK4unUhb$-m591&M%*vP2_R%l+s}86cf4&HvLy3xP=qNW7R}&~0`Io~= z0+grA#~yp+C2ie-;f`%v(F1HzzDJJa49_o702IbmX-T zP>a%=#pxfFmXYD_L7oRgkiF-gRVlIDQk9kHib+?gS}-+m)*-i4&}5^kRVJ;g?p3Z; zlw^w3Z1XSu_rHx`yD(XrD~$$qpS}Qje%pEVO1!Bz#QEgXbTH*k>Cp3uIL;j{N!5YC z0>b<;ePQPG{odhrn_p&+N{)d1o;y%infH2I3n~YwRv6m6*%Yz)vT0CgGcLQ=lj}&i zDY(}YTk7wEk(QO41v#LW*IJToR*bhnq#`x|h?mf$s7febG&IR=K_oU2sk+oa8?wOH zysqzko38KWc71EBV!ZXET0y6CS_QqRi-19~wUv0FXoFn5k*1#?#S|k(VrGNysb#aY zKy8cZY^dmz3H_~?QGeJ^iS>Wv!1Ivp$8)|MI$Il4*8gu>t=H-M->a)D&+GrE_)NL~ zy;>J%xCE!@wtiQxhljm5%q>3fBf7aZp@hyD7x#Xv`G;A|>$~Bn&fek9N&5f<#`e4Y zw%l!7ZN5(34KFTN>N2oW1&$lS`rSdh=K-!Z7v8{~^(t`Qjbxzv0VeuB=N#V@p+i5Gs(C&!K%UJBh`{%?Dy=Yy0@NtoUOL2i|75}n^ zOMb*%M)^f1d-duT_0^5n?=M{h;ehX0Vrq5l>y>-WaZdW)Si13Yy7U_#IaL)KdOqb) z$Hn^K+`pUz6Jq!w@Z_~0u!}*r3r*JLO;B9#>y853PXHgbI=6TCMKACoT>K9(6fs>@ zi^OD9H?J(GsNpO~4ebhfx`V0}tksJ!7-&5Yw%*N^hryYJu8qCFz+uJ+&Cm-5gFt?Y zL~t{V@m$c3Eo1jme4!(H+34^NtY-H!V##rnIr*1bs!$|p8PXZ)e-Yr)h4a2cbpyRV z^mu7R`xGHZtsWXV>S@PAuRf4m3}8UQ>D-eYx%OQoV?9O~L42`z>)?xuxyt(%l669+2L-*aXuWL?Kn;i4ewRH z{KbzB_70Cu90#8_jK{~@ot=;S?cdt_{H}!r|GH4b1})-)%ww?kV8~+hE0z*SBSnb& z!>IW~4#Ac=9m$})QP?Bu5KvS`h=u>B&`9B(`&MGaz*K&boPj#{)IRykDGn9C?6gli z?OkWPQ)%3;v>L5yRs5Y6KYD>>RF79&HNMZ+XjJidDY3(gn`dstt({jz#jVQz$?3E= z93`l;W?Tn1Gk5~ zUMk7+zU&?Jm*Q4$XioJ4LoJ7yhmD zN9pSAt5^A5orSR}A(3XzuUL6vY;;g-@madD^SvdE~xaHEbi60!B~;5X0TNoF|(}&XfCN( zL9qiw@mlL!FN*&MeWvgKfS!bZ(E;b;ruPW>zZ$O_%|$ScP{bz)2m;PG4g zL}ta5zwjKf*=UjFFD;5-2y1Ayxt(^^fJt=WU)tR`a%040j2MaW;ZYK4W3^H-5_*2v z-+Q-neC#-MP?UQ9`|t2vRm2bWPM1+dcH8gHJ|wHFSI65Y+xz?N{c7Q2$pKY-vcG+} zOAF&IOe6ZbSzKZFV8^~P`*}67Ff&t^e%J$ZbKgNloWvHM;zJy=)4ij^YSkQ?p7&3@ z6BIw_1CN`(uRT0KG@lII!~jNKqWn4Nz~mG5*D#;(cGE4XLkh`Yyo$y>zR-(Kgm-N_=-LGC+rI)6QGI~}xykPQwT zQ}G8Mzr?aF43C(aMD)7Y+8caNbI|@yjo?5@suSnU`7v zKN`4WSk3xF0csT5f#)H+HE9H5TMHN=_X?UkRz&xJF0P9=tmSa2+fhf5Y@MlJ+p4Al zb?!!f*I`!OU^*1+Zf%N{6c5hApZUmcsii0*;^0H=WBa4dAXHp8RY{#R7SK`7M~XcS zqjuTtik12*?Py+xo{M)9(&J*$Ik`M*Z98`)h_9z0o?98Emz^2%>#&5g*ZPZhr(=?* zLXzjg1Nry>zzjdK!K6R-%Rrrm8BFzi!yse`P&pn@GAG$AZgV(eaj2&s$)OE1n|5J7 zXT4?P`XRAxX~7jIUtUQ6`>pNJ=g+tKOke*6=Z=x=ex3#3wDbSfMmqmT}dbnIPwVyEx9AqYmpf4?R^2ABszeDsGycQ_U=#jnBDP#n0uUeNtaiKA($ zSjJ@lSBvEw1_)yDda_JF`Em=&x;$s5TL4p?{^^)-5RmJ27Y|#N?gQGh*jhd-gCcsTamzK)L?QCD85+#y`S??KaI z?0)u!d?x+kgEz!;8~>VoFE2xPFo1$D(B=Fu;lJ*pe~p6+vGXrbOkEs^>Dv`Y@0=Z2eX9FY*&7y?0x1w`F@#l%7VGiiz^IIysvi&9c)r0) zAp?(s?NRg!xf*z5u(o4qs@q88cW``ky4PvX)B>_j5cy-z)mJCNXw_saockbW<)>o&XjEzK<3~<3fNJqkp@}k|0xQg0CD0^b z&a9N=T6y?xmO^f`^f*t&F^3t8u`D<024~JU>fUfN5MM;xc`(h4@G+e#I>N{w=&`a` zt%|Q3sU8-Qu?P|@let(Lpgwb!?~Q;zCbf}@l$KoTCvRNQ)gBbfw=)+sv{rZ}{Tr5|OqQYJ_KPE$R3`z_@F6j&DP82t3z}1XvgW0B2 zr4yGH_>-g73P5N=C@R@iTmgiXW)y|0vH(u3LnS6@rOF$lY@$U$7~UnUdOyVyHVa>WJL}BwD@Yrt?9h|CI$~KHeCt*CxBE=r z|G`m*393BXiTJZ^0~PQ8G*{j?f?o# z+85?COEKK|Ht9d(CUnxjO%)lE4v0n#~ znHk4|=m&4Ol_tO?Z=yjpiC)@Z%+kR$So2OkV+T!HQ+!b-p)~cCOD-)M0F(}%YuYS2 z9=Qrg6%*)d`mD{;=w_P0Te)c93I?$#LPCXyN@8I$4V$TPpK~~7JG@j3v&%(cXw;MW z*-2YanZezRn^9MH;cGT-tA+q?&BYG2xJj5vloE*v(hQrW2n@heQv<-}&8K|XW5e$( z@+4kc_MSOGXt239CgYy-y{|0CP6fAV<-e`W+CIg13I4P>HqcJVH|-bh56##OeRgdf zrMb9>pWx-J{9hrOBrYf0?=G{EB$V3icM2&sCar%3W#zHN? zp%w*Z*s7Zo#9X8zw3Qw~~XAY2!{cG4SdJaRmyDGYPlPY<{Xv7DXkM(a_o z*gp=v>#ejD*JF)ulk&x?R}2L|V?!2WOd34pjk2^vJ;Z)*<)GN}!6qGdubf=NC9guU zv`i4YjD3{bj0~?{ER|!yZ#KgjGKuE{jEZ*Uh5p#ZeJK^4%!OrK-wom0`yd2-)(o?? zJ~uHXs_Rl>np`ksgd~fIx3=lGX+ke8H`Be?RFJc>bBdtM z%Eu%^1=5hzg4+!PjB^HEm$%Hv@whVmxc3U>AAiI%Wd%g4QgQBq{^HyJ7%*SCZUlU( zo?593bDa}i1(SYHfuYOvu0VCw*GI*v1rej6*VY`8?rqAL2SC@5NeP=gf7Pst~<`>B4*K~_Ly zhw1p&VYvrIB9t48AIJDQM)6}ee4pA*_28t^K}!e)Dl%h zYF;X9$Y?Gh1a#%E>Z|^uJwqc{i(G{h39%%#4I^Dqc_!+nyGroN^t8B>sXoR%@IlbW zBf3?D23WK#>u62DKtv#FcK z^X>nai2o(^&%DvUr=9<-ti4%D-~Vj9d9(U_{__-{%=u3?23YI+KLTPjbU32mLOI&X zu*uqnl8!Z7#v?G0yvrcGn^IowI&}G5+boTa&A6JXRAsaEdY$aEen0l*B^PJ~HQ>%#~XQjfPG(J0M$xz zPE-lViV5U+GN#c^1=~H%igAEU%{6}!@4a)? z+};4XbB*EH_5K2r8-}O*nNG*nHfX0ppXcD3EYqAia-y9+V;>&1)CK|@jnEnkN!E;m zI9I!66nNbWqX4!8tqZk#6(*k&R{;ikldI36cVjk}g%;t3iLu{}?8I-bnAA9MKjTuB zh{3Djq34GEJ7Ol~61ar^=s`Fzm#mhCSty6@4Lb7kaus8jDe;CBaD9r+#Br5wd}!kW z4`6)@G+L|TW|3+T=o9+aD&$;ZI@4A+NReCyj~Ch?1G)9klgr7JTqRx8Y??&Et0=&B zH!gUk0X25ugD*Bq9QA~#!kJ;8i3`G8!p69OcDi2*$qpvpBN?_Sj6L;{w+=>Yz~ z&?65At>@v&zDKkN1||ZZW5Sq3h(X%@&$3NG{$CiGzd|una7$(r9S^pue3k%gf)TP< zf|ER;$;u}RS%7$0aYNfcR=T_~>2k_CL5kQ=Z?z<-5eWt-vlZYCANRA$zmeh{IvMdU zCVdX49eN}kXlIV+x=O~&G}g>cozRTOOb#A~9TduOfwn@_ z+`@}Bp$oI)$^+qQqhp48abQs?6ft;Bv(;K_G|&!rjEJH+1+p=85;sobmx@Fjo)fQ9 z<0!4x8#Iy5L2YPerU2i#yVdjH>m`dZ8D_di#m8|b3fpB3wh-1SX9my$iG-;x(pHjM z@YFb!h9n~b)Nx`AnL)@odubr*9u)0XA=(sQ(TX{63rLolxuYpP6_bb~I2u=jvo?dt zcr+P1F{ingHHxU0{IexR%9X2#BRd(%iI+h?5nwEJ{~d=HU#FgM^6h9oD{FQDJ?Y7_RWLOKCXn_df=&W;m z)`_bp(OJ;Z(hQb_zOB}q=c|b7Fv#I88J8_}YZ@cT8y1H2%1lPp$91$xw6Y1jsyQ_? zb`75#mkL))Q*oDR=CV1UcOL>2(x{j~>g&FHz0AFwJw310nP5^D5;p60F&Wpz5UqSV zoLGhACnVE}$b^hMLVP+8S>?_~Daz`IxIXWBQ|wDtC8)mdC;+aIHV#bu+paeniz4PI z7gw0=|KM`siBBkoPL;^tmm>cn2>O8481%yho9c)Psx-yGmQR^_Y140N{j4&|Jeit?G;MS&Zlx%iabC~&UXR}_+G#-Zax@OHqt3Xvzf?8^ z77Ydt2a`_dtq15TJJ8S4VHqPex7!lpH|zXVIj03(iRkOtl@h_)<*q2MPURZ3M5TB| zsbYHx^WyDvkxR0=5I$x#Q<#+KZUP;t(NkEJumz@KMVU=tTphW3OtxnaUa!;L*N9r@ELck7}g0LvF5uC{BB`sH14Ru>|9_H0^Fg z9(wbG+6O*4`U@^h8H(vXz^m=P&uR8{!917@aHm^t&H2NTu|U8bI=PK3ci@)BK9-`@ z^qp`+oCD-@Q{(Mm>Cqs!>u7s+9Qs|k+rTljaeH=5D{Xeo==Esv&+D_0(+tK&7H;|Q zP8NIz**io_Cr$VWmd6N7=2N8Ya)WGiYfO8csqh@epxCsI)fd*rIx5Al(jGN^z_oj} zgJ)Z?NWoJs(J^fq%zjLZU>|LiyI>;sUohlEE?sz$dN~=(BLOQqxMyo_hFvK4z?X}t zwJ_Ch|4ur-APmlPfGHiYAX@v;7;77Qc)@U~&&Q&g;x?M0-H<_tD{3OW6t~cGJn5cN zQYL-2GXkxH6HHCHB}Kqlq2g&x3t@yIlQ-#k6G=80fVF(>S-W!|7Es?PZ}pw!YC!>% zGU=|Zqn?xVn*Nked>scaPkB1%0LyuZC(6@aQ)jW-NIk7h8~DXBg&XYqpNVA?)s0ly zaW-x1Fmb^u+f{k7v_VHS8EZ?gYMq)by0n$@W@K%pVlF2AzLPRqXH_$}gM(Y=EZqJ% z@$s^g)GAWA(+(`~G6pA!F7D!@9Q&FNBV2*l+!;IXTsw_k^1R17DPkV9b*9)hD;C7RpEgp=mx2jK18{{DwBcy_q& z!Qr{Y%3Pe*2z>a*g;Zb zMteNVabhKqcf%lYNN72Y&?_)roYIk)KJ?EVO(rHmZ1bP<;tidmV1@9WMJa6xQ%q%+ z%{7tSbD=$CcgPpVl=D5G37dNne9Yyj#i33nSjToaB^iM3(U}8A@W5^Cx)H!gUYt-- zW=9kp(D8@Y0M^lR>fOoFU)qNhZEkPB%^N&U0L@-Ili@!BN6y>KsCye0_-Xz#JcKBl z@d$<3g%iiIk(*VU$F&S6Dye;}F5$^awTD3;;A(*ONszFfr(vfHo4;|gp(dD4sMz!A zk3^?*(=QXfo>@F)Hly?Rk{?fy*rj8Zp{L8pOy#7tLUj#c`BiFxl-enw2T)pkqO@?7 zx-hY&7V&8oWiF&0CY8)w$72P-L2f+K6Non9P^#gE0WNoVOC?38S}Y)q?KG64#+09W zo}~kw&3v$R-{YhC4#s9Z<2Wc2JVU8^JQKDtR$u89>kWilRp_kK-NiAqk(|;Vl$Tr;cCOL3gAF)l1 z+u=Wjp6CYwok6&mZkPRZMJ4F>j6;#C_<#RTiT9s=S}KE?+m^G?eTW&4e7okeuj~>y}<(sPp5L-(!~#(Jw^1vnMKTx}?%k^I&g?9EkCFplHtv#&=fQ;)@(I;;TYhVS)Kw%+%W5xY1PBTPS{(=3OF5o}kg8v~;J8Ox}9& zz?Y#HGReH-TEe^aU|_w90xWz?G(}5*_))8d7aG+`avaJ{n2@9^$y?FbFbdpU;VsXK z-xNQ*1wd8fl?ewwuU`4hjm$F!Yd-&KeAiA2W}&YO_wMeL?WRQ=EhH{}ODu`FCx|T` z4HYm^_TFEShVh4e+MZFfyKohmys@gUsp`I7_+d1TS2g4*SIt|rmTyV$K3k4F%ARoL z11=@Cu$2XK2vX!U*3&XRfSyN;C^V!vLl3AV4N{~gvW{_!)kc+auYLWx5W6#`a>tjy zj*+f4^$JFuNjv9`QQ7<7CGtO0h$eQ+$F0NJ;{Z&H|J=&te{QY5e$M~(Bp*Ebmv_)C z<1ChD`%oq-%x|T`2^jgqMDv$lD7$pCE{ehlaQ>|sQ%X}j0jhcboYKov^M7H8Mly3O zSI(_>&IMll{dF=FjV9iP#I>NNbfwBSyIHj34QeB+T21^4>c)6v}+Y1*%tl&kw z3Ecj(g{@3Y{fevVpNTH@_;I#2yow=+D<5bacCYTT zIoNpXf+Lj2P2>GKV9SWF5~`%cXkE52@3(w#uy+U=(GgqXmo;7qE8x=Mbt{dQe6Fs> zCF=OPQo_g=&{TXEjEhKqN?dTriB-$#;Zju)DnLdT+)O9GyJ@ozthhalkeow45{tfLnMt)|oH zRSXcSzQgrvxdcxS&SYFmKl8$n2>nHl_1Ij9W(DOxC%!k1?_0>k$h;9nVNEs07;r7P z8Oqr68x&5FcqsD5#E7yT9XSGOj>a5*Kdqq-kBqs*i=vP>^S+p2l|_tuibR#FT2ET= zqqwjeQ=9y{5Kk<=5hL$@h$~cN-tEW(&4jCDy2AhzMvDTktm0lv-*d0o2pCPq8j!gW zsp1?ZuIl##YC#5`MK;EODtzY!MC-ZN4{kIxz7y=qbZz3NzYl)``HFMJ9gRGgSfEXN zK|SsVhByf)eHpKZSPoc1#eii+?qYiFIAk>MwrUR6pyEoEz0)Jnd|h9m;1ZXiJGuhP z^=AOw{H0nK+at^nJ{NC7b@aY z3V$rS#vQ37MT&Q82o$w)&dM{IBQIXmsQiZ9EJ*^S8N`+aPN13L*6~;&1f!MU>z)(X zm_MVumbINSYvak<>x|3Il{?m`{FwBnoTkW%FhtX6ZUnKi1;2vkq|ThTL9T9T^2d0S zytt!t_VNWXMfu*%-8G{fZBP_67#o=LQZ&}irN^-s;JV16csz5pYXT_WtUtVV`+hGD zeLYXpX&~jB?|Z|`@zp(gZ2~CYEC6tV3x{;nT+NyQ$~Q~J@6lPK{tSJEW$*!_+iy4!(8r!+@Bmmd-apMl&!<~f6FPDJG8nDi9;7T_BNmZi> z9n#2-sZ$x;u`*Xsw7Ob^kFjDQTbIY0EYcU5#RycAttD1t${r76p9=+^KSJet;Y+w) zZv!u!BLu{Y_6~{ouyTtlExs_JrCR$+OZ#lJo}J@k=U^M`oYS+No%SghIq+xuLz}6A z1^})>4PspMC(#w5I}FlTzQ`;(jTK7fyp7Ja(rZ1LBsUqyIOY@kX56>l2mhb?nSTBQ z3!3g{Ho9^7K1Uen;`5(Iv$?XCKL1&1ym>zVd5VuUf#v@`+uQkzv%SB6v_of$c%ry> zxU+w@+upV3uq>>ByWx$bIKQ<|;O1DiI%5Rk~G-9l2sl7HTPVOqr&3{XuZ8V9g&RTc0`2 z8Y8>ZnHJ@8PVcZs0~b{OXdD(y^sR*ao}E{|HFrOMrhTT%f9+I--pylJ9L}r(rpW)- zZ<-nTzqYdSEdQV4v%Eatxk1inK^cCch${zWOsW|C|L zRUNx#f#QKtUi3Kgkr}e|K|jbI6^33-=VHsuOv%BA!Ek9iiu_B8z$|V;JbejiD#p>E zD1vkBrKp|zPP~iG)`Cjhnr`6Bg7Qxn6k-a)nCtr?w8F&tLKb&678X zjY|G^27JX_{>yETY$0kPj6G4;b#oOFic%nW*CzA)C5KQO_Uypr%es1!Zp$RiFfj%> zc)Zjh+ur7)R87+GpA$Ufiws&{dbm$S)f1a1da)l5hQyPd#2=4M6ESfx*qW2ash@x~ zBi_Qv6v1sHa$(1N?Q|-OCzA2pC6m~~z#Z|HuRGw}b+p&I9gmHv0sF5@Bv3tyO$aWRWPX+?gZ)&zan6EqfySl__*~pyI z8^a68?AKI^$BY$I-bxjGBVl0@$2&uy@lWxK3AzrpUKN6 zkzB7n!purr28yLJPU(5`g&D`-OLPx$GMqFI;xpxevs+`c+yB$oe-tT8X160f!D@Jh zRp7M!zqQpjsrBD#V{Pqu{r40f+CxfafID!<<163AY>~m87k7eX*J*C1Qdb9bwJ7KLR)R^ym<_08%yC657pfyF-O99QpC znbH1hLat2!M+MxJXqtfP1m%oVT$oN~pad^r=?&Phf7p4Pl?d^}3}b$ee80T$nB2Pw ziK6gCIZ|#RPF|ivOVqqySf3VO70i?5rAGPD=6{L&pXC1+bU$xVth(VKaXq|U4-I%XEJ z1S#csodJMPdxyJ6pH7{RqMAs*aN`eq!A(@ZqU02bVK&DX#`dIr0OlrTnv_J{8+JL= zY*EeKwx#B-SE42ct=m3nqszd@?ZXdk6TlAAHuT!Jd;zKmjIH`C^_=b9U0dDlUT+rc zo#P{VUC@hTnK`u#QWj`wFt}S$qsRfu@8^Fs6kU~?n|X%KGsP-BFB;c838mKMo>XP>vPuPaL>8;l;Z-U$epP~3tO=%Cu+1WqY+1}rGj?aKB zc!eE!Z6C{JCxX4GlP?U!bpR$gD#o1oJso07PCNias|YdRP8TNA+n56UzF@WBu|k%o zVY!m*J_DA8FzWziA>4mJvM}cwfP64h39hb$O1l-bbLbBvzgw|WTU4i()pRXUHbub_ zHRdP^G?0d+X~;W!+iR-{nFG(Z4|d^Uf&)qBl^K3%+Eio>liu`1{*xNPeDG!AO65Hp zr6o|JVo5T_RWcb`OWBswu_=UG2rp}1#_2@Av5M9MHk+<~DrG$#J<{6o-SHAeqE&K~ zvl6X>WF|AQfXzzTi8i(>Z7Al5pN!c<%bk?P<5(Zcm64NqzVp`)@Csj8@3ChN(Y_?4 zn&Y6n!6U9puiy6vxbIO_>LeQXx)_>s9(6k_;L=)nR>1dA&a*Z(o6epW`V>{3b99<> zfLCT3XU-qzpVmd7=9}h45a*fpMet@817(1H9}CDiwbS>doRq5PJ5w(VV#hX3L^&(n zYZwl6UwUEKzWNAcwteSsy-WU|`iQBr^3xb)D;1a0fm1rXXgt9AmdBIuyvG!oLUoS`o}~l zdifWyio(_5B(?seg{+F{7_U_3#G7Nq=Ol0Sgf zL6l3aTyxf#{b}(NhX$6RuHNdfXQ@Us)A7yjPU%C1*YS? z-`j6H4u0F;JEU*+)ioY{BoL5lDY~p?n=^zK$*CEdv2-)majfD*C8vW*RQxEV!;exT zlyAN!63SFmryh|M+gY>Qe`W0dfj^!j>r4D8w*OZfD~+`M-&kFFzW?_mpG0sI%*`Uq z>?02l(ImEJDL70CleTo4mc<27s!7|t`O7bF@ad`F_d%0Jco zKvWZZ!)_glV(DW{dQOHgULTu86wiNjC$Bofzxsxw$1%J;N~Vfg@+1Ke3ckU6gNa*# ze7kLUCq|QS6hst-0OOpW--*l69U@UNfC0sX^t>9vk=NJ29=QTyAhF$ZOsmq>Jsk#M z$$Ba*I;drIV}RF`y=2%!AXN7}7+>+XY~5jxdoYUoo&dW*c?{I*EPLBgWND07)A8&V zt0secMA(H1cP5(nWA_~Dj_)`w7xE2$XxEqrlhyHl%F#}+~5B82viA_SNi%NPDs$uZN>4!Zk0G$*& zuU_fpv5A)tEbb49H1NppPWmpWRJs@$aMoY6HeJyEA+ReB2t2;%2QH4@5+zOKguhir z16uFX{Z_CxFh?-O`tJs?Fzb#r+j9CEw4O1yMoiC+!IlH^K*fOnX?QYe5C(9nGx3Q! z7(O9FB!GJ&o{zF2VAf%V7{lO3H;lDTQc<7Q@nNe8Yv&P(F!~LjBiSWhQg&~UJX`3Q z8i!8(wDWQM1W}iJ4Is02-4OVGy9d-KLNyy=dvcioyxl`SL=;8k+`lA;J$G1D_nqTM zU^x%`{vGCY0`Uk^6~K4Nay}=#KKkqZadYuCb%(<|e#1Ke| zk#aE+kKA@iWSgoYoplnXXmYLq3UNTUz5yyoE~7KVD3{%?Xw`ptjpKRy^O_v2r2PVe zN|9>!_YU?tr|F&M|qCG+R4SZdaEiE)5= zf}MYPFc*X_AsS{0X9)5d7j|ZeEDRsWGeoH?OSCd2hTdgd3QDZdX^YVd5Op90jBdyW z$$qFF$d~Rp>VY)!@}<-g2HtTNT90PG&b3vEJYH-zf3COc&8kYa5wVIh1>wLOoa5eN zaDkAL0v&IQs}n$4cY}0tbqxZAvhmWt_J&*nG>NobXkPgL!h)!MR4x7&9Bt0IW7}9DlrbQNb$n2sy&g8? zVfQ|vY7PR4o9sl~SB@N!5JiQ&k#-6^?d+rf=RUd|vILd&Dvkp*pi@Cyi{f|AR>j{b z$1?i~(j5O{l!2*e6rwQT6#8kgEdPQAcz84u^ER%Pi??1)&w@5h(l{SGSwdi6r(zUk zEya2!yoBRG31C4L5zjeHRB$Nk`kQNmY-HKVJXhoAz8N{ zL{Vzyr1@A4Kx!V8p9q@#^UkCM@#hh{va>J)k|@kS8DqKSbzi^!Wj>jAjuOIDMKjbL z1ieW=sLdqvxbhg|f7VPsnzi|{KfD`)mFBQRBq%E3U3 z$$5>4-^0K`LL_Gy0i55kK@!fO0;kDDHhHF$s>EZo2`Wka8TSas)k*|J3oa_yr7G@{ z<6gzPy-sxsIO}JLT0u(FiRhosyS^#$;|VZhNY_#{gh=$pVo|KuommH zqpPI4tod~#>Cz=Lbnbm{+K0P)+Zg^-q`Wi^NsraUWXNr36;x6k2g)^K)LprfHGef5nPLb2uzfpH#SYwC{ADkM!qF_2fR-E}PzP)R z6aVIx`rlxkGKZ&LoT?XbRk}|CfTO+k4%(0Lo9xE78hL6#dqvxni{Wm)VLn=U?N;%s&5$J)R)(4w*4QKxX0OL0;qrcUjO6(UsoB5^oPolvNgi}Q)!A20bs-Yf{+KD&XK zC~R4q#>4YIW;=*cNUr@incPHO7D-_6$#~e)VAIih5o|0_6Y9)eecS%MBz$SOOl`&} zR}-gkbEh-5r%k1)Ehb8mg?yH3E9085ci1`EJ3QUnaoFvkGZh_jU2w=v!pNhcofas> zQTp*7`om^I#U=x{>0n6JqAtqTxpSuBjdCIR;Od2*OKhVcxS&OEv) z^w?Ni73XwRpOA_sWV&Ri-<&0089}5HFGS<^BK6tdKZ^^e%D%~zHSSc~@gm8b1qYO= zEG3{XiDp%KJuIZao#ntwJQt0)dh9)+22}Y+Of@wuey0h0Ls(f+diI$tnA#rTBDLaO z-}n1CzhIK>?tMVJ61Q<+Z4%zebvXKNj6&!E`TMekjexY7&Axk0y` zgBjHTvURZ(HzjmGFr)x)uPrPhekp*LrTPRl|83$LlryK_L-%Ry@4M}0Z0 zm`3=S+?y8pP-f|KK9qFdNZJ(vbcAmS-<;k|AAyZLV6%sPe|QE)^n%km-VXs`^tKS$K%WTi$|697mq6I zFMfF%S%2{$vi{;hWc|f2e>_>w@??HtFK1OkP)eA^(!QYL+~QtNO&iPtd5^Vh@?O@Q zF7W4-_r@V}vCuaPPLcfkDbYW_UB)>d4&>x(6ffwO!kkkMVsQ?VwGQSqsw@GsoaDF1$^VWA>y~6M9VQ+l_KHoZu!XNijBL276_qt=cXZ1Mozgx}MtxWuHc=R0q;|V@6 ziIUmBcin5hC$`T+_sRwH8*i1@A0P|}ZOcDOSZuz{nwQpljx62)O-C5`$PotcS>qS+ z-a8kKrV!gB4l`k1o&PBUVuXD>s2I89?v*$Qt`YhsE^f9cMqd0$-X)}qs|gnY?M+xo z4hNl;Hr6yEJE7;|fMkm46XetOetV}waaf(*Pun=0jaFj~!v@6%07ZpLW(gM{WqOK$b=TD0T+rXxlp6vBY>G4)~SHNUmbjz2A~0WL4||&|by^avq52pMdIR=)}EupJx7U4Mu|&0U2gAxI6B$ud^|{+%J!G`XjA@}bGUH4DG+?y zN|i|kJUq1vv@Zg z)CP$ZP0s%dZEoOI4#iW~;qP1uK7&mFxh|0`b%}rsdvoq#?4v7B<#pp&WYXI2`4}M% zRz*;(>rU9Sajc^WQ5>dA9Btvo{U!dA(Rm`HpLH|Xmo9Gx@VchPvLU@f?9=kOcj;%M zhnoe!HZ6Lsn_NcbFIN)A&Fz;f8o{h6S(1VgI^`<>JN6v^qHO0T!;)~RXj#Cp-U72R zBDB47gyt&2*p*?}GV9CaT1Kz-_J$yu_vDnS#jC*M(ChhKD2wYBT5o}90Q@V73NVkt z2%S9>4`IOr&ol%vs_GSzne9lDx*}n4tpJ2Td%sZ?F973red)r2^-eIvScqOJjQMJ# zuJTfJi;nw62-UXz#1Ra%7!ZhT^$N(A_rO(&=2ctC4mapJ+SMPw@CX&H#J)(Q;Ruao{A z4bQsV+I#QcdT1qv?pHODzH+R zcmi;XI9{yDQb6LYu`Pq!?`-eyJDrnlyp2bOwJp<7x=;$#&e7rfy$@WyC_t>dnG?r) z1&stywz9cuD8m|48ciLStQZd#L3VQ|Rh<0ay|6GWtq}^+Y7<#f-h46R{lpru#`-TB zAa`sn$SvIN7!wt=I2DH4$kob^wytR}d?Vq?W5P{?+U)Rkzbz}wQXnO&el(Kb&YP)L z?tyO%JOvXGrzS1f>*_`)rE5p0DmLG$ADmEoYkfV&WEP|{{Zz!P(W_Df{W@)!V(E}@ zgfPwz$W)Oa%@;4@S-oMUKOeLt3xU*R?+uLD`)=a*dx;3A>v;1mf^~Smhv9c!8Ld@L zZ&%$85@UbhNkIBAh)>ia6`B`UuXq%Lr43T{9Kh58R>nXS}UIMWljXhU47kV`R`ae;)T8WkkJ^r)B%kCchHxyt~g)RqacjLIB5y@8x zCb*E05Mx-K_xcFDGy+b2h7hr1QwIPZ>5 z_O}mrcQ9iM#?!iey^R@wcz+|}{SCk0_bxNz8f}Q~^%8CjV3hO-x5sFYiQ@umY$LUm zBfN_XIuQjkCL~J%7~yX}*H`MTQS%>U^q5o02zBiZ1ny{EUg2Eufp_r?I5J!BrJ96t zXnTR~kqH1W@YM{1M|AtXMsNn~RXW)}YzLBAalfx_lS3cK1J#O#B0i#c=IjWvEIM85l#^TUEvf^)t|JX89 zq$hAE>zr_gVjHFohYs{GjzbUUHreoF4B$?3e%&(CxkQeeDCQNjToJ)_dl{-1*hJF_ zrHr5ga;YN!aYWN;oU*8gSB|NB7~ck~=ydV+SFaUZC7|EJk%uBOlbS6Yqd z{hufKESqPetwv*Ii4xoX8n|F^48?)i4@Ta<#KB}3{EL#q+#|m&)Si9o1}c^F1>i$k zgwM#_c;}IiN3l811hzvzIi+Am9qnv)j!vAj&fflBXRlqbACXtMX!`;EoL^31|@a#?;}j z&>}0+$G@R>?(>;9ooQ=FMJ$8|qjV_gcBO#h?MZ(y>AULeo!FeErQ4^o^Q5yQH{ifH zs+?Y~Pj@2ZI?w?momiIMgm{1+%A@DF*SZ9Eys$E7BtvI{v2k?lsxxz!JngZ^ntC@^ zINO*^IQd-F3l2<01P1Im7Z(P~P>zr4oIj>EouYfO2Ln~5in34oMp&%u(cMzUASvwF zy1X1lrh$ID$@R_c44}|auh+j5-Vj$rHF4V6r>s`Jz~d}$a>k}0;SP>k=Q=XJ5A^Wn zic|i;G@XRBc;ka|#YAdJuZKRhcgj!>aYY{vlwX7lB1GrsbWw*gm*HtS3|Igvod>Od z$JLkVm`+)Nxa>CV5O`Nexk~j*(it?S{t=GN)>Hu63dt|C$)H|BThkF@c(##zDQ>I0 zA#HnGxmD+J_SnI@dxw8HJNSh0+fF;X`+M)I%n!T%@bhFqTIh0ehb!M6-X_wbL8bT! z$i!50!>d%)DDxo3Bj<`M3fu$339D%LGW3Y+W1*lDFB#*9Jy?uknsbzSh*Yq9t+-fjMf7BPCCzCODfq)+?CBIqdKN~LiwkrbB3~4*`#H85>N_;u zWOE3CBm2~JAg+kg*r0hrTPL_Thi4a}3zl0jsL_sI->02I)hEKFLkSU~G0aOC1!P_W z2ZU2(58`;vo?3D0v6w80HkNIS39Ch5$k;5XzI=(Piz>-dAGc4PnW|lRTM;6#O~mk34A;3aP&mtG7>s(;{zSi^lGCq!>7t1+CAH8 z@6s~)aQmPg<7A53tvINtelMRWkqk7*ZMj%78FvI98YdOSoC9?~<^VA5RmjRjJnBVh zX9%#$LnHQ5V&0nek6jaMTx%)iEHSqeS(`Z20i~mg2ZX?icn`qR1Lc~?R!7&3yhu;2 z%qA^AK%2O>*<5LW=mdzL;;V9E=lfK9j80$y#ImtxjDRl=ANdDCQVL{Dx+f zCMJoMgP`a2Q2<@wd4tu+?u~EQ%CBHL)6XEww)@`a$h-TYnr9kinTK)km|1iMK5I~s z-`&q%O!9RN;|tx*FmB{q%gc*NO7rBHYa)Tp7t3{%w0$SyD$%4rW(}We8ft?0nB1mY%s<8%~|Ky1t@Cg7yoh5KVW6>5=S#ZHixn0j6ApZ}W*E zjX0u1JR{epPM0Npo`lV^5exV!axJb_>%>~2kfiAi-+AL%7RQ6y>Q zYml)dWbyT@SAu*yB3SuMLO+;9v`^uq{m8!ClcC<_WNC~+G|bC!w2qYhl-hwLFD-S* zH<=fRY+i@{H7>Y%hQT!o-OGWi+O3Qx(N#6`6fJeo0PCwwKwpT031tvfVpWMrxrk1e zUvjACIHzZa$0tY5PL^zq+tBPTm2G3n z{{NfR)i>$=|2NI%^Zx%+d=_j006cw@yjJ86%2!&*vK1dD;W)Ss?n*g{3h`Y>6tJBE zA0In=r_NrdeF6)%!w=|gi63$0xrq6B(7VeyOn_?d&klF+u-G|izh_~6f=2|Diuepx zsP=<}G8N+;^%vRwc{zdayvP{_I)KNE!aDIG#S7c!Mu(!(fYRG(pPuev#NeadHii-w zA_a7Wce{eF7ezrRZ$hc&rxeCq)DD>pQMn4h0|Qr{SiI0`E_<)U61O0JWEXReNH|)m zObrWC5gL?RUzao%no^iwA_s1z^HS97_3DO|*>b21>}K|R>Czh#S$kyH)?^fIujh}^ z=@z}pe#jz!Vn-gCWXvX*72gw4d0DMgDbrMS!veM@Y10t*X`s_6(}eocyk}drPIIQ_ z)R)%%+pTq4^EIu$tUL$~wa&^t(NJGj9}1sZXZ4{_QeR#_Aa1qJ>jy_qeOY^0JZqh` z$3sK+v>Mk(w!O;`8R~yOHu~ccT7P?j zbwC-C!++o7dg1ZNuD?CenxxDCz<=NO+U4;EL4SL~^--DOfdBp|>!`;Y68-Io*J@=3 z2mUkGbkbupdB%o^XndG=bcl|)+XtskQ~aGAekv<9QEAjf>vgT*SS|lt`~`Yor~|81 zbL~nsdy~(4-jj(R#qFk_j_$@+!LVeksaZ}I`FxX4?l5qHq@yCEANTA%P_G@6v(l_u zW<^|l=jh;I+u3_x@vHH}_Tkxq9EXapc&mCZ*2;n1sT!;?q4QclL#Who?|-fv%XI&b zVK4;B&mH{vPgCQ6HJfjmDgTegYIF73|Klk>7-u4mjk{B&JD@f39tIg zyInu%yYMAEcl&*}ui|87B7N1ep}sJ3Yf+>xO7v19cJvcwjo>I>!HBPBv4?#!kQdkg zYcQd!f;V2ji&x{u0S682%80xZkj)|BMTu*~g(RxemGu1ou7dFZ=2#snBSfqJ$l=jp z+vzyXH>d4m9Gv`{sMeCU_?or^4$=#iX8V=bA9*1s50~D;n8ew5x4yo}azSMC`$#=i zsFI#j_IxLw>GD4~cW?q?lwhytj9h;v-#`2m%m3BJ>$QykU!(E*S^hu8=Q;l4lg58U z(AiLq+37`SSmQZ1#IGH zKXsKO;7=bbNGh*$*fvG;Zs?CjcryzJ1tX2q4FdgC1%6XODwmSXs~Y3zlqpSo^bQv- zutYmOZSTTLV(-MFgmVhzg*Q*a|5c~WF~eUL#9jz!>KJi(jgXcm=u=#pm4t~GEvG}w z1nEqNxk$zf-pX^xT=;^3W4L&qVa+*cAH0L5sJd!&D(54PXZpS|$_~hgHQrub z7*~>e6Hf+YlNSW#HIo2%s2{jJyx0`ww*)WSv3?*}(z zhN2raMe5hV0%&?I*`^m~MG;UAsDlmN1aY`kqa0;Gv^bw>lH0;He=@zIai!C& zn$M9Q{Jd4A%ZCD;gvA$`d`m~>q%v-`DzDKQ{R8_ozLz`n#}46W6v({Y)Ui0r5h=!& zE)yXbd6Q`SrEqIddQps^MyIt%;!WKpTpTr_15AdmDXgS44lW2h-HSyAsDIH!)6suB< zSUb;1=wP&|0-JO=K%rtJZZQq&lGX+-ZtIHbL=?JP(O9rF`%;D<2*S4#151(Hs-#F4 zZ?Dw%~Es0GR+gS-_oq41h;FSesSe=%W-9_ zO?oc6aYq%)h~6dGd_pNbIXDkg*pQE@vf|-8IegXRTW*tHCwZJMew&&S^vnD@vI*?o zY2_=*XU+Jm8NYkY*d)!^X^~b`;$wyq}`FZ6n`Hm-5LVcOX_4?XvD#JS{_ zacQ?qU+dk`h~b@Mm`sXws8a1Y6d#g;MPz9?UFkOsrJtk0JFWHg7|d<;KSTvH=5r}v zUA0*KHq+`CPlp0A^f=HW)?rOadBIsVs;$4-HMLC>H}9c|TR5?rX-)jRNPSktey%hqS5_^cGaccr*u zC`DYQPSb}gbLc}_qRyuZSDsoG7OzsR1i80jOs-kg0{;8g3Xi{RTA4#5NM8|CxW8rL zj(#}v%l1{h2zr+5&vN~Hm+Pxqu1}Nbt8+;7L1u}AX&s0CJ91(ubfxmKOKMIQ%6=PS zHXLph4p{*A7R`gaMN5_!O%DA|1oYrucKe{T;l6qwF`e2|(yeCYHzreC=Uz74k=G;*c>>#|b6TNPUD%LclZ?W*oQCI5f4Tfyt6aw~`> zKBW=&nlhib*HT&EVa_EI0hnlZuYeU~!h_5b)Z#Q~1mHJ2r{;LZxnfhUG=&y{86V7P zxNTC(6O{{{e&l#N-XGuQL*Q#5`q=ok9uD89An(dUqsz%k9tqpk2V`D@haU~!*Cp^R z@Z(N{(|+9c%)0jO`jJD1D4?QqY>4<_EAfz0II+@EJ5fRc%CQ{y<@$Oi>5J_6IcEEj z=9a}+)qvu1e23h~Q<8ISaSp>8w5QBisIn;7NxZ3d;}DA+f@{=gfkmr|d~!V7?$5US zcV)Yi<*s>ls>MEwy&gk_GIMUa$6M~VDUj89>|b4feO;EA#}>9jnZqtN0I4GL*~mG7 zrYj*rCm44!!x4ok;q4duoiN-+$=oJepG)#TZ>T&A z<^L?9Jo|RaLv5zy3gglnBF45%*Tq~I@`5gTllnu-Eva{5)@8}uW{bO!>A~}^h(Wxk z-xGOyHKVhsE$4;X%DWQ&9YsGWi2nf^G6?USAneVS?kn?|68{OaeHrmTRxtk4%A4o- zPfzkm-t9kV9~_uXPd07ZM%c^J|y97VtTjO$1+$<|bGW*!ht5=O%aTA1} zDR@WdUW^qCBTQD8!esqi!@s|XW6W$RcKtzct=pSBwV4h+@;LEL7HnY{B-U*t4sFgv z6rQDf6-3@pL;;63=mtF*Mgb2sDf)sB=!ew0E6^(G6RxbeFz!{CGR1>38Mwo--;Gc! zQz!>lo|a%$yx0M((Y+Ebhd01j2p1JG2*gWa4w9qbfx5-yS=12x3#x!?y@xjYp4-z{ zM07AC8!d(%%1A4Du(!kRl|S~npan7eDWfa4`=cv2CJOY6dynBrKygk6)WbXkD)#RE zJNZ}w0?e$qEf7zeHCS6^y60kyn75))%f3}D!!)zJRit?J`-JRA=q3m@dMH{g06P+mrV5@# zns*7e)Ou99ln%?a8J1OfW6S~I$Sgx5DN-HBS{cRWZ?DMs>3~<-N6<*o7^u}YpqccioZI@B4z})RA`y?a%*WbKZUumqXO6$a5 zP;m#wydMBm`lEQ3b_~GYQ-%|C>CU5gs39eI9|j`8A7CH2Q82_b?E<^w>3LH_oAU+_ zz+fpK%6@^#co)HZkR2q;F`y*{F4_@1hJ2IVs>^7q@xsFSaCo-kIC5bjf8oMnHO`j) zVP{7+;>bqwLzgYk5Q>i!4b_NAHjA`O2~LK1;l{E!5*J}GK%3ThCdd^wT2Eu zU!>QN+Mm=lu*gR0C3Q$WpnG2%*Z~;wNDSONy*K|a4@qDNQpWx5((MLVh5)jcAVuj8 zIc~}&I)PzocT|Zj6MG_}j9x3gFb;s8JL%J1b#|(hZE2L;F);JGXud@bhvnW|fK(GJ zZ=H^>M}jHcsk<5fkF4eFbI=@_C9W(I{Qb5ALx%sy2Hn(8R)qqNwg{?UB zhnl7G8|a7dqu0;G7Qi+SPFa#w=V;S$NJJ)Dk#`46fNGhbSYl~7r2wp$0FcLKtiNj3 zrxBkO!s`Ttm{ClM+;foEEQ36G>`_iMs;9vHhWm{b<~-y6vlY@D4DgE;&|I9*Y*=BX zm|?*@@7T$l6PNz7+^cS(Y({>r}3*Ikr8Ie3s@ zdbkc3w3L*E)-GoSy4E6SJ5z$3N=21A+gB7~!#e&=6w@!O;@|(4xpm^I3a(k*d{z#G z1wv^6P8xqFw*%GrhTUo_<&2KquDUm4*fn`E4r#TYVHFhfIsTJ+d6L}0knxOZdj=NF z=z9Z8k#kTjg=?mGVZ=SmSo^4)#1^lp30fr%zK&I@WF-3`RW)?#IP0{TJD5rVru}j= zu9|6Ot=%Rzi>)*DsbEV>O$@t50=PCfwmrF zVOnS`c(>!w1ME1|f8qXW##lgM`NMR{mz9r6!#5%1?Pl76d;1$9C`JFkz4Zsmp91$P zr5aF9Fq)HNz+{xq0Y?t0VcS3@hbqYJ+WVO;4@5!D)4Geq*Va>*O)HVLn=ABh24PU9 zJt+wi;AaHElHfiNlq9$pjD$dlAw7;Q^n~-vA13F8Kb&uV%?`&hzx?6%Jil}o=bm5w zaF+R1qP^t&V(>G9NX)OfAf)Ekd@yYD3m`qoTH_I?TYANx(L=M(x8!cq8~~FOk8Ih* ztea;k^mvP$?Cx3qA}ePxq$pMcJpAre@v5kdHb`5#_t7jVllMVDJ%q+f8^JNGYVPDK zyL6K5wyE#{@H8^kg;ebKZ*$(5f81ZsP80j2ekejeGt(n8Q}Pyxjhh~R<^Bz={3&eu zfM)*xY!-gBeF4f3SLm1>bF=B{_pO~@pFf57zb5^$@3>*;-rdg!yx9MH<@K9H{%5-X z)mm*l`+q;h2j*q$tlerfTB391iB1S)@jP-5-Gd424qb5u1VF#u@g4g$mq_yLM^kb< zBb-@$x~JTMn!%-;5UC#^i*F-`0~+U{E1k2qC*vzjwkl3AL2*xfaKoq1^&(H*X*t{P>^a*fC)5{q_aO=s3b-q^;b%T&@ z=b_pItAh`XRsY2KDP%xttH{E{3Rff#34Qjw0ocos(^j0yt@lz~DdWpo=bs^f<-cVe3*OuR) z^Do0oyHIdP5kh_znt&=$wqz*^|!n z9eHC;@r{^58;(h9ypBLu2x5mDZ47s6GK>L@pg5cicKtzAi>>9(@faoqISu+z1}rVb zD$*u5-d+3N&1R>jz!8v_FrJT#0mwFf^Yl%pgryAuhEowQb3xVX^{U{U;@MCTaq{eJ zb$Lft=Em-bTb?=g?HLTNSxcuHujC}*~Yb+6z3hOHqP$!Qp*`ltO{8^%psFS?7e)>V_9;e{gA5Vqm@s&Fv|D9Ss zwpsMIsdZp($l>6cso&Gbh%77mJH0<_1hE-s{@7SZ-bzT!FP;zD=ww>PI$0zos@!r@ zJFLdk(Hm_RrOuN{bvS)Vq6nS25Gjj-j(lZQz!+ex8Z~7rmCj<-=c~Q!lvwLJc$3+^ z^f*XErJAvOmlxSm#q!bH#pOl~9`T^iPi61AEXzEHu`wxZOo7;f9E zoiQ!c)fQPza9!G4TzmNjTe`p?8skL!v>&B5vT!>Q)^LWjXBY;O_0++@G=s*np>st0 zH8y^kwo5}biIdXYUv}1j(UY+w`HXtq8yNgFH60ciFwdsa6wLyor%wiP0UsYv@0= zv?ZV0RDB8RTPKo@&ekowKhoIDMa{<}XThHAe>_#QUTlTp1O*x%r`SXxO1cHRBAOyt zn8H@7WLKU40b*fJ0?o^U|G@(Gfu-mZGUE5t;qQyF=G6|5qXPc3Sz=nh{{uK9cCG!P zjE-X^2aAL#xi&!8rJ>jLqR0*J#JSgXWkkFI>O;E59or`ZciaUC^=YfJXEitzX}&LR z{0?Y1_w4^4r2C$=o`ooXSbc}}94)72F9y(&FU3>sdESV`Pc1EL z^-dGJg91u?abK%E%mrXZ4>cCyJ4mP4uQs(Ff2lp`-pa8`m4C^>VbyMiibjY@td}+3Z_X%HeaM~Z<(mlY~EpIv|U-R&>6DoPsliZ&5@Hkka8<*23J&%2E zLe${h*z)tnB19@eg$uRoe%iw zuhE{64b}M{=WqT$#9N~j%tA>$c#{}0bJ%zuN&3r!88wQ9qg4JZV#d2xLfI+r;Th=ygd$NAB>FcXn9pvouaEs zA2_UY`n~eCBn+au$*HV+wfjiyXoNTFWp&9ZOjcd=rKl|8J?l#Pc`Z}2D&DF&i&7J6 z88Q^Td?WN^t7szC<#_aA0ytW>=DcQcYa3dou@#oBxY6Tj<;;Of`F}7$Nw37jWHo~* zXyf!9jW53dzLO^)l*FYQdMKE12YO9?c-38WO#JcznP zwx4K9ZU?kaJMCS)6JVSfYDq2cKH@V6x(GU^Lb|^CH{IcXY&=eLn9|{G%!z-~tn`nV zAg59$^Mx+lkH;%ID)JHlh*gsTQ}sr|v1aQ-;P8V0k^Aq^?JG)0Noh}c@}$l&%qBkl zjb~EkoicWf>QZHywdA90VN>?z$ZuNKMKOnF{Hl&KX{{*y&l3vb0*Y*Wzy|hxq2!$_+j8&!8fpI+1A0n!la7nqkCc*1yl)K zUy?_%B@7<{8jZt>Nj(cu#9Lv5Ygj##p>!?*BdODe?&x2VQ+*N#iuPO0T6E(LZhME7>yoxc+ z8l^|dewx+dS}@&yVuTSCkcCOIAYyyfHlkR7^16LVI0d1b=+})>Y0#$J0oC_^r|17# zzV{ttyygAo_3OO+pZNJxv$@u2H5)5yYpp*unrmy#)}O@dd$(NT^FRFlcZu=mOHvf{ zY~bF`5ei^R{@0aeBbEQH)mmvapYQ)a#Yf+T7x}|oJ{_FO|5n+l8es*JIp10^`t^He zNu}@r1mm&Nq!wM;=NPA>9!4syB`@pO=r(+)GQM4L#<#l2ONAz{8XoK&Vwm}Y%xIQ^ z^CU{MCVv&`!tc`9A9yn0sw;2(8#n#SWVezDaMN2uL8v2{;)(&*Wt?cXrt*3iQDf`o z4ZS2cs^ILTHz^WMvnHk$Y3W;jvZO2l73Aec`?b$}xbbDs3L_!5WK&h~XZcO6O9VwV zef{z=`{dp}Sf4iU(I*|myr@@}LYaQ)GBb`=0=DcM8<7t)Xphjr*@mu62TP0~7?M^? zGCy#WMG}2$CHDN8`%}XHQ)*@4MxW;j1U1F}16#k9vj3WI-mE^`e^2qr+JEWco+TOZ zv;8-t{ipst*gpMBf%TUu_7F*O@e+!EsnXKQgtS)Olh>Lxu`cJFFq`Xgx`Mc*&X`sc z-nd)0#3Ir~jmy#59wc(}niWzRd98LY4>9E#z_iJ@n_&d*xEQ+Qt*zLovp z#>3k?K56)HjIM)|Atm2+$D&cMnnpz;)WbU;Q?5$u;0k7r13+jRI^$Ge54|TT6MSHv z2=PiZtJdh#WopSRtsK#@zzSiwHH{xy8}z6mniEkKo155=s*qc6IY2HFFetbr0=lrm zDFS5BuZA>tMnObj$N(Jn4y%9N;3IBk&op7vd;qVO&ig_4^L%We_~5|(>_r5Ele3~^ z>oaQ{QeGhDmeW*rSN1H$DAVHR${Rvi+^mg2+Q{^-#rzY+3ShKMI)QA7UT%aCX+AdCGhfSr{ix(1nz&-aq<; zX=+YcNS_|JclNgT_x?}2B06aOS2IVRna|%7jzR(>rP~K{(~iDA~cNq%cUcQ&F!=Lp1rVkd8C6A~RxRQf2O&31UfhoB?7kb6UtE zA^)9EIT9f*=o*$vZ!Uw{RYsHOs+xH!BOtA>wpL$PiSK{XXGZY;Cs;Xh3T`rN=;AFD z82^OMA3w1Rj(wtR{;W9RC$-zNtYZ`p{D}PHbsVK>b19jXwJLLv#Q9jajC8D}VR6RO zYMk9Lk?VBJNOf8oB>K3e0qWF}TX8bc(f}!mLK5P%aSle+xcJ1dKJ%KJXFDKcnttmQ z>oLPxN|6sH{SD@;| zr`(Q2lCZ^V5bGzdUL1^CCF8RMqRueOJw6msqxe*8|L8+&`jMC}l?jBL+7o$^+Ngln zxRE}#g)UyOg)U~3Eq-Cl5e`tPis0pmD}aQKi|oEJ+}u*HbdeLUI{}uu_WE}~=m{8K zkw9}!4S*Y767g#S_YeB;PFFqmfZw3_)?4M;_u|Iyjjvt+*Z=ZMO{~>hb@*?zT7~zz zmWi(dPL^angWFleUcQ&=98VtJjbI5Isv|r=m|}$wsR$vEh19-vfi&JaUao-Ia~DiP zfh!#JO%(|&#FZO~)t}9y40EcGtqx22JKyW~A~Afs(#p0*S)IVvyhG$iVQ|e6Txz@* zL$ebt*J#qcLT~p(OVF!fjk-cnqIIlnYl=$@Izv4+tLGA!b_FSxa>#>@Vbl9J$}yF^ zt38aaO35$D3Hug|{U+7Jy^MyaL>^xq)Oh_ASN4b3Zs@ziakVa4Fy*yWfSLJgV`}Bl zizaa|}SyYh%GG zmndRlR#q;GJ;mbdS&krqDSgKSq+z(i6ZNbZGO$?V?LQRMIhI;CkUlkdr;^sPk+pVVraAl^UWQ@ORX zUh@|(d<}jl6Q80mf_;D&=GDG8&k)2eouf&?&&-|WMcP0?h!+#k!d*@2VE_{wBg3SY z!JWSzx1G+(Htx`7m%r(^Mfrc0VHh1U)25~h;-c5(%E_BACk$!dvQ7D+c4MFt~9z?85Zk zn03q`pEFh*MBwI7ZrGuHDX=|Eem zsCI8IQ`kMnd{o^M(-sTUc7O-Mq-60hFRfUrBwacJDeqty+v}33Q>9>fZZa%O-WBCa zf?mLE+$9T_l6YJaL^}l&E>#}vvvE1v;q|Rj1uy!6TMk(&3A%^HZ@DTmG)URPJ(qM^ zzf^hJs0>RM9(aRu+>2GQN=mDcxGo1Rn5X6}Rb+7JGDSy0Ier`k{kuUBj;>11&{@!( zLAzpU&dD=drT#pX@J@cYf?c=omXx+&ZF#usTvFhcWqiEiTCSkf60^v-^7c&V4nI#X z#n;(OK=TH{wdb6p)GR?TS$sz5ZojVsKa{OgQaY>BB}`ITwDh!*Y-;mAs~kWeAcC=3RHsUN_6uEbVybm=E@zB^8P_k;6W`{Wek zWwKG7eu$axS}Q+Si!E!VIBN(()v=~E?9A0c|;_UhC2bUs=%gVJ@0u=3@ zCeA+776D|UfR*_qay|Ivx-;tflYO}N;P>ly%@|5QY%_2ME~fmCz`cul4)Mx}A(aQtUYz_qo6l#n=j*d7v$W}EucGx& zk*j#KKCRDs{Jt{N@4k5Z!w-8;W*_(8ot<2-RIt^Ks0SNY4|#p=pVt=^-zCrL&qCz0 zHYcrS|NHW|KI!$kn&fYmR;(6Ct@$Z8^M+T~U1!J+j|W!ECIh*gJ-+;Dwpz_*yG@$w zdIoZ<)tnv-95hefynR|(ONY~j?LC|M&;|?o%X(u)*vNd{ddefey1HHGv;FhgX?Y)> z{Ez=J|MlUlS^vF0bZ@UL^(JvrM$D7fFW*!vUDRfWf4O-`?@!j}H(;tSYn)tlJ4%^5 zJvl$GUcj4gr>@Sejx9s`Z1(TRC%>HE{B3hdU)C%7R1LQpkXH_xW{h%utz|z`{miS| zBVXy4U(NKN(z4q|Kc2d}omJ+wxz4{l+x_#C2C`ZOPI+oMUJYcu`T-{uQ0St$$){EAea*H@F% zWf2F5XJr@js1E36jqHuPd$!?}-vnXRyqn9dpHNxz%?+vlUiK<~-MQ&j>N2l-wDYn{ zJOBB()umOFR#)kx!*~C_zSs_nY*|0pO&556a(PxwdY`S|S4%6E-R|~}mp}dI;nC6l z_W6g(I)3@nqjx_Y{;$LL{}c1oYQA}j*MrcTzV0fbn{jAscDK3ka(w##{=c*SU%Nl& zLDNTf*MYiz*3}a%Z|hZa-ef(_E)EaMu>0rwW}R-#1ofLo`RDbcGNu}9_TJuy)5~A0 z;=g2-#$T9CL->6hm; zI}TdmU3RI@Uq0R0+uP(Pn`U-i{gBP#%$wBw>@QEAJiI2?A6`B5^Rl3Kr$?9P)&D>H zmrAaSdGV~S=(?p`lk>})Uk2~ndT%pgE&p?U)OuEXd*7a|*MENVbnq~C|NQ*Pt5^L$ zKi>V}f%bE&1!}tcuW#Vhb39vb8eZ9dmiP3@r=QAaTHDpG`?Jk`Yh8`h^m}hUPyX#M z|GN94&KT4;qw&+1x1jn6{z>PL-}nByxo=m0-Fo+6_U@~%p7n0)_r3k!Zw|QXfM#9e z|K8sJ@5K-0gRXvd`CqfGr-#S?e)+K;=#)3599ulNeyAHl-+4E_YUQch^Xv7&Q7dQH zKjO=bnwE$gyf*k!l0R>*JuSNMwe3RYQPRuvo_t4(+J zO_a&I54wBXyDx>(d%OFk_jex*>K3-{71cpy{hroA!tZGp(YvC4>EiFXIY|0F-MY=+ zQ^%t9ds+txzo%V9?~3}Ri@)dQAnEsX>z00x(vCV8TZgdqQ(FfKKeb&%?_&Fz04&rrC8at$tIJL%g*s4k(Nc51P5e>pxWf&8#*1O-*bqMousWNoj;+}}i}X3dQR!Vz z`*Yc$jOvHoQdiXa9fJI-hoyH-?H?j3w0_(zbylsPBIvq$SbFEx{w0$1>&HdAvv?QQ zs@?9)TE9^kE~tm4cW&*UD2*ue!CMANTEyU22| zelz*se$)N3-CGSAD3ud5>1DND+*Lt0EP(3j8Wu%0W7q7zdWDLj1mA9G;N=VT{^42q zqI1vCgN)+g^A7&9Vd^>W^*q506gHs{VcB{rmIgUAJC+tFqEJ#`t;;>HPfi zKp7i&&TwfNih{MFSm2%EaAg*)oy;0_KB-yPPg z?sT3_`HS9^g49rqj%O#Q7v&9ZI3QOgmp|;Xn)KU0`}EJ%$5ZvpT>0#dX1^};e>&Lz zcv#-wu*_!_c&NNhby@4?gRAoG{?kSEAg;VY^{qWR*?+%X%_Cp`^yX%i|J%&Xp4VRn zoE+EheN}PG`mr=OYtq+$RdS%}dTu_@uTq8cUk?ttA04&7@2|Fv{Fw)}-XYCH55yz8 zY=PO8W;%|F)h!--U3qIhW41m!s}ca~gZ;~+i)J2f^TF9aSKrJv-|Bp5T1(k^e3}h% zbT|D<{ryXROV91*v0XD3Hjk}*a9{Q2QQn>HfBF^IA9d98YEP;aX@0nbmBSkHh~Kl-ftvaxI<@2|_KVO!NC)p0ekTXhEe)wK1yGO!Qd?H^sQMb&=f zHP7K@yBblLN44MhJI9v$+WOaeE-#)J1K5iyVUmnlOzsSpZi zUDZB(!p>vcgJhA4puHGdP?hxQl9&h*N^}0rkgrG>GqeU)K
    H=4 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

    (lgra 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.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 z zWjcy;@3QLJo8}L+Jc)lVQPn5>dR-R_=kJeC&rZDkeRjF9@v{-xAdS&k93CgS4PXrw zx)M%wnG>>h4gy3LpOd1>Rjr+xQgD474IN8 zWs$7HjJ7x=mHgoN_FO-|J;%qNctCTqxejm~lyVv*sqSe?;&=rAy@2Br8!`%_2)9Zy zd=N)VIQ_9qaI#}0wXqr|k$iYC2j^tv6i=(K*h4SfK`-A*O{`P?xYsN3-m|+Xo4qZz za%Iz5D;RenVF;u5J9RDdC(Gr~sToH0C>d81Jc&i|r9GEK)usNhF1y#lFQR!P)#gat2z>aJ11GtnfW~Y^N{f$>;ya z9EK)r1HAmUHa1-OAK>|0t+rXM*Q#rqoAtj{>(!0T+TYN|Oh@W?zH|S-Li3*p^qa4Z zjQk&X>Nm~&f3TB}<#1b}cybIFsb>KtKE(siiR-a?xGq}UY>kg5% zWxi)tiHNjVrof-c9shGC%6184VL$=fn2#>USc(WBJ92=xve&)w-zkD--Gx*xFyoN(moBlI0}0AnL)o{eDbaTOS%A_Kw-bddVbd* zGDrFXZDhp%*w|Q4&1)U+AHF|m9*~T)T1EJH?zM2iMwRyCIrCJ2UrQZST^e~7?66~lG3`hBD`cXK#zQOHxFv>b^Bw=a>^LO0Yc-$L#gG;q& z&PhLN{O&c*TJ1k*j$!1I_?`98CaFnsG8d?|3yGXbi&T9$kDk&N*)hWmae|DbI=e^& z6nV?Gt_pGUYT((q_f8`3DD0EJ(QC9)qu-AFPx2Kr{G?i3W6u+g^egZn{vQPY!~X~W zLo4RRMe3aew>>?=V>t+-@D`4pmLViwk)V?mq$z{NIN7lHNE0_3#<0vg5l1OXuo>4N z$^@K;S4e2VN$5>O9giiz_jEBJyl#9EbsvuI|2y`3%4X1oc)8#bgUC)m-DBdc9<*iq z|0@fACIx_e+dTf~j;h$t0ZfFjoDr~Rdx@U0sykXx$uz7%G}CLmCIWN2i#D z?w_5ME-RP)%4Mgl7z(l5C1HAO;Rd^g36fD}_p*{;s1?pe_bLcCi7q=814xON_~G?R z?eCK9ZYN;T0!f~&!-Ho#|4vd)^e1<_+o)Q`QFk%GJr&~$7HD3TYyvXITHfB41_V3&>iD54f7j?m#Rkj(lxv}IaOuD2wQQzc zHB7`Pyl4unnQxWg*~I6i1Jb!iUJ1`;whEqAP;$MS?n$CBo~TPP@jC@6AJe=}<|?oP zq+W!`3y^mX!Unot+0$_F)lj*8qHTnXC`io^NWh!u5PKf#9Ln3OAvXftRGj5{0cb+kfZ;T^n9{D zLtL}ofGmZJ2q+ZSjF}JPhmCX%%@c-bZXfzo4J=7nQ{6K?CBrYdnFt>*U zTqaNG48~YsE0tHjGANVhc3r2PA@_s8vua z{~B$Hs$u{n9Ak}+!|}C_s*W#f$`|ThDvA~ETWv$BZFa9j@w~T(UX`82>Zrcq2C}A& z!sxBLz1rsF4eDQ67$fbMNlwSOljb{lNB6dM*gS3=HNBd}hQV_2zUKzT?)pxSy~EZK z1d1l($(XmVQp0HfK7@c@J-1 zzsF{ zaL%0Lsf+QfWsYa3V+ijJxfV3CNc@eo|N5zSB~~2R7I{3;B3%%1yv5fJ!+v{w*RTZ;Q`2g z#5EG6Rj?ts|2sHTMI@M~vj1WTrPhl&NG``%$V9qCb_}GYib2T@TuaYgPbj`2nn30j%c-uwezTksrXO6~JbG09#f7TloRJvI2OOAHdI606!NX zq^g~giqN8i7z9`_|6UvimcpY%tiXP{UIAl!Z0BH?{2#S zaGohV{TMU#eY|y-=c{KH9XM$2myXMo<1F9v-D1-QPabts0%hqaZdY8mOV=7t26ZPF zQCp{D67x7QImZ=V(WKi#bD9LAPc6OWnGB?U+v8G9VBzDRK{P-YBy%EFi+~^!_?>Gi zh@iW{xYq>-xYkOkw!3>=eo?QWi}8qrs2KF0k5phJi+wnPAey}(7J4=0qkh-{ty|Qk z0qy^~vNpDb@c*(KBgOJJR;yYY zdxh}-vKu4C@;6quH}*5a|I2QS6wBY(y1lU)<_)zxJcJd@-{31pgTNnh@ex`ucY}E9 z>}2MnAJYLU9_GEY*&tsVfy8S zdBPmApN9O0!2Lv~9S@CfZK?6srZq=4`YU$bVgj+|@z{!~T)_M?lK8-q@apO+w_SbE=2$?yVwU+5nw4d@y5K9!}4O{jd{a|C9lMr zjl`SH#G9?en^%c9KPP)=>2$K!wPd$z$$r<89j|S0G>ITr3EeC$+akY2sje1_!*H!E zt3k80s8>(k<2;}LcMrUI?*jO*SKJpo-T%A3wv~wgu(4UIE&RXd@yy5n`&)GVo~PsY zVe8#5?GH`(@7Lo5j%PHV_w;PM#lLbFb6Zu1ySSxf6y$LwPa~te&f2+P@H-%;en9IuTJmg_9QK}pK;sfZTPh(t($T~;O@`ULfF&$kZZ;kzVW%+ zTlmJSW^`E`%Jh>@DgTsx=5uX^Ptkuq1>cHo z?Zq&kpyT}%Yi!yj_6_5%jQWt=jT}+3rGE@vJ#%2(|(@OKS>AvOo83% z%ul;Kv2tPI{XZY?fAQB&K3_`xxRUgx$+*%g;$@lVF-}jl%7o`I>HCr9zC#f8P_C0{ zTVxS8$_covhQvv_Gh6?>JWW3p6gyjAjxHX3$`oHUgiOJYN`2t;NJriD=gh6d*o^I@5b3rlWEE5)6KVrmALIuGLi zQgABT6~^km2`8A`)9ZGKnV3TIImb*4J~4CYo->R^9hLr52`k;QCdR44te~Z?!l&_) z{OP9+fDJt;{WH*cjexo0AsZ>k+ey@(@Qh`}iZ(Dj zl%t9_H@o2(k;D@whWV4h!w`UK?{dVx$y2WC@B0AOsQK(aN%mRq((m9ox-XmrEF=Hd zdTndXu>Y)YRTufc=JG7;Kfeb1&)*t{@0;G+#(w(*bHfQNJ|{N7oX(nZYI{l(N~@2Gg~cD}L;;ac zQP=NZ^?-p3d&i|O8JepMrkPV!l}A@47B&99hpGk!9HKnZWqFnODWZuyuaHnNm4SX* zlHxHFY!$efK6hUXQS|%pjQT#F{P}+;%l!*acK%;e{;zIrEb@QO<@p}+|1NU>x}Ti+ zeJxz6@L z35e}9p5N;YIv%E&p?@X)v*a;GFNe>KZ2kfda}ci^^dOd8B~g5c&!0ieYK;b7eB(!A z>a$L;r?eQqM{NKQIFF&%{0f;8TC&;1Xi(!6*UB{rJzv-?6dPh3sok?QyDMty49jl0M#j3b*9};$poF_psij(eivduwDK?)v z9wwT{3Fh!iqSvZU_s0JiaQVZWOLdziZ*?x}=}l>WiUke8EyT90TwA z@E>dRsZ!NLjy`D>V=rf+5x%F{WC`i(^OXrI>g|C!6f*kaB6pS?gWSR^`0hzCSaO~8 z_9^4~Y1)gYLibKT=)eSimAqfmUrs&J^%TNKe?`VhxvoOSg_RxCUoUc04tay6+6Y1i zS$WH<*i+U0bfk#$pOKBxX$(2R#_&XxXuIWn6O!bFCQo;>alA51Vn*q#^1txFI@hSQ zy1H71Kp|EHC}IWeGDsG0EdBph ztyVMj|JC))#r@x0o|iA-GOn~=RX^_zUhQUhUiP5~1n_I`Z%FA9x(KZS+CJFr=9$emO<{{yw^l1~;gEJ-G2>TznK@ z5$qawTfsw_fvckiJ_Yv}xHFD7-4KO#tr+7Pzng-*D=DFy?<;FM; z$Y#gHHwu=BYz#I4Jo3BUL5DzF0*G+MVZ~H0yomKhOva2WljvoH%dVQ24*Ms^V5jZv z|I*z5^&Es3%nCIT$5H|pNrse!W?#YqB$5#hjZ*Z^VIXwwDav#V@RrgPdy}Zcf+c3a z31ctDJ9my2aY;C9J4#{^K^vU40RF4z`0NO(=_;pV%8l=F>|ePC$ICE~oHDv1bYxO3 zzXWnI`44*IcRqscJR)m&6kZT)^8!m!Y(l#{oFG0WfkKf3;Y7w|9i7w~=jY9{c8Qjy=O&WW+tO-#Pirr{>JOs88~5?j>Uy_+6#5svz{3OS zVcZ! zA?%f@VVS$Jx@fIN&2_WQ z(e1j?@C5DR|6eC<6Pghu9bAQd4wv?c+)2i~3~hrID7COqdiBUY0PWm3F*$GI+K31a(x%s8DUKZ^*E2fi?v)a@Y zWkP-+{^T5hi~GEMIYV2cL`yvBpXAJqRxSac@KdVMC`wEL>t5R^3<&n~4M7%$j{l^ppqXmy zK)hMebOumzRfkNO#8;F zv)ep^8z0k2tPNXV?Bs-ytUzzg+wEuQ;sM5XVN5NCLK|d5>>44)2g;c7P-U{CjM=`x z!&We3VRb-ef)oxZ(fUTMiposWZZbDW&eZFo{$K>zXnCfrZaTnC z4sbv%ho2Mez;o2``=}q>1`)u*3wPxAML84x<5ndxP%6(KWejTvCai%xB2Jg(K7p{96JY(q!Wv;e|k{Cb$iI0P9o8 z8mC~GDh$KzUqSfckMgegzyGCe0!jC;0ulKZx(|K38&D9#0j4GBcs%G4r->N6CbsFv zT3IYl=#v72j59#NC%-f5-IF2HD)lm8_?|XyK}>}(FuxbG_VE)BgHCvPkL!&uFB!`H zUXL`{8(f7QzbA$juhMF7F;e=2J4hD(ZLq=HGxdESre0(}tNv;^{05D_0oJBB5 zN0}dF8M}~Ik(;(TjzcUzw6Fbsp>ZTDWsYOFNEgXM$14i|51`%pJ;pNGcKbX=$u6u~ zI9Y))O*9r~k-h99yE$fdufWXyq^Z;onr~ajO<`Md);wtKH`-0_sR(n}N2jOkl4GPv@OUb|bqKz#iCn3)98KF3#jvQjsaqv5>pHeTk*(z~k4) zs!ckWVhuoMj=;bX3+X-}6LeX^$NaKIf&U{0d;_L$a3~s% zZ-zgT(>DMa=OC_IyD%U_rl zkfQ#>$=R=svy=D72PMyYcl>_e^LUW%cJsX5Jn$Or(t6pFla4;mc)U<6pgpu!7CvjR z1_FEtjEHUi_~u5a*FJ)(1|Jo`ju~BbIux0!vR-S1;vl%82XruH3VT6B)q;bO&@N)I zanPrSYE^M}cOB5oGjKT3)Q9A(OqU@nLgFSaTP?Af*v75&SEv(_vSfdxYqUEU;|8B` z8)=PtcmEiSqkTB{{(>v*ZExd=_)#_hb}Zyj4E-R7Z>`^du6!8xiFFG;f&M4x{>3q= zwNa8+28s0v4_cQ6ws~bMjyE58ijYEY=!o}!g{`!p^&k( zsn~lY_5GKVT@XOeo&l!hWWu$PoF%RzW*ik9Z!R$6xFu^U0gU^c1Z3BW%&2ie4^gXO zV^0%S0sG=R!@HIjPb4}ZCK?JKPI#;*O4~fE{lXrUTqjOaoiNCmg0rNV7+S}XGw^oZS zGX+F^relXq3fA~N6>NEq6@N_ykGUTs_U}}%#7iL7D{z=jyb-&m-H$^dha~s1GYj1u z+Ca6&ZnBw8qPrC;r-#rnPmbBY(g2G;+HLgjQmA~PN7Cg`RZwZxrE)qAt1^UMy!dzG zx%Hi@5X~tfQ30>^_O;(Bvs$iQ^=k z6erVQWEoc`b_{vy5_1h{Z{)^k1^t^+3Pl$+ldz%qEls3jWt7^QG1#FE!3M0!WCW$K ztZ>jgc)#B~@Y;WzlE^5?Xv)GLG&pRn@vK4WYE#M?0)+CXU{wi}Xj~J|<8nBmMqajQ zdWWSfkfSl#m%X%EG`{7SM+elhGLwvIRqj)SXdQlVDI%ZouB>G7HD~>z6U>P&d!nr+6j9DWz6A(BH(@Me3>nKH z8&NY^4`&$4;HJ@mIJ^^K$tmdC5Myg??hC~s2-+4)MEdLbq{Dd^ONd^)M*Tb6d*y5tr{|yRxX1q`=(-5XGlcJsHKGtT>UHtmbo%*1uX0< zZ2{+DVtLmr%s>tvX3RrQCdOIV?2!Hd+Jt>^iDJw-hzU|bpFXtn1u-#A90N9G> zI^NqV#^HZh74et5Fug*Nf~)a6t0F(wYrnE83I7ZIXX>F{;6DFeqYLPITZVjZxk$<* zkEdQj?LR}EPFY`HcyV<)s}~TX!m!t&UxI#Df8VF?VIr*`Zv0PP^5X@Ab~7B^C+&3h zQHQ@G)~^@*moYoy_#z1^ljB*Jh) z(1{@zz@&>)i5@5$D1Z;lDYt)2-RLYGop=W9a-#+P0{fQMO=>R6n(UphW5x|TbB8Xz zHCwQ1?-k#jBlpG~X&lqoX;Y5~>2&E@4RWPh0OZ+bjS(hERGWd+!$m%VO>`q=Xek@J zo6gb?OAZQ~1XO;awG)z?j%;KkJzBDfN zHJ`DYKNXgx-aK?Vph{7xtJvj3@}N-Q2#`sHDU3s5Yc?nfts1!FgqYe16bC(Oqo=2t z$*Ve{gOPd5R1wKI6uQmRMe>I&u|)|vK|!@yMdi3R3@YzDpXw%YM}Gr zf5)V|#F8JJX8Pa-e?ws>D3%wml+Lp^-19xwENzs&{Dm$D zz24xC`=4-#e}~(igAWb1lx&@%!$~_1aOBu%{oKsk(<${6ap61lQXdaH`F@R?-1q!= zr0d-~t29JMX$UoU9AElrA5&ms>W_oc(5TAZR?z?IScsyt7Kdq9xsRzz7;P}fAHl$f^ z{3zEA@v-xxHpP^@12Bd4NTed;JKs0$Z$sUxoip&P}0P4GF5r`W#cI9$K)hnQz)u|nJTY{kDDwrvVAmJRtm zv6zN~*t_icSA>Ny$=o5ZJEis9Vzh0Wl(S{ypwv%cPju5ZC8;9ge!5I(SB~^X;js5W zGnfW_@;RK#^yMgwyOKKF)?E@;n#a7Jhc^#4t8Uo2^y_J&jH^PblZx!;(dnVs+L#Rw z%fYiN_FU^-w#$F&6tC5XL81%tBb-8mpp%}_}f;^*oj2HDr&_&5u?x>u{btwD-FKXi%e;)6x_ z)9+U*u6q}G4sgOSr2o{fuERjKjDgR0zxeUB9WP5uU!Z`Q*e!Q%IFb#O=bRHsPIXSI z<^g={Y?h0s=#!HFHNN&?Cm)WYX_CMGEi3HNL#Ljjdhh`saTOtIQ*@iWAc|w zbF=<8@^#~HXk$iWOnts{{-1OHmA~N%u$VxQzW=Xpt#8zo{U4XBudUa%7W@A^9^%Kw zw^zKY)=A2fb_51X0m&`Z!rO-5_tATd0N5`__p2oD_BuTkhBtt!aW^g^Ke{I$8{^USAd0uq85r|+(K|oF zCo7u1oj*!qcl|@7-;IJhbU40=yKo50vFj_VD@TgW=WhWkWF>R`^By{y{ zACrC*c9Qw%(dVTlnFB~@N!rYLpWck3qq1L29%X^;2wRR;Xsjp?6P{@PE7ZZa7iOu8!(-svaYs7Q&(&?e(3p~y6WH)^E zHOfz}IRF5pPrJ);Xr{GK>&`?S$=3ya>ped4j+#ernrB|Sd31UR2|wPRwVKBV=Mt~` z&>bVnF_)BVc@QDLLj$saEEo8lYc#+TU1S{vI>Gg!*VZQ4g^cx^%BinJIkI#K!`8~0uSI#h7hZ*Z zZ*X}T2coq8Qj}GLHR%;BUqmguWqOR|#k{=su1s<-eOa5TswiU)WiP|8d| zfv*ttxiRZPA4i~dRPIWQYhbi1NG99yBor@)ei;q$S{1-c4CHJ_JmHvAN1da&Tr`?V zqD63JrU});U5JdKj0Clhh|pR^uYtGFZssb{YVgINH>|7&9X{R#K)!_}!q7Zj676L) zVDVky1E7X}P{kn7e0anN_H~thy}Je_Nr{8};WhLgGV92qXcrk<12=|P<}I=qjeYh* z-lB6DB5o=9Lach0ESP_TyG^+vmZCHv>ili%xY1;DA+p+YM!JM}DsL~ml zH@t!5M7ZntMS{7i4AT@o&}(jEfQ7@Ay^i1OjA6z+tyoDFdn&4|l)B&vb<$;<=oMR_ zOCnz{ML#_Yks)%NyEY42=!p)>A`G14HOfT+Hs<)+9|qh3hkaILrkT>5XkOABT?NdB zPvZgT_3I=K2&eHoo$(F9rnwWN9#k(q{SZ^trbNq>%UC%CjWb~zOZ-P1En6gL+6dE^V05WLuzm z$Al zp$ayhA4<#Q?0{u>C|0<4dk=_f{0;3Q(!b&~;KbStk+wG>&gRj#UA1rdFHwilV1y;> zpu5e)ARc^8-fS9IyQH5|eV`anz$@SiJFZHE#mfqmG6r3p&F= zG>X+OJdd%6MuL{8MJWKV#8Y0z2-N1LrB?-U!=(z1%P$0{C3)kpk5UG4`p;Xb4gc=BcT2g#SG40H$fabww#vTFb!e1h1Goup zyvuQ)(EKyiifnrujNeB>;SMyxb=qVgY;7(X%ZtC?nen(xHGlEpV9FPxDPUGGLlK2W zTzZFA(9PgBKsUh;OL_04tsOQlqiOfad2hzI()q6>)lMWYBptUgoWS-q0;87XFm2?! zaVzDxgEELd-&s*U`7feaufL^BB&&&;vrBlKoqz}|a*n6&puM|nC4$XmZX<7Q$8EFV zX7<}zXPWl1Zmpf8{2Xnw9Vu?o?Tc*z7&2PP5#fJfL;mgAkY^6fE%2(=KT$GRu>^wv{dn)XgqXZs;&WO&s8t^P2I>X(4CmigB!aDBDqoRoTpjH&g3H2aYNa zZ(_^!{F#`@9_}n{LtTiG2d<~p?R25#0qkAvh@k`{Re=qeua)TV$f+43|HmW6d6oER ztlE{pMp;-inMZb`4nM3jN=}k6N~2-+&49`2*?28a*z#n;9c#dqg`67Xc?0=ZQ9#cQ znt7Y_fzV8(UcY7{uKC4gBB$IMF>erlqp1FRVF#El1k*YU0&g4-lM5*;KoMPX-jYXb zVhP7wU)a%yd9#o+4~41UW-+b2eu zouYP4`MV^{y7V5UGm;6|M{4gOuRX^m+?X@#th*>2;R6Ng`{8ZSyQi^k?)+$k2rIx# zcXi2<;4v~M#{3>CMq<(|B^2FpS&O;hS*1e-A_?mQ2L9auZ{87!KNF+w08)s>L2v^@ zyBkCwNo1HSlA(;4D+DntdMfe_qrs;TT+UfhKZ2;Y1hK0H%;J-R33Up{X%??(+o)}N z4)MfoNA4C<9?zUy=^pP*!k+N!GRS_Y{r;QW?w^WDcM4@vYEvk)pz*PG#*m3{3t0)6 z)0zuq8+4hvGu#Iiv{X<7GC@o32!m~|u(WV#j~%J+VV<1v9}^MLinNgt|9NY3y=umP ztZr^B;y=#gS;T+*>f%41w@=O*@0#Ap*+KIxE&5|h!PNMJ^fsYrIKey-3}+P@P`dy^7A#PjV)6YGQz6k$V^Ohx71Q$xiG20j{)-o@m@ZN5cPo%P8UG81HWqG6zs}h~ z;tQTFuzWMVr(6tk!xav|dSA3eGnA;A$GMKhD#AHT5bQny&;TAin1EH(9EQx$2j0`1 zI@Ye0)cR<^exz;Y8f4`2U-Hr*{W6|doQZb0P|9DJ{{Fe3i9QH$;*AOKi@1Rzbc7Eg zeh*Igoe;YXx59yp20+DqU==+e-(C-020@ST*M30d!ZD1N~ zSOqU$glbk=G0lI5e<4u}PectSgHJinlB3Kbv;W4zZ=la)TF0%6d4}DesKc^74o&Go zH@rz`K4hc#>t8#pG2#Lw+RFeT`z2r~Kzcp66^lIyO+Vb|-fD{VW^$FO3yGX0HJuu*Gfq29eVOc?7d*#f-f64iMHxMl<^sy7ctQC_?U{C_ zLz(_dqP3l5aTua3DVvivLDqc>Eg?f=Ut~8?cO&IUO6=Xc;owG(7JWY$V-9oIXIzN0 z9y%=Q+X7IIG4o`Mh5A@w>XK{|10Rg9u73~$kmntJXrBFg?s-u8C>TYMSL-7dGofM3 z8GiI{F2buZ7E*us(bxeU+ptuVWY}&bs66is?%2vZrcmU(nwZz5a!Q5e&~mWcOs>Qh zKn6B=dud+0?niVZvEK?adXUS@thlJ*5z>}K>g@PYmnCQ*RoJENK<`K z@+IOMT${lSj1ugCxXfP*Gn3aem-rWLoU)%UYW!gRqPAzV>JdFfJX!{G)X0E^MmNJ9 zb7a=24MI74Gc?D|N2Pu;MtikM&8sjuA*76N;J_CeTCFq)Ur0|MF<^^8fQTki0 zRQI?^Rl*QfE5(h1Eb4>_CDo*q>ewwFTR2%f5B?OA|Hb}atc`T}zlOghTF{KWJUnJpG6vo%^mG@^yR3kx;@Ru5YC25&} z<1vGUJ%Vv2VFDu=?Qjq~dWF9vJA+@osO9d7ycx^x2x+&%CzdqGf6;bc*Z7odvrd+1 z=(q~+Uy1%p0&J3=u>euZy_(X$62TK2JoCsje2K^f>^0_~u#9~X27xSFzpoC$oa$$^ zi+pV5Bzoh_$xHfH3p{Eq(NVLeE)`oLF>9AIYl|XO8J0o>@s18e1HkYhPfv))J5+3S z05v-((KrM(^i+KI26vvyX8#leIyJAHXLpAmR~EvG$Xz2>wX2 zDf(BEPtm`0<2LnJOtFjiSv(v@GTMQdc3LHvioj?E)yle=S{QqB!6gx-EXEznViQur z3dhoQcsWX2Kx!WuhE`}T!6M}ghLo~}c#Za7Ows-ev;7x2+E?{1<30-j8>TEJ(O8I< z1>L#9mdY~%3t_IiUDbRR{GrGNAl~MJzpKK4!3jNql8O$RP>xC(LdA(&Ycg38Bs>~n zyElMn9zq1fl(;e+gs?{m;Zu=3DHLhr%fR-6%Mk;WCifw$;1~9LAn~g@VOm@*q(r5s z;$O_8Vx`p6RGGmDon%xIM}Uih1{Cd~(v3>Fah&_jL5kz%5(Aa|TK7-}cY!0}n5*DGHW?;?}`vdBKa_ax|E4_kkWZeI+)obgf z{%>u4bD{s6$FtD?eMR~|${G$^m{$OQsBajGKi79^0d(edekTmOoDK%a%XY~+m-!<+5S1ppeWO89g$G{`Rk}{rhQ{5-qM6Te| ziQDrFys6kjyHfk;wsP;SUY>(+>Ff|>19{Ls)e?PKavGR(@C>+q!|yRtBAsPz*$|B1 zg%A!}kMf-kbho;f0hi#(4mtS=@|Dj%8$bWNr7V_U$B>yE%%J)x>_nW6}Z~vF({;yzLUaM7WnSKCiwfMF|7yOD` z@K|8nCqK|&%pyc11%EL4@}~mAE;(up#cn3b11O0_sPZE0Dk97ZeTRfg zpwH#xOW{+;Zn?Q(D3&Zoet#6QaCvZn&4G~1X|lGc-y3t!Cd(m+=@oJZyaY!BUd6O~ zgC@$Wn1n(S$E`2p4n#NP)*HeP@|0eb0{`TeWq%T}p!OI2xBeIUYlr9{Bc=2kS(>zm zOOt==fAQM57B5dw#Sua>f`hJ84Wvef^dp1#BOUg|J+Ci3Dnl511pbgH3OZxF@^2|7 zj4d=816N zkxJT+j>>r=(*Ki@^j|u*?1wIf0*mV{Qc!9SbT71!6d@!sn-6yd!updgNK0^i*r4}$ zD7WyU7w|ZdG@!qX5oxJQIHO>k+uLsk5#D*b?Z}7C-0yKvoW~Y}b{6y+w)(pVo;W`R} z&7hA#Fa+L5qWA%uybL3V%E&{^S5R*t?v3zhM%L9%2`;(j$rAVr|Ih|v?*Z&MGP3>Z zB<+xYWK+16*T`RmRiRqTke6m0eeE+_o8r3(&B?wKIpNYia56FJ*JCWIWva2t2okyxhv$z+vTq8 zjymP2kR$6=3iGz5HOm@VN=C6XEapgumW|Wg*~r|WEUCx}>~871Cly@TUwJAxwp(Z4 zMUEXM-A=A5j!b0;v4aM4>5$aN5R(WRiW$U?a`hi})pF$BGB5?@tukGq3e_^5kyb#4 zqlU$Z6=PR%DX=)L#Bnqp!A>-R%rULh!GO$G@R+sekqh1jJfX9MS6G;ty*NXm zPASx=+Ys5@xRA4uatcT}bCF@}B8*LfaS1Sm;UfzzqAp z`r4Lx|6AXx)fe}_^LQ5bzhB+`Z}azd^SGVu0PHSj^YWeYHr1lLpqZ+zCg0RwRok|< zxvMFQ(&mQ|%XM9$|L9g=&O$OZjLqJPmP$tCad^L~J#@QES+dg5Qv5TESYv_a1W-+_ zTn0BxwQyCGvpD?Ov!am`(vDh5cbl`{j;s^w5SZFPc0~#Pml^rbr`VrI{6Amng}&%WP~+OA1^-KQ zmPud^NHoQAh1c4F8ig9?ilI*hTcqM^wE{I|v*h0;VKSzGsP6I9k7kfOt5o5o zF94H3Y`<^f+m07t_!h{yQ%edXi6`Z ze7axytnBvchfp8_mX8@;#M!fEm&R$ zpunRK`yU8Ld9%M?L3h_-=NjFS^ohh@LN-G|`B!+YA%8p?+<**093#LrptiQUwpv@Q zqoE)9=#?@q+}VsC-cYkD)Mn#Mb1s#CpN`bLnj*=&cyq=tiTS~UCgPSCn-AT>5(IIh za=vzf$JXGk5Q+6_yX^{TnYX93LW?Usz>N+t#~cM+ayE#mBP&Z!FE8aqMRroc(qVUS z<6*WR#IZNxrc>U?zY;}7v*ZnJyTWzHz$uxy_Tl90*T&h&`{RQWyQ4e*4HMEXrif~l z2jIeZ-rmNn1s~2-)*|uFr9kDFK)X--h><2wSLzta=n8g5RAWuTBD{>kfJ7Q1@g1cf zRK$Cr9vZC&&6KG?9MM`3_Xi+{q8*ztjUYM_sn$=NmN_)%QQlJ0dV)7pHOD93QS<0c z^UP~Ek4_I8?WXtktkpa|IA5}vdrFkq{-TK0D8ghNKLx!Q51Jq1IVCO0oBU5CrWMQ_ z0!k;p68Hb?$fbN_m;TH&DEUE}2EjK)ivV1n;*fZWb;1aXHn(sG!&BRZSj@Z#Mt4Eb z2PO@l$l!w5hJR%$on|}fm7L~5>D4lAaF)y!QX-pT^0k1;ESQA$n^ zziI+XAYtn(lnzSdV?|7TiT%OCck+p6K|S$nb;?UB{6u;NfzK0t<2pG5!7PEECAI$v zo^zt|90Gypah42@!YQQ z)~xJx1My14zoM!dx%9L$Mq`O3m3#9N^2jC@9x%iOYdv$S1!CIY^BW z5T_f^STNBA_~Z=Lyi&_+SD!q#e(s^4-0@$y%LsQyDWD0?zW+D#f2>!x7W&`0JPZBr zSET>lKRG;X?zdYf$HL0^>|L$8W=4F;Dwii3%M7Bcyq?`dMPuo>hPa2LWs{Pnw4e<9 zrRf`)kWppPV!kA5y}V8rYMn_uFVy<^omi5sW_Yr^e3=e}M7<6o#Qx3E>|`!2Dg?X! z1*)ZZyR!2_($kWCX!VEVQ7#wIi6Eu8X=cH5y5mZ^)ZkgX?xaH(7TY@sKSAAr3kwAjsXbYIfCqVR(beNWCa7p7y1!!O13 zhv{?clrQA}q-dDMPak^|pW?|W|KV+1m}wPmBVGPmtFEoDCGY$bi ze?xuDtoQ%+uk8L`UBLJ>JqCL^JSV~q0Bo=NT|eroCU%3qFan^xo950xJ)CH=yi7Bf z{08iL())kD!}`4$SOBm%hj?GX2xjUBN)1ZU=P@GsRd#6u`Kusu9xa0Lj|O;Q^#*4kH_AaSTJ<|ZPIsPEqt&Zw{lK(D9t(8M$&QU)_(9hL+Za3*vXckZD)bbg2 z%hozMWc}3oS$DG9cv4-V;T*%)0Rt0jCrE8Q@J!S^Ks&)OrNG+|vv~ddm`1#`s!GBD z0I1iRPCZw5ChADuE?`782#>-5eO!m`vK@Z@!1U(F=q~8>R#Wc!_V_Ka!Zz4B!FVm# zF}dK|V;W(4Rhj$x&2{xgPXnpfZ%ZWfAC-X>aZyo=O7uEB#W3Q8|8^<3yt`P$w$oE{eij&vAgo(INzJL1Nc4Kl{t8e z(df*Ezc=CNXV!sTy#vN!g*&ZT0O%!4%Q}z9voq%24UJ9_vM$^umRhyE%$t3HE+%6h zWg^h5QZjgu3vdP!5@1yhKmZeCM2-W~FrJ!r5`i!)>H`y{lPVD>QF2->J~Bp;BV6XUqljLpUyG?<2}>i(;xZcCpuy-Gvk77WqTE^%J*1v7 zNimku%96gjIiOMc8Euf8aJWK~JH}}M;|e6YHJpDxv^ZG%aNr37hHhtRFPwIq+m#FlN(%cUeds@nX91}B} zsmVJz87iph=gu*Esq;6<41RIVBlWK4$1`zOpuJL#XLMfGvc~DcsIjCv^VlyYid;z) zy^K(LQ_(QYf8|w8(&FE&`uwpJ=Pq^mH=-!lNv>F>qDpfMh32iw*RtE^N4tOxWvVy+U>)V|utIAJCWcJY z329G9K_B(~@HT*~A7Ej4=SL$%cr@mzt4p?^^X5b(g3>DrS9v!OiaxnCuWoo&5lw-} z^U#7KAtY|^U}cxF#J{dPccpv0HwlIIRK^i%C0zU)+W4Q?y?F-i?US45`bdSSI0`Tm zl)N`Snp%lF7EF2}qiJijKBd6R)wM|NTLEpk4EQ;fuAGr7*U!NsQFPlZl#bABt2*sv zi$*)2GCNz3ouR^30-lpT@K!i1i+*|{M`5b-1;3V2%tMjT4A;tWnQC63tUGHTS@4R= zm9AkLV75T+nqskNrCyc+s2p?ck|TPRt+ztQJC{D28fCNRm;>OxTOGI&QW&V+0{*dG zES~g})BlHWloPd);s3K)+gvyNe`>Y$wT1uBJf4OB&sXIC^QLj`%J`D_!nQHKa3S%= z05fbO@F#p0dmJ=P?ixt6MW`)(W$?7abow1~O6X?#0TqiRucwztFRNtt%3C-W+!#x5 z{#D?S``D=h+T-o)GQ66|3kvUIFbm;TA42?%`{1YLK{8fbOw<6&bzXSs4w{j@ALQj!XfzS~efAo8V>;*^?U0Hf$@EmbwA{HzF(QL87*1 zx@@WEMey6`kfX?JW(mY!?6&bCoe6jf9qtg0NMf{i_|GW* z!R{4DLpf@);uKjBXp*N<1P(*qD9vwZg6s_LvaYlXMheGNK2Ozl#JJ5Hq>@I z0?1nfQcE*@!hMAxn6mJn)xXf*YgDzGunCKOTeULU<>P=~!U~PY*wqPyPd2r3rlJz5 zK`_@3?#QZnO*IKG0H;Wd9y~zQ8xS!AC038?@L$xp79anm^!7!K8UvCG7juQP1YrpM zpW_R$;I?zD0n^Lm;aQR_liaJ8pL;nN6^OQv#Hy5=XM<5GCq65$3P-EC7*yNAg4)mQ z>_(&)S+JG|Wi7gX=@uW)NSyRLKY}w(Nv*h(rvmpQvGAgYW?bA-vgBYu^1?Q`@SGe( zeq&xBvl3}RV7|tL!{W_|fadgKoQ78_AmVe=cmmQ(h(Id$Fh8oHb5gGd+ZoLO150TL ze+Io%dK1ZmmuS=#F`nJ6Q}Q`)H`=Xz2+oK9I%a0V%;yU!92&IPX2fzvM;6Yx#1h0X zJ*(H*Et#-hqng#~$%!hAi~QwblJpjV6LHfIiPGGOW;jworK`84dH9636zTBNdXNh3 zo;w0a@{j_b>>C4ovF;4;A+afZVN)kbDwAx$BnR{8k?zuz#D|q&S?;U~JM@~QYG$-q zf@Bh|6hndt1m)*XECki~-=Fm^Iy)lpc*k*S>>@TrtNB1js{O3_?YTprCL-hAXsz|bD=N=F}sn30>duj#bF(a>6T=5&`rXjqjo?u$eF9cG-p>1dV8B^t}`ykmAK+*p1u3-0?^7gC9p~cG*Dp3{E|x3nTO#=XR^hiE@6oovQWIb<(mvwNkno zKnI;u9iUgrp%$=KcntM`W@mqV(0ud$9b`>1ZSN0S=Z!aqO{Nw&r&0+hrKE;{#H+9F z;D3I2EknAzco9lJRb3B3r|Qq}FGH^oYU&8LLc(2N)k}nb2|rG0K+V%H4lXa_U_|+(tp1DFobdka|D`B9`hSU|tk8=IwtNe0C| zPFUdoo8fpAc-(-|p z1lJ#JvmT(=M4iii5Q93-+fZMb4pF*Ra5^}FsbD;C*T*$p)HosWLYJuY1MByyA9sK% z@S5On$Oz#@Uj}eP2Fw)`Cb8GiMo2D>F{5~#EA4^S?#jXTVCX~N(feXZ0VpS>Agejk~)5`Lt+`x zVX<|I3tzKZ&T{>p!XXrSVg z%rsf>6RjWR7N*uEC@zj45A;E< zV9h^RB0|oNbkgT&QIU{yT*-&C67(X`Ht8$0Y-!IN$4)+4^}Agfo(SG)v`Q{k{D|K8 z;@bRTLm^K|z7sR=B&DSxcw)L!=Y9g}Q>z!=3haBV&VGA67;NlGK3o>NYhLy*`tRWE zeT9#UJ$vOf&uB@xUmwJXT3PZ<_Ljvy;aOTq6S)2I&v0l2=xIu%MSV+odAvSA{J zzCc5SJA)Zt57_R=6)@aN!|A-zT&7cU%N)FFIx$Z4K+=Rh`Doc}TF7)xf;h*gaF~ZN zxvTaSBOiK2i;f4x))F(B;a~`eGs`i1OfdbW_X<3kBtt|s%1t>L z-weYZjhc1|28rQiA`T7i%kvQ_*$YPC9}dnW<37afBQS8282(%0vFXQ9W!%3AKK2K9 zKnoZ!q+a*+gEKu8(E4{F7P;uiZvrwT?kpjxyF0*GB{r*r=;JDCaW6}}8DP*9PM=H< z-4`^!4@6fZ@qHmvaz7Z8yKEnI{hK}-U-j-Oh#-paFmAxk7BqmDq-5LyFO=~Rrsp2c z)-fX#m{-UBH<>zo7FK+fEhlPT3jdiE!h;ue9;=HwEQ=@8b2+`m{0HqKXKdH;+Eret z28{DJ!w1zKQsZ%^CF=)w{OGllqo}Y8PT^jXapC1N!P%4_hLpkctPvjg)h5Qp12IjwI3%x<-?67u<_9<0JFVU-UShP-lGcT?URU%p zS($z+=_4|#(|%w29qOl{1ECWv;-IlZ?kKpz;t;~$Iv>gGbb_!4@%hpOoBsD`$cvnH*AkBYc3YXiK<2-05g{MM}giUeIYyC8;P>SGj= zK)bIQWRXH!d+4`alagMLpCw5hj<8|L#@Kl5t+9_&Hpfu&163}`sg!5du0Qg{IRI~T z)SHqDc5J&MGtCdA5(eoJKIX!~S#b6eM7sEsIxGGq_S736Z{A`5cF?;Gx||%OCW&HJ zS0bsJ3!OB>7@r$B*9Y18^O8UyQ%Y!qhfV}O7DhGI1oP8^Q#jrER2ZxyqW{XhL!JSy z3RnuS{1Z3-mr3(U#Th(mSA?huu=qxy!RMsF;P-;Qg!JMCe#?J;S(5+NXoWD{*L1Tj zYtlcf$@frV;Piq{Tw+5}`eOaYqx$lQ8kT3mXbG8l)swENkL~lkc;u7Q|DTBC59I&9 zzOl7s`v2E!wT1uxJf4OB|JUUIpYYWCt=0TMnd_Pv5g9RHpcctTpMK2u8OQx!Bp;o`80@Qy zexI36)C9yd|85Px8wGl9EEWP?O_{>tcC*Z*+Vw2|sJ~?X0BW8dPl5l<&JhcskMmiq-GpO|`^r}Y)&YBRj3GsBn)MMbzBN=h;SGBq#s zsm_~o%z`s-$I^R6iE1A~f*OrcOrC#O6nhFmkiXW%!zX>XJ|$_bw0<&+TCpuZmHgIu zagoG97H}tu7BQw5xtYJ}+{{LTiACPmiMptSD*t*izowtKta+_1h{}7!g5<)91+OQ) z*2E$%Ut5~g%F$d(mQo~*w*}&(rpw-S;c+T7K3cx>A0CJBi@gIM}Mo-N}TKo;x@hWiK_uLNa@>upS3+pkfGbE4Hryu0Hi^Uu~kFT0$-`1k`ZHfsvwQAU=sy{8qv7xD} z3R4xA>O&amVD!BUXoyiYGAe7Vpq7Y15KNY@5bKUqR0YMllmM=21SD`ix_x2RB2AHi z$jNu@G%rF3%Vgr#%{kvroP4y@;(0QQClt+;Fho)1Mh0F%hjv_*LXDajUCQ)#bsjNjy!fM?QFJbRLah%&9=-O`@aF2>!FR; za&KEC)kZT&NIa}+dMK7ZL`r?Z_O5Yd6j3<+o^}n%e(ZrInVQ= zG9HSr&MuVWj&=F+{JsJomQLb#xriTvT|wL zff)B!ET$LE?r~Z5p)+|Wv~trYA)jC89lA|>Hu7x0=R6L0kL~`M*Z-GXI0|>Qf^DSx|5n#F zH#QCb-}-uW;r~0AXW{?*75V?}pPc@|cnM}BKi6x9&#&t{Pp+UXVzffHZgSnqy?${C z8gGgSs?_)a(*R4C^~R6Gj;G$44Dh5=MJqxd$c^*(hD8v=Z|}+JiUk>s!CQz(CHN2u zJ(?`<^OU};HnD{Ace(3eEMYPp`lHUZo@>$)wQewuIzfv`i;7rt5X2+?nqGB5-fJF1 zm(K$xa}59{@(83O<1Ox&J${|q3Jadb56^ekuwF_8Alxqi3^iC2??P#r6nXKYvP=QI zc%i7tzZfpS&zl!7)DFPkV1+}}Z6ibe+pJ?@&yfG>)%At^H;+eGRx}RZot(AWzZ~fSoAj6>jzUz( zSkeT_Qm2e+KmWWAZ+{8ydckP4a_V`Iks!<8b6(ge2Vu5z-WF za-+1&yE=);-8O&*&o_&=}U(>d-8 z-W}09>b4M*0gWL#-uXQ~kbv5?)$gn>Xl4qUN#OX25{phMi=*k&JenrXYI=yK=}v1e zU#=8>#6hl%rhpQqI$I~VPD*)898;QJ&c4$3_%({bCR>%*2C}1Zwd@i7eH+o)s z@k0AS%kY~UahFP8exbJoAZz|GQyh3+Q7l-W1Zr~EBxjWnx*#rbypex3Pt+#RdDh5- z%dp=AAxpkm5-6nrQt_FFF@h7!S-XQ9mPXNn8`cKs3D9fW6na6M*;&$k3yHNI>kQFN zaQd~5J~uI?ARvvVTCs_Lo-%ywz z31^Oji7=3-+qA#(=vkZnX*TuP@Yn~S@BB$Q|H~kP6GwifPx|?PeSNF8VVwWr?c)4D zj|VT$;xbm2{H34p@N8DmzTXY{|MAf=mOuX)_&pHF4@cz8b0AJ>T{P}@gUBY1=MlwM z=;0?*9?vO^KL~2*u=J&cPnLd{F!ml1$&2!Gu=cE~su>U!2oV8oHGv}wxef)3hpAG085!Ysl zC=L;h&6fj+-$d^Abn6lt*J(`db9{19Kob1~crgNb4M&lO2g*V5n;j@atWaoN;44Cc zF;h?QJU--`OpDX;`*35#L3M-fxD#|&*>C>3)ra&r;fQHgwrXkwXQ2SOvcL4x4T3eBRSj2r;42&Nc1?+*6;AcP;2N;b(@6sH=3LH888xtPU z=SYhzVsJ$e3|_kI%2jEMLqmyHeL%Co`RW6aO+v_nm!HLv!jx}M$R!=_<(??Qocrh$ zQKAErvK>)i2EcYj(Pddy_L2Z+rvOpXd2-Y!VaE!D-rQ*g(K8K*oO?S28FGX72doES zwNPjXDZlcA;N(DoXul+oFCw!?66a_9Fw)3I`dMkYTxyiFFn)$g%NnYnl6^=}RAMfz zTqbrJlZ@U?ag2?q^g9bEGbLR1%!Gc~Gd&rzXCi7Q=TuLpX=HhsA7UKfp?3|CwwD^c z@IP~`nwt2lo@4gu3aV8a^@&yyshD#mrIyWJO||@ZZ`AW))UHGjc+OZ=7N%tGO(q?1 zW6!kRLvfuTwBcAx6T+4=0zhnwYeK*|wvGuQXYMFpcF>Y_!pyD2GGqD{lAOAXts~F2 zkwN6C+Xde$@{yvpyz|mx>W*L%BYTR{WJVi0QL?8HZDur(e?yoUO@%j#Nn0wofiPB= zu|5);hK-_;f#3g-;%V+aBmp;J(`8p z?}ahDNWR6?0^#l};B3fDU{M^7#y+!5V>$kOa{JvU-h|}9Oj7QWW8OJC&sI>l8mw0M z85`Y&y&jwmneSfrAhaXU#F-aUIeE^*F&?_m`oR^Zqzahx)E=lUlUz?RlK~5vfRZbH zsrE+9!Zwf0M($8`wVO0R)v0cgL5 zxK2qa@mc1?)Iy+^%Cb>K6I^t}X3vlwS5-gw@%X5$kIM0hBTHK3%O#TD8(o|P$mxQv zK^W>RC~yg>GHZ767Ci&-WrNKzEp!Kr3qqo6#_f^fZw3*$4BCJ3;>|eh!957xCObid z#WMVF7L-?8<#1mYsr&>3FtA1_slqe^pG|HIh;>;x5j%(@~g@ zZ#z4$^@dk^PzH`?sRrg>@Mn!t^TYFR<47dD%?zFdY{Ja2Sd#3D>UeF>E6oqv$&Z9gG;iBi8hR^X`e*e#-k-8 ztstAkE$3OyI*@zpIwv0tcM4UuoR~>h3#qD^S*f5)r3uatN(t4$V3^zL+D@doYg-`| z!b$F?tOCzd-18C><=pS=%%qH`Pf)XC!<&FgzH|CWn;#3pA8;?P_q%j2$A3KjUd}rK z&$N5_#2ck= zjTiFqgGXCU7s{s%z+ zlUWFCp7{KTx#Dx=SP^Xd7u33YUTN>~pB#CYf*mLJM7?6^Qqx(dcfg<#y(cvavC^=0 zrjgMbSy|~&(&Os%q;=ee$jc%I^Zv>4dAk7GjHT{Go=SL$PTPRY0FmZONJD4-{#j9L zF`04U_Q3@t2rd6~ge2UVOhM^caY2cIowcy^Eca%z`lzy!4W|it=~sd0jT0jYDY3;DFIOt0E|v$%Ty|mxyn`92rVFA%?!D=m6CD}Q8gvMx<<6O*t;(sG6YgTWu=z;InUw)AbxF;Q&II5DVB z1}7~CRuk(c7f{z?SNbj8t)i=XE^0G&+>HI0G(libN_7TA6G62K>3UJ>Giaa)71qqV zO~*!#do_v8Bqdm@$z&0d<#@@Y+)N5cl5yrFyQo>8tTdv|Y(k;!v{-AC#8OL%|3$;s zdouaLq%o$_2G@Ob7EoIjB?!0}UtQfpO0M84@_Q?UpZk3gxf#&F;!JNFJ%985-Mc?L zkXYZHH4dq$+Bj}|&EHSYn&;;&{9ELrgD|{2Rio#ZJ#BjUnbkN%B8X?!U)pd4pKa2(tehOU;23-_H5gzUhT-#p-F^N!3 zldcDsKCpB)hj^3-=`+;u-tF&uA5PAGZJeFFKRytnq6lqWvQ#=ZLrlyO3gdVT4fs(X zQ#cQ=J?M4OJ{BqNd(=iDuFz26K_B6*_M#V%XxrN~XO0V55?gy5B{l>aXxbxaDkle~ zksf}BC$VwfE}>7Ti~)ZlS>>zf@95G8|LtuwipD{ir69};3`2qZ#yvR7tK=Y8$S;j^ zy>>e65_*HXr>*4Dn+p2r4eyy5rtLG~48NQre}5n1lR?1fZh%)UApsI#9Wx?QiL3}A zQV?q$>O&jg4K!8)z7k)UPkY??SL+}qeD7_eb@=|QsincoEWHc(-9w)-L5y$kKeYYV zs0L20An?q17$nuH9E65aZxmq6kra4>&Tp738&Vb#(j9^)p{4Hd5bYixelPGk(DL+N z1T=0VuNi<{BZ)fC;^>nJ4{2f8K$h|NmbD5zBS35P9DMF+)bFq}#*Osuv6u((_OAzb zG-|y+glO}`3<$9KoP?lfZpQHrfFS|+p`~sRckuQWbRp`R*6BaDR%@$ke-W;N|E~YV zo%?yPIl%5~E&ST~&xB5F6_@jf#m8P9yH&o-@EPhK2_UyG;0> zU~pN&``ZBOjsj{6#Z!+$$NfI#;!EVBh%j=J!OW-QA~6l&)WX90Nl*k&0&7tHN7o|! z5vV`}^dsO%x+{{PlO{o>2_;Z)51f3|xrVm2-37PQ)&e9Fnjzy;_f<@$K?r%(03eAK zNW=b-@2oI@Td>yn6?G#d6zC2RC9$r?>$ z3(q@j9XIhldgFH@jEiXS5qFpLdF7uiz!>Q|q^$m*+Rr~%H@2V_X2GLzAI}xW0D%}@ z^#{NvyJJAFKN5@gIUZ4pOi1^;e}TlwSNrxh%W#@x*}MN@qA6QWqNsDz;oCE5X0Oca z@6pZEGn$}1@L;R8Bl1y)k}8TIKE%C$Ni_wn@sE?%aVc%Q6-)*DSoQ<$tXH;<9taON z^!xALZ_P8HHX@(tWfGz!Au#`Hj8|T5<7FHSUsmhe5Nn18q`~VeB57$LR4Zhi830{% zAfYlQERyPiNSlH)BEHK8eis-I6GDl-s~;22c!|#o;|K(}ToWaOj$GsYwE(*4qTx{B z`4de$g=_}5x2a6?moX8Z7hi=0r5t~J`vQUJ{9OwjwNB45D-wJvC$(x{Ib$K~rozXU zg&9oH8d_dcaxCu@UJv<~gFt=J&P}{V7yvdew4$VTJV8evnrFYBd${l}K3jakJa)}F zVf%w_@WGFw5dV!!zgqn?)pUiB4`Jfj68M-AH{#3)@ng%&mm*aw-^8CRE1i;)N-AN; zL5={w2Z~Bu?UqWQBqe;8NW`iznGY}Q6qV60C}rhWuP5F@g)NnG$Jb9g?V6LfskTz@LPW94*Ph6xgmq75Xs#J!;yZ# zYyQvs)D#3t0ZVE$seTc+Y;Tntw|8(yMb2CL(u8Q0J!Wn5_8GdYuqbfvo}sG>>J9o= za0m5ST)Kho?rH}S?Trl-5h;0s=W!q2<9Ver<}mDhWM|R{4e)N%8~C^^1na*WtPHO~ zk`yPsNeAQ@i#`eq3UFyW;A)wSjog%B=9!(D$TB&Py)5VUq~-q|_Fm4U4Pf$H8yhbE z4-e-5o7H-)y0*Dl|68@Tv4yt*v@w&`GoJ69|7Xm95a9(qW%{SA{U2}pTYCN{{B^Uo z*#GD87#rEq>7my=Yv9chb3w0lynp!qpm|_yW{yI7=BGw4_!tNG=-oIP4Q>bb~|#d+BY~+W$*l6^rHU zUEX!=H^xvT#`|f|?*xz-(p}0QfASbK*m*Mw_I(cy@foFh{>?=fm!wz98HMS^_sg63 zw&QVmg57T?a zUUqMZ-M10Ul2?q72$px1RF=vt?egC3ZEusC37Jv?zYx~~!(s1!7xA(c(!~n2jmuN( zB)xx!jiWaQ4e$K@>FEhRJg-$qM=B)?gmQTat^*U}gDASZB9^khd`Ze)4qo!uZ1KB! zGWP$Ing^;5&N3!zBkTNMUrXeF++17i|8sdP`#+xZ^VUC`-rElcSyF(r=t34yWdUOq zJ(fgJWMh7Yg-HcKaa=4|M!1soaJHu_HsJsZ^E6`aTr{H^&_ySZ=d0x55`d^NN{h+le>

    EXb@$c!|;GSum@u&C0$@| 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%0A?mPyKcMvOH4?cTh$C4-X;O>X} z0Lo%fV>P!G|2Q)Y9{J49reZwO5jJFMt28dOxDCaAcRfZ^`~6Z5pe%W}CfnnA-QC%9 zI0YC!gWqZ*hMB>e=TL3nE^R;Gw_mt?v@C}D9jH@q%Q8nN^O?&A)f?R)-}lc7()Kl% zb~RrX8{AtKXYtA=8=nQ;y5JooL$Jza&POxd-50-D#Os<|0%M#{Ctf!PFnmj<_dk=3 zpr>@iy`kfonaPg26A;mvY;LENJapls_5HH#^*?nWA3CDud#$nRZOOJvvnqKI9HKp~ zi~%n}K{|#>dP^8MqLENWT0i|u^5_c!gUi*QywO4Sq)*;z+m|VQn_*9{uRWVJNT6

    (f0-*1Rtigl(%dbekd=&6Y@E;AU0~RegW)}de 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𝔤LbW=Hui^Q8 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 z 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 ~_ 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%0Abtl6{U#A7!%8IahiwmDH_QLsB<4 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 LWXnIc09elefeH#9 literal 0 HcmV?d00001 diff --git a/tools/archive/rapidxml.tar.gz b/tools/archive/rapidxml.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cd55cf0fb6fd3cd184426d213ab5746aa868f26b GIT binary patch literal 23977 zcmV(&K;ge1iwFo|%~4PQ19D+-X=He9Y%X+Rascgp{Z|`DvS@yNKF9w<+qu^kvA{@R zumO`p0B<?@qfsFf%(=13B`)2fVe>Cj$$K7zId@$Mg zFXDInd_VrT@Dz=|d~q7V_aKXtbm3w&nyw8T;Faa&qVcD9tyX(+X}P_;@&dlMTdkF) zZ`k5&yXt@b=Hvfu)Ejog9y{7P+}ru*ySJx%C%Z>mCkIEzr#~JZp6=~$zkR>6yYukD zw@@k?hSdchK6w6|ZO5alBs#yySYvyRwPF05_}^FTU66F5A^V@8AHl!rr-+LG6eejD z4_RxWwL~wD!p{-C`LCTI3s0g!xJLD#FTQx*T4IZ>wdIwy)++liEd7Z6+Kc)j^Ybh_ zxrkCm1v>FC3!qh1lBtr2_qT%i*<<+~>p#X%!(b4mqoAW3dHCRW{J`Kr4E6*d7WY`^ zBI$}DrGH{xCq2L1y6ed}N zw?DUTe@wz`oDA7_{Ofu_XT>+2k5f)trSIRKOzKsDW(8T$sCsB$9 zO{He6oM8ouc~*!#s)b0Ao_6$(4aL;h1nJvw2ny%n16==C`G2PO`sk_&Mye<+%k$&}hKqNBA}94`LuL5H(J5F&VNfX2It; z>axoyyI>vY0t_qBl4vd05M5{t*A+lo*n zwYJ=9ug-CbY*+TrCeh3uJ}D%79Bv&Q@1E`+9UUCW6%g`~kBxT!xxIUMvUjk5JV#>Q zox298#^ptjHQD6_n9XzScRou_!z6(f#079|KTND5>(ZcEgkS$G@rZJEdc=Od2!}wn zPB;=XAqmxdVrN$ze;j>(2bxTS%4l|rIYsmj`UnMBWEf{r?}|^);4B_zP&j1NjRkXg z%IEG`D9MHxU`ecK6x=vVHt|QlIkDRAfP#oKp}rSTY(%hji^H@@(11n8{fzf@JQPip zg5P4FLy$EoNfSX6YH2|7v>(TxKp=gB=>TJ~W277#nfH{HJ*kgQ!py<=D!^i8MsxU0THgm?OKaGAo zw>$DHARY`j%pb>tUV!L9m?q=bn7L~br>rSDeiQ}Nos<553L|_up(Ad35Ml7%-97E^1K>k4gt_k zgYz&C0($0w5vavCyZ{BlXAtTQ&=_evPJjX#*tt~$@1LT3J>F@QRfasXDFBqg37yq1jR&cAL53mnk!y(AuhJp-zJ)1D(6&*>#EzF_(djb5z@ z|6p!@8A~z8kEmZsthRBsC*w{gKy$t^96rX(t0P+FgRU={4EP`CTa&&am%BBKoNtKf zKSIFqqEuR%l2S=au?jT=2NUA=y?HGMA)flw@PDkX#Z-?-%Ex5=V(z3uCRK z#kcC_sFqZ}2u7n&>s~da7c9Mq$NesHDRw4Bzbyy?LK|&M>8$R?oiQ20sCUuk?~XfY zad-$&K+1mH2~0VpW@Hz*GQl}zB1|&V!neptjt}(XJ1GpyU5o;+BqY2**Jh`%NXRx2 z!e&D-+gzEa0jGujY>skn#5m6jpqAgk@;c1kRz5`63@(YpF21v(JwDkw+1oxnJUD>g z_x|6mlsxPhs^EyHxQOe3+8M-PjGe*IeZtrL@6!=LSMrPPIQrQIE`>H1(m2kx`0lZ* zcnsPHc`Ifyn12Z_Cy_k>=>Y6UzD=Q9+>crJ3Us-~5X8CQE^cd%!UWnJaFJ_Z4LT`{ z`cC&qqhElQ(26f-bmThKSXpM@vDRXHdCnZj9I1DH+249sN^7SplMy=ye)iPf>d^#7 z;lRnpF*K>xRGpx2DPN+3$VuWa(Euh*|BA0!kR@q=#DL`nsEGdge%2j;t+#vs*nhXX zf1*0{&gB{SH98-nbSoyb0y8TDqg@(xF1QI9a>~G{3vq6c9~6*>%K---Pt!Da7SX%H zg{d%p&O+WfzBr^YaE6y`4QZ&L;dmL+u4S8mfvoR`ARk$)$zs4Wxr{*Zn=^`GByD2bbuK>V_cx6HWyFF|QYd{Ui6>)@zh=eaxkWr7m1I ztt8ZXyF+--k%L8QnvtPMKnXWU_TLj^^w*iz<0Fi$qg8S;r0PO$Tp2WsN%dy6i$S++X@xLrd+rk8?b=8y|Z<) zbxpwWAWtVI-qr#w%le=j)1hgQL%*#WRS1mVi>#ISHec)m z7oX80m}~>mC7cK-32}uENc^F;6HAxJ$6;v6VS$_>C*?YrjB`+^Oks~CIpu+HCv6 z^Dh~BU8Ru$b~Ye~oCg$s$qLeK*g``DbT>yyP)u|4%j*r2Snd?@vHbjXu<$4{&GW@6DFfD3)TNo;kIBNr zh;Z^SnKtcSkLZzxKqZP;2Y~3TGb`ctVv>N>_E}hvUayTMH*{@HbBWL$rMg7#R3Lv! z$a6_M2A&wRv3Z8S>3bw z%dM`vZ*pM|PmPXqalW`d@hTPL(!ya%UU!p{$(V=f8LK4>GGoX9V43kk%JMRIxsmqR z4pgo?x;#oOOX9xR@po5uZg;U$wYdS7j{{)gf7=W}kqVLaQ7HFB(~g1=t59N$JM6p= zU37WkrNt9$J06VUF^qPFf%J*o;uhl0ooeLuxeTtr z*8UB5yn%TZk+R$sfy`!7N(6mSWY-nLr}3jlT-k4g(;M@^7(? zXp_KE&_%Q!GhGqUYwjoUEIC85_7Pl zV~E`qw#$SxelpGw){DI$Mc>DW`&k#*kMU*rIZT=;CWMoWXcME=$+-m?6~hh8aKdrl zpvy)dh8~Rv?LsHqxXe^LU}uge2IUO;o?tdn`0iM2?VJT^xVDA>PjNd8$cte07k(;F zeA1!QxM&VJY!Uj!c}ctV!(lhwcn-+gs4M@2iK+HOcxo6D#;l{ItXt=~MXzhfxFPV8 z&|{xbyp?%${wVWJOvZ6pSSBU+02cr)a| zD6Q8;{(?Wei{n3hi?Ki4MaUmz_VJBv6769Kzz`&xY3luoW*m#eC;ndVncMGww?oC) zF>#96B9QxD7)w1K!7>F{oCg$WU2oMkqQwKXGft)=%1{89;1OH~mft5j+He+fvpeED z1R`vNIA{!4DJzFM=b1Sps$e)+AaCu*RSB#eU(K?~Dh7D!g<7X`#sj*2Lpp8o$IUjr;-_#YNeJc2< zCcU5~eA*beno!XyRBhi@v+W6b+l|L(vf1>y?M~3$Yqi^r&ZErbcaw#7sKBIP z$D%g1lcSv$u}7_x6na5siWlVi3UIM4&+W;qV;Su)?w? ztI8v2Jwdk7u#c9faoi5qDJcwq2=~Sq+EH;_vo6HXM4Km^@d3dLeQMy>Ic9&t=h-v+ zP&7XJv^1M%g(s%Pq8OEp+!95~(V`Ws#)*1Qhn_nen%V7E(;^K1(`p)B9<}oY;1vf4 zgL?`qa6G5+xgf@!Q0TD+0mie@1Yj;tCP9)OSP$WPzJ6g_p7!uTLK*#p6$Xx6i#_9A zT*u!xaN)5I1B6t7|N799?E|F{`|k=1RrKLc`%ite=ob56SsELQn`>+KbmsG($CX>t zeiOSt_YnzjEg0>&k29g3oIc6eIa_c1L#8Lt2CdJVvUf#9F2<9(YZl`u3@tF+$Vp=x zWEft`jgFz2Z$~fNFxCYv%+wQit%GaLbCN^8Cxt_j^2NMb4@;*McQES%JCu*6e`PL? zln+7#qsXcfaYA|!4EgGbqG`xQP3HY`$KPO{r9xm7%Qx)A<0LrO7?~lubP`)^VAy9l zVikx@B;}P%%=cs5kn3OZFlBV5a`y^tut}0}chi9TLh&ztP6@_C9!`>;Q4@C<8}7W} zp1OY23$tjTV}i0s1}%sBBaWMjV%4z3N?n{Az3L$nVqAf&Ko<(QGAiU3pWEoKl++OE z>2N62Dn!9G2G(HQdj*K)omYHnT*4xbB2m<#VPj0Zp=PFomJfI@34u6r z%oXbM^UUa+I-`N5DZo6&Ff@ug>-59GK6xjPHk*STi}RI|rj(cfogwj6)yc(7MJk%d z>cun+jObQ#{xpSKl@_!bm^mV1VqRXvY3OjWbhim^Mjxl-;8I-a2+sf*i!atWg$vK4 zNTQ!zi3DR@e~>)UXD#yc`+dcE7<8Lf9k%J(8|`$?y$m9anM4XebX8ITae71@exZ)w z!3d}KxzixB`{=PZ+~G_~{#NPvALqo3iSl zhQ(0so(cCh3#Wf7g|u^oh0!u4q4UT|2Yn_Tur|WduAC@o8l0tZf6Pw~#Upv3D?m}9 z1u9tp#&}0GzqLbF?L+DK2R#`GjNI%bQ$35$$MHCIk6;-XAIKvxP##zf#6*;)C`FOy z|1}@r08bQ!aT2#uY?Etr2HVe(9lOoVPym`ImH=_rMDYD9rb6p?_3s7*Zf zbZ!-Hm5|K841-TK1x2&=l+qKVm`N<5CeQ zfouxDpwL7@ZTZfBQH4ToFs05~NHlsB(sExy7*hk2^hUZ*o2MO>i> z(Pf^OREAH684>_5Zhkn65jA8*60*+0sg0na4IN z+_s8G+yFphCB?OF>h5gf=6~i=Zjbx0OdShCF{Jg{P}p5T2gFR=<(si~-W)Q|c+wCf zvBFu<*VmUFt8zuWEB%6rf|>Pb7@BcPR>_;=0lpe{t85DIw^%RgXk|+ zI*-4EIk#wh!+?xnPymb%*H3cL>VY$lq3Y+2#sF2(9Wk-W5{mmYlTJH&4fS-dovO7{ ziLy~+Fhh+~3iDp=m}*CnYEs?fq}ug3OlPc5^z+wg7OT@<_2QDn$Xe|x8ms7y>lrg$ z`L&ge57=LzaSSwOqIUf7>gk@!#M!O_qKJSXNdj_so=2b2fvV$}f75XEzBu2U!HF89kt>DM~F^0YI%RpqHhADjsDvuqG z4WS-oj=U#^5O|C6=J6csI8~@AAlqWoDI=rz)cFTuB`3GtB)UR#>?Fzpg}uAQrPY8y zIVZfU#kNSqD**iQ2jlZybcO9kbP7Ry#w4Q%5k0eKadt76r%qm6aU5QI#gD*Gy7ku9 zWKaxmaE?7=Ek|x(cX^B~R5W+`c@{da-eKR#+)3LPb2)`WNb>gb7*hO$Nz#Y{_2Hil zf{9@dQGsCPXnu%3BBs;;{O*s!;YG`Y-ZpNn;dX>tUJ)Z=_KAxqOmLgv%Dpbm-plv9 zxvU~SH$O>}fsQh8!ML&g>ZBwhO!6?iqL(Q!K1wj@;=c%a8Gigp9aV7PAMvrK4vQ@# zLyjA>5~X<>lABoN;%PcwuV^TOXDKEOX@^@E;s7k)I!{88;f1FPr%p)zcakcZhk3?n z*czFgZB_a>}j{p+Psu7Y?-<*-A;YIH|UfU{4Yz6#+eZ|US#hok9MLdS}C?f z|F7p(At2nR!bO(-nfJTtyj63&M0jCNAQ&%XE^nvs!P(6}R+~(`-27$&-2NFwh+$r) zx%*HGYS7dxEli2Yc(27DIhj-$s-@wX#x~J74>?CQ5+=?<+?7ilS29c`MEYY+YDoUK zIBS!?EQZ(T7ND%a|1uz$$8}0DEf#8a1(Mbd^HJ5;szvh(#dQu?{6qUy@UMHppEppD z_l`2db_Hu2T#jIJBvHtDRyR2W&1-n5yZpa6*ziyOvZQJxbz#pcQvem?%l}e?r9X<1 zvP#I&%MafKx-ATnG#BV2Ki|kM&(=`ZjCHo3qD>zWjUsn_&cfWr4=sPiwoakE5>dK? z)3fj#RM8{6gGrb$Vo6&mqIkAkbz2h$^g5rDR~!Z*iwF!M+2-7wan%#O@yIC@na0Lm zfpueU{YmH(trKO?2pbe)GEf~XMcQ2?SMD|*WAljgM>ab7V z77~m))8zDVKjCO_T6m+uCvO6GTqg#0-xmm6+mjH?oznbACy&&pi zNC^gZi9FUJH}+|@+O!)l{HYg*Bf9iIiS&K4ujEsEy9wT4nKzm1+sK*bUTBltx`XXKPv_XB&zvnJ7 zIn)hzVP!d1cYxTv1NueCLFL81#H>p)Et8UKS_%{I%a%Ab|CH> zjDSG(+sj?5r+e@kh*kHdHF5Ng3+lpd`{cdZf~9nc+Fbe-0@Nbap0u1Tz_!$B9g5LI-PkOqCdx#ipU~C`AMccuU*m z6r9v=LbFY{IxFiaZkgi9f51+nJ4oC%=J)3Mt+PjR2gGKGV!v?{uZBX=m$Ph|OddH# z#LTekK!kX6@3nGS`;9s86+@5d;D`*?eB6Y!{JKtCUP4hZaHe~YPnOL_O+jMoUhNH> zWPWWcXR-|X73$b0qK(Bk7nmqtd@EX!I4c}dN;fec{ji4~an>0pl;>7#TF6<+H`;a7 zq{$1SVJ>pnCYQ<83kj=#>axL+y!-;BL_j9&S#*9b53LkOy!w2*2B{IO+(Rq|Qm_=! zl{efmGas`J^33Lod8y!+qHYhka5BJya^tESoz#ss`_7lKf1b7RvqDYz)!SN2q?-EZ zo{ST5W@?SH`Qd7Vx6@RA2OYX3N6+D+Wg=*l)BKJs>KWY~pO`JA6|9@aBgKo9cEH)_ zDO|B)c{w>WUcT1l(iNIH6~C7*a1pc*j;`;nc}d+=uQ@fE-eTN7qK-XtSi)PLn@Yx* zJTtf|Cn*HQ3uO=s&M{P+D{8-Vz^6zonPvX;NU8TDN&%>%apnGOnIM!Tu_V$o`yKL1 zAU;HHm;4W9>If3jH$Y>3gpKlQ0N0wLHQ&?-J!~}}Iu4H0lw!8=l!q(2^YH0}Y<>6# zLp-7ZP4w|U!Dp~tNFCQ`%rUt?6dq^zC|5nucgD)=UentS^>P<}4cdU8A&E zj8fs9!w7iYqOlw_R#xS-!vXQEP|F*e`8@^Jv0Th7j2WrSEHpn*A_6)Gfnwa+$Fuyx z`aWPf4iygurhj71I5Q$Www7~NIc}|FSOMP{1E39=9;Wo12R{tU3)VW@A(L?NcPfpJ zbt@h|rjudDgcrnDMn>(8Jsu^Tv~7!bTu+kHwcmAmc?eI*og$c6y5P$z&)=Qra?aH=cx! z6mp3gHIa>kwro=So@>wfz)Xt`zEO*y^v)zLefYMe+EO&^EH|K)Ebt^8;gRgK2s1~? z**zACXhsQoj{7p{h?TZPXWPn6hLD9p8u9bebV@qtTtwmLP@HG?XLO;|!$pZ)gy@*J zTe7>C2cj#gyCa?G(|ibme^{+U6Zz=V6yu%fT2RAtOO}-!f0;5jpHg=rFOA89(1E13 zL{@vCLLe6$py=YpiWMyDv^(bt7xz4iF@;jRWo~EUzL*iiCIww-#pS1>l{onBUf)F7 zhS1%H0dG9Rw;Su>5RSK1-@PpChSyv+nh~tNQvjxMk@If)qZ{&~skT_6Brk=sNiA3T zEt?J$FBb+L!=T2aH%I+r7BI7x%Li_nf)v$@?gqQrdH4 z_qN5ozvFv73}!d4Lkx^KPa?Uz8cEz-8wn=W_b?jQFiJqas~B?)m)&Y;Tx4k7aM&c) z5}EVpdVumf7OSsU^j%}@h)Uj@oZy+ElJwg2Gt-hT!->`=(UbCsV@^?ekCj<#hnlL= zBiC<6SGv@wqb%hS-RZTZcMPiZrF9Z8uQ54{5|w!~E3>1puM-bddMJ@r+@)H5K1AodRCgg93VT)Tzb~)u622Nf2>%Xk$c6-fdrkWx~7A}Tzk_V4w*yJAyJ5hE=;WR z8h&d${dMtaL0HohELAkr*djMii}z@7P3?L*7rAqW%oZ0KaaSQYjN{9>eIz*ND1()7 zSsT&o4!pO@;biy=F#>jsm)E!2Y!BS^)7fP6}$du=njGd=lyx>O{zX)=P9fS-t?<>$7nHW@r@h`%It!h~b zLL1Q#W?-bkq~&&txqqe2Vt#QiY11YhPjnH2-e`o$k|1lAA76#KQB227&FifwI~Q)& zsXK9W%O@A(R2;UYvSba7Fv&PwupxJ#WxTj);p%(=8eGLjoG4j)Cr&l7CU)Qy^)^&) zZtJRxUJ_x1f`%Y@Z{3uz-t=rYBkU*H#k10&1yV?wqs_0iG7M{^t-B1`7AXUT;peO) zf)TD-k_b&jD;F@#G9#a_ahy`-B`(VPP#~l4o-S2gC7*I+P5nq&?$v76SV5WBsn8^H z^Nn~FuL{DsC*TeK`vpQ_pD8zL9_(^K(2zJ$}zZl*T;EE)<+s1=q=MWxq2k z@LeV4q9H$0`F$A$)4fNRDS9S0t}5wcc|IH!wpX4HrzDk)=aLAV-3hE-YKVqulE)OJ zI>5)ot-uTE5d&rCMrBqUunvJ#y2Lv3{VGn6isUSAoswG{G_vyg4mWqrT+>Zwqr#D# z963$*&W`Hq7<^e_oFdl|Zd}$&1DiG=ZOYWz(8m+Ge}(X~+r1Zj{}F=EIo^FQ^!!54 zCR073XViKl25FY*^F%3}SPQ(|AGj{J-w~hOwMRjYQ z$Tt;vYPe*~)XgGWkP0j7>N_pOV#>*Jmfx$I+`+_sZ|D#hUNuc8(@l7obYgU`m&qZ{ zj2%q0rBTDT^i_F`h;e4_Eb?wX+c#HDl8;>C?b(cQl2&`d(uwsw-zb;A&W+m+3&m2?Z))RM z{5_E*RxqS2wqDFo8cY0dNFH0nsuIc8mcoCoIJUZZFN(ivQEV-5@5S&fieZ!TRbtpI z`?nOs7P0F2N%j7=K0Z(#sZ%W-s{?i1_U}dH-4T(~N9wqnVt->#YH6sBL#O*#ohdx7 zwQk4LZr8s~)H%)HOS=CANk=}YdqGzv=xj3G2V!4G&QVyRP0+iY5UMQNq$H#Vk8|tN zbZVO-2MVKka;M~}&};Tr#GY{K$Sev(9lPgvM;it21tR&q+zs@k_ZacAq1d^>lov5x zFi1DC=)ePhp)1~F8h(jVo+ednfKVhN-p1CY+ytW-xf=y<(D~#a65i6j7z=@cJ09XS z-x~64WK`ZJ8{)|4 zxfkpJBQ}=bPsu$mbWsgAitzo!$ZP{|4v8yu@n5d zStA%ge+l@ziGKhT*0le#WOg6X zowfP+QO`|$zCaU9N9Nm?no$%M%_?!Nu35io&RBZIp+=2xziQjT9a7JP@s{&2y0=^n zP2yif*_y(wlV_Jw(Jz_92skQB_WqZ%hz{Gj5e_M`GOW=q*%kN5Cy!#EL@HHCnW>iH z4!h5Yg|t@Z^i(&V@-u6?ilfGjTgYYPCEd?XCP4uk6zSherr>RYdYnwtmhsXgs?#Ir zDpjY!K*bP^c`=O=t*g{jxf01}!K;vXb(OR(=VM8H>S(|~8mHp?Oyg|Kug}$~eC7%m z&baZtki|SZzG8;imyz=bNb8JAr3z6i^P>Kj%;_9G97m1i=XXw9$|~~0Sygn)tW@Dk z(az*DuWIGo)s3UcYj{7^NuI*>XYmc{p2<+MHRavnDi*LM&R^3tJcGq)InE^xmMIX* zyKjrD+7u|UV9QB0f%E11++6Bc`I>n-N7mdfMm3vw`Rm3wxs(w!iuL)??{&F3PA;8_ z6^DsH8eW>I=kB!bnyKb|&ay1qKFljz zUHUpMnws#gIk#rwdF^BUyc>{QFG0%g~G(Ec0=*_V~iE( zQvZ$trrr|XRCu0s{6yhM`3Y7(5NR^AtCsqzxm?dFDHo2Pxr){ZHRG^q`;ERfK6D~n zZh;L;&8!?3mWGK;CRS&%9H^AZ6M3Dk$Hz6?Pr3neK^5EoIR})rcBphhRT~jgOOC?thY7Hq}-w>IdU&=7n^KnJ4CrTHtl+wFDKnig*zQ#R;h@mFmrBb*vI5dqbn;wRApx3@sjG&=O^YIpmD?i zPrCZ?bz#|?@7)fjR2qbXGZj(l^iU>4OJjXmleiQr1<}}#FL^BO`~98WH+%cLJL38r zlpGxpZFp%t-7BSQ;lgs!lEnP}8M;I2w{et+3~7VlOEee{FasL=IS7UwSh0a#k21=t zb(tF1>7byF2Y4&g5SFPyKl-=IEN3+|9)d*?cArBVU|tB{9sX-28^xb3+>Fi$42TR@3bTrgxUGWk-P{+PqPU zCAKXj)(_Eg!xcU?s#~-gY#Mii!7o>;H|Ife7M$DLI!g=8a_=Kf*8V{mM&dA6b%VM| z9W^PEaWVgcgJ}d}f?Vrg23ILZB|n2@8c8!bj04V$w$5i|veHM^Ys<)tP|{XD$%@q! zh1u&HV6D8B*7iXCRGPWd9RBWG3xLU}kZaP7tM*f&vc)>Y&_D_)Vh)mha=K`ce3?!s zN3bgCsfm|;l&}adH{t1QaN=0qeBM(Tw`A%n9#9GBbnGOk@M|1rQfciRyki#;sNAG; zab@KqrLNG$Ucpc+VG205vOLNpry>WYxU2@%l96@uy}UHex$XLFjMFtBG%~zhk=7*n zo5!$|l>F1Wf(#+&pvu&eshJd%?`Q_*$&XYgLe+Qe09DL1bWMXGI>D=RACEx{GYM-f z5)g876Y-o26!~3x)|HA;mWKTv*XKRD>Mux5`rlk4Q;C9=%v8>!rhIAi)k<=z+0L8j z)JikTbByNMR!&}>^U$`3*DRD8cEFz3&d+b{BD17k?h*&EV9esAD-QUdgO(rCEr;&q zq=&ddl^5cv+b{Xy2%chB8(}caLpt@9zbSEes z>58SOH(X8jn2)Wg|!WFIU^JqBC-%I!o@5jWGOx#kZEU8g$ z>}&OCM@~bmuKE@=!K##OAMMk1EBN*j9RQ-dc^o@;`b zH10a>fN`2g;bur3M=+4Mq*;bNmrbuL@(D%77g?ChG#uixrU#OQQ;gIdRmMEnh3sv# zu7nMydVYh`#vmk*c_3+x$K?>cN(T@Xa+byRU$hiOVzSOSAq6Zs%`V5YDdfXd)+>sc zzJw}7NV>2e4&KSs*LDd$!Or5r1}9Cu-f^J*yk;U{YpdD^3V@D3MI)>MT^ZqC4#MgK z&}^LXo5qz*>*6M=?u2;1swof@3|)@fCd?58h13@}s*ZA0fiF3b5Sj( z#0gk^zPBI8pT?up46jp2Hx@V58;#NjGl#U*^kxIv{8-{~UUxi~f+jS%`HA&Hl92UD zhluYAMHEJ}Cy4e0R8U0~yj!HP(V9JdNDJvH*f`wY**e*p%aI4m-5H`FGPgzwVS`H( zRyedVp93zDojaTjT7mhF7s_9zcZzHVUS9)PjTGYkji>L^G2RkrwT*PrWAXWW?5ez_r|IYeHK45qms)#M)CJrm}75@s|l_ z!p|^yV9^?W2|LgRtX?pJfsDw@AQ@7^ym-jA<3SjV?+Sb2l=x5JG3v>kWwdFryM1os z5znj>cLi?5V@=_Yh0DxAdKcnzblaqH%a!6-z%D|sCc-^(M{ zE4&%9_KOu-sgB75M}gwptA~?FZLEHuZ-`8##gCYFvV>_0*72mzpS@jiJCo+)$8*K5*%f&fSxdqE@m|Vs6pw0g?)83a+z(WN|3AY2-1KiY~8vj-W z{=Bh21ht;PzdyX0Tjxx)x%rx{tY3#R1bBO~ia>2Yfvk4()M+g)E~*h;nwmoG8>7%2 zp#5$o?U$yby&^u)etBxzFWnf0{-a0rP35RAPatxbkgv3--{kxI9r9F;N2tzmroDlO zM?7J)6YT-9_rs{;b)pxzp8dYsh_}mz;{hnKjWXWsrO zb~ca9zH%Q^4#G*QSp^tQ$+mHxGk@zwAJ`d0}v1G2D}LM;AW# z!UUy8$}isJnJ!IS8czbSbJp3D0J^}Q{03$+{L{z(oa2AKU07IHpL1I6#KSITHpES8 z?dg>gin@Ux`*_x^zz1A7@b=$_<0LF)1{`1Hg;OxWPQx!F{6{r+3jI&(a0$-Po+Mh9 z1jCeP+iO~$Y~E|WlVrSyWx!y7w7`wcD8+?Bmj_`$4`C)FdNs^h-ukK0I>x2v+3-=W zYBInW%+T;&V@P{-O+?(RRBcSt2A&?Pik&-o8+Lx;IkF`;7#P@-Mg!ac$0o&$;T!s9 zu1F#|t(`+>FVDi1bCH9sw^5V&`Ees=OFDjGf*)~*3AIepsV8ZmU=6AlaVPdZ91_3f zsfZ8qS)N@yoHoH0CoYe~;U9CggZus=M*I3}AtumSQo?)<{-kgTUeGW;DM+!-1qapo zSh6AdyKgJl=zRdBQdA2f8$6v`^U&9PWDnb_hl8hdvIJi)sh1=Da#_7xFQkRh zpR&*RNahp7E$Nngo;|}VH3}lngW2<}C95EpuoF-%s)R-W@O*28pwZ}BOl`(z%w;0m%S_67M&46aU0iF3U zZQjT*`POvqbDP7|uQg2lyE{x9e~V$F^${$IV9_$hjKYq;JcpVbxNoN!xG%F9qrBg} z;B>P4h!I#42U2KN`{dg%)fEc@3a7;1>H|61yU}@+S+@-oZrV`M(v4xV$$k4Yz6Xa$ zwEh}BM{jC$Q9hEt>Xa3uME`upS}W`s?{v-T&z|L1B)+F&M&RS$*O76GIG3AzFGn3B z8k=zkctCNSjmFuvre<-(qI_;)9<=Rwa6b)heHtwO&8GpyDw98=t_sJe4i%~=7(Nx@ z!RwEkI9IBy07F}ss@mgt5N33#QaN_ruosN`*;;w4=u^!eMuZny?d2gifI|?_D-vv~|UpS5X$Hstre{$uE-9b+HZ;4B+0wsJ* z!;^vGDeX#uGR{8BBMlP}zZV1Kv&8>R3VrU6bYh*$c^IoD;UI{Hj`JL=rp0xI?wFir zc7I9?({h{H&$eDR-H%PjpxW_*=~WVRLF4!A8H^xy=Gn8{)XKF+M|8y9xR=2H4)2SN znS7^(Q(CM#^tYS1&c_6(qv~-QTIWM`F{?t!!JnE(qVQNy&Fzo(CvWCoIzcM504X*R z#IEWbSNgke{M!{(09q2j4?j!?psfJ7W`{>!=zV$B^J6fG*f{IWzhpqJ9M>7YdPav% z!iAkaFgAJQ8ynw$8T4UII9GG9oLkyy)abaX23mguOLA7+vyd|OrSb#p?hhChdHU=6 z$H4e54IZ$v5y;mN;!N(#KjMP>`=@i5;8Df_JW}qS`s#^#BpI_<+W9S)@le?=vJ*iT zlx&gXBaVF4QtLV*$0Xa+?>9Xs#EP$c%Z>at7$aF&OmUmXOwM>MPmYPx?fUGP$p_xu zvVwzuW=f@meZOhft91Y{*A$;>Cf>RgyRbevXPmt<579N5(=W5OzmIMokj1XSxD`h8 z_nQU$Rus)upxsm_OX3o=27AI)nT(RSJElbp=ezuIVZXh{lV^$OcrXkSXS|T- z_(!!x@1NAwLw^&)UJyB7G2Am6YVR? z$GG|&J0-xz>)e}Zc z7J+r8*xotVKKbQv_Zot_8+YiUvU-AghLbOg*`{~0amr3IeZ<)r94{lxj55}ERuUq5 z#LW^>0>8)+^Yp`0n0B3bjEg$7VNy)u!4v6;tG{7Z;y+J6J{1Qmh5@Ey3Hs-85@ij)zKE#v$>#-9+fE;z&UqYT z1**uK&EP{(HUr=~>J0OTj#W<(F??&gdm1iKt(W>2 z{FcXI-SdDxqhl1+Ul?|fQAJ|e!#y!8iZ(m)6Jr#K72yPvVieVy2~ezL5{x20cc5_m zlA*xC?tlSx9%hvLB3~3~L|HMsp~m=-E5*(iQY)2`%x#3VCR%VPsjF}=k-4L2eiK`0 z;D6LCr#9a z)JkcE;_I(>E%-?U!wLh;soRiyu}#d=EaKnkj7LgRAu-uQZfkPSo}VL2G!K=Tf%>6I zi;Q^_dZ=K4)nuFdAb&kgqkqHSAB&f%dAji0JZC_y>a{FF+vn|nYI(v((F|1N{VX(} z8{48Ve)Sj-MkYSQ-YOyXbd9Avp1P;22C=L^ll?HnY&AiG`6N35Pk)OkiWQJSbbgWX z-1%pyLt>CDm#_-Y;PQ$XWt9E)-905}t@tWBf`{bqH*<)`CTEi`fXz9`>`wq&k z=P{ouhy|N{&C1UQZm9fO&4T1cj_r`^sy`lS`nGjys_MP56Bs}|6BhNIfD)jY%>0{% zFkbyIAb%94e(r;{+r8pE!?Put=QwfLxHj`_eU9Z_|#6)Sxgim zHTdkqjJ&>-j7YCuJTB@|dC-yS>kN8W!#84#8lIF-GfW}f4||zf7$82%@&Xl(DuCZp zCerF_H9^Vu4SUg8RnFxa7fVC(mSEoE`~tDSsH40e#y0&I@SlmKiBiy4S7BC*U}2wP#(3T;AX>qZ*6%pZ z!fLHyPnqTYRLOO2LKoB2X1#|KDCZVN!WCF;-*L@SVwlUVqzml`s<5lXH5BHpK+=?Q zX<*t;uD`S-O0TG8yS%{M?YiHNq!fnN@I`gVTC44jqUOrYt1=N#du?LxP3LKZkAIo+ z(Ys9f_%{nmP=x&WakFr4nCaG>paee7^+FPA4OoT0=qASUtBN$BbnFGH)rmEz(u*CR z^6GfBqPy?#mni^zD)$y@bGVfJB-1VVDS!3IQK5Dn>Q5|A1(=!wRgAsA?R*omT*=sr zBHq!Ies|Se&g)+8ai7%NUc=K~;bk{5EtqSfNL^36UwC;u>}J#M?ICe)QFxu0PV++I z;>#^c<2lPlU5AE=H9okz zySoI3!9BRULvV*caEIUl5;PD94hcHA2KV3=U~qStA@jKRKDqVYSM^n$+O>Mu>fOCh z?>~L^IqSDzn+^tC5&9x0x;B?<_oDs~fuLA=!<6Qo%jmn{xycU=fA1laN$NIU+o|Dy zh`>9h32Ze%`NWnZ+t&sR`PStzQa|KbR!lVWZ=N`>li1WLRp=rEpo$|G)Us}zoSe%% z_JWFiQ^_Zm+y*=->0Ebv7NwcPM-WOK_T0T-SY@as?I#vG&g(LM#Jlt``^%$NSajuy z##KzJgrV&|9Y3ea)jbtJ+Y_isU7KD8Y1v@g?BW@$%)? zTq)C|vXAo$Urr%DVHi~sNj`yyy&=c80AiTAR8t8qNL!FjDu_5#Z=yd{1S3bChi`QL z%9wnP`sr6`38ZiWEfvt^Jwk{(wD$b#^^kUO%tMGZ>1VNquVewCU%#v!aHgZYd~kdplqbm|6YBnD7xS=1a;rlFwe*4;Irl1FXnJ@3yppfL&plx zU0s&K64ngLqMi}9Bdo%DF~*_PX@V}H7fGeZm2ZQZ{PLC3t<`CxnzHK9l&svCG=9K6>rloa`+WGS zLWL)@ZTj!)_Gujyd|I;+nNNLhHb2m<%2AbT3v0Naw@=0)r2xw%ey@d;qe1-H zZj>ES5wnMCAt+mP2i&#H^I>Rl2AQ98*?Ago_{oA1N7lbX%Mo(om&D=p3)!pQr^!$x zZI_MEqGQmDSH2Ia7tmpnWS^vGlqkF|pS5AtJ)(J1|D%#UEhI5^UFoJZ8b@JJ6`3Kt zJWrj*-G$o0{sjDC9j@6INa$k-I$Yz%>o42jYF8yMg8I#wEo%A{2}(Wn(nbo86CKyJ zbjo~*4)ko0=a~Hat=O^>B3yFCCXMd2>R`d3tW(4h=Ke-Jq8E8kGWBXlcufoMB!;F= zG0<8Ozc3Xt)6@+Ta75AYSNst&PMR5;+Y$NxE8kv5e;YgGISCz6;KIA#=W9bdWJo{& zT8#xNbG5WRwKU2)3E0v*0PXqC5Nfqm(PbPJ)@{uF;H8kvwfDwZRg+}6mD8Uf8N4zq z5+yiv@cs&Stb5+#7xH^aMV<4OkUEQ>?zU3>*m8AGGe*XMWZCQ6DS ztx6usy?K*6Ct;Ja8R$c*Uzc0DsIyaDXrJ1cQ~rt)?FUxrk*VWzUbtPFU$WV;`2rQ* zB#{x91&*2?Z!k20`H6bAjVne<<)^@N&*k16V8wxqrSpW}XvqFdJnEgq_o9F9n8v4z zq-}b3ju<}07xXAKGi2iAU4#XMJpS@3M}ZwI(Lsn%Rxo>ixSkYTS$WzoFPbf{jBcOl zU3SK*0_w$KUtbU&{$MJ$CR+kM@cugYX;Oq{|8XP>wdkEjht~8@t33uGOPgNaAVOUS zrm>-?{nHe2k4clqMcI#huD0ztft5KUEjJBFCo`n{c@s zG)^yi{kQ!&76KQ`?&?A8aD+ubQJtR8$ z(_RqGo&rN_6Irhh(zvzcPqSOBnk?`?11<_3+B?phf+zK`t}O&6vB6yqU#LdvEd|_+ zWj^Sy@lm)Ee0zR4oz-|=K4qN=*55H?n&%#NXcE|6k?S;MYD5gGS9JhfTYQ>8V9W!4 zn)!hx2H@~Eyh(fAq$1HpMJ22B)+9hPNiTWBveQxbJ3wH4OBlH6lD-nrxkUeuyA>SZ zGt4cM^u(sF-|eHc+L=RLW2DgduBlmL z(?zrL58}_nYr$OnuQ{67z2?|F@;XyOT>RT#_O4#LwW|*<#PC1sT0lcw!8jwYF~!p! zRvrGqo8)}`3T}-A1xm(acAEUoVfs8nxJwlX|>BnOlc!uI-A zu~lvrtN%0>iZPhdT6I`^tN$?B#p^n1;Y~z?_5WV2a>IwyFHrf_7FUW9)qArSwM+b*Ir(h1(MDV)Qkmx$|6;(tf_ zchdjw0c~8g?ilfF2sdFtkGC;_lbP2wlBwM3NrAMCAAOdabH1bek)tkjN@plGT47PR`-D zPEr47wB~f8BjlD~sn4R6J0a>eMIf&B!n^$mf8z)-M17ak-VPI10lEHHyBbzTT2;5 zXpnw-+7hN(;oWdqd|Z+1y>9h5FY0)VwoKD3{4e=0rGd9$>sSj(^V$eCO`d$@8e6~U zB{;^%FFk_&{D}S{J3p0dls_aTsa30~jc+xX@V?|&``2)WHlog1`5jTTh;+CUOWUfa zPc93W=5QGHc^Vnj z4%ri?c=#8W3lX)u;$s(gb~x_2mBnV$UNmP?|7_jr$`6I@yy0@;YRWzw(tZ>z5r#D* z(jPFAN4x03o_3NBYMEM=O-wC}U21>A`sZj7f^&n!r>mhRWY6)HGl)*wpKSEd=eHxD z)N_0i#c8yAz0Ms|?X8jSjYfz65@j;YaiT@ZBpS1O9RLeuSm>Myd|`iXAHhxmCmTO- zbMXfiCn8+iFBp2U1x($)cf#~IM{fO zcl#+PWRke2DbQw3iGmVthV*1!Qf9O*b95~N4EN{EY8Q`LU`VeMUu%6p;u7Ojgplc@ zX(+LK)j%+NQ2AF&7PVG3p=MBY-imE42GdUm`UmY19wH6N6XpD@cFu_;M(T!}Lmv?& z3-ZD^5nSkW;OiPR?_eanq|4-6nhRtRQpe!HNw}9EAFOM{ORZ^`kcr@8$;`FUx0?Eb z00JCEF$c2^qqi7VSLGFOXC&WuNSyC0rS@B6-glc`yq*$v%`M>EM%M~Z)u(ycPNWpA5@a-_yw`3+)AQP1vnJF1=^m9v=1+<~{pL7!)1Z&-!MinGPcGgkX3 zKUer@*Mz+@Uwlr=|eW5!NN zO7JP^n@H(gRRU~mNvP~W&C5&)&0l#d(Un9uCtz+;=CNxVq{$9=&vKr8(>j`|T>dKD zbG5;+SDY8POL}Kv@qMkh`zEwXN(Uw(`#VgDLQM6kssr_VT38)WC2I#!0Lx^*Lt?}G zp@~8;%7bX6a_zT6Dj5?SyKJp4V(Zjh+IS{=G+7qXlXxIj;t{=m^gNSe{Eoi_t8E)L z%uGSp;<%i2Dgf3Yq{Byf4s&j5~aI!EnX#>|C)_92B^6I_*pkO!Yg9mu2d`P zn#qv&i=5SFPX**16n$?p_|a26S?q3I6IA_jsn`KU*17wj^EAr_5?{&Po5%-u|Lm;T zHlF;tIbo?cQV6>EO|*VE#o;stJngSjeXF}w5 zc}LLGRhv$eUhbH6y7`6VgNE1lPPT|51MNPt;{1-g_D2q#tdzAur|E0@cct6I0a0e1 zu)8Du1pnq92l8QzBB>3inT>JEQMPNdi*^r#w4n=_vJqF zuL+Hv{$_2|FP#`o{zG`r;i#z2$00G_=k#ogb$gt(!pSbs_nTm|gzUAE1oK_H(G)D~ zffL)Z_MP0dXnF(A6VZ*@Uf6h5-O(`ZEtu;Tg6VV`+b?`^;j=Z~eP&sIC#3|(6;YbS z1AeytvhV!4h)3joQd>=6mZg;ekIw0yNDG_UP@kw6)H+(V05Co7N*?_4X=v@>r37i|;_IwBJQq|2O2rh8*|aaN zn<415BxbuW^#zLE#Y`6=)2m#FmBe#=@`$OLW;0}O^N`gLJ6qC6&8&&KWuE3VY(HO| z)gZOsl(K>YHG+IwYuHLB9)!k1DzzQ7O4WOOd;0Ipw~~Kk)6}jH=BJ6p5ZD|)(fSiR z9+C4tuzPHX_EPk4oJWkof6yzPfclNCLvw7MSiu_L)*gQ7@0x1+iZ-0D_Yd-w{ohOEI>ET zuLr92e((+$I#n+WJbC@y%Fhw$vICdJM&%bqtA~yt?#=IFy^y?^tE?-nLJa8>(ZI?M)B-1?%%m1vtgDr2GX4Bh7{%y) zH-mT*q;p*0a5`6c7}%?`Sx9(wKVeTt>&hzZ8nK8ePRNB1OS<29jK6claE#Xg=Kb|- zYPsAv!0n7vxpb;hWNi$Pk?KFYbn>wW-V`YLNj*g?4X}^Clq~9X_uX+h_^@j#?Ldt* zyi0RHFP7n$*6&@q)c({@`fpPrlRNP7_U3Y6>Mp*N_LcN~nI~GyH*d-*F8a}?M!!?S z-3uCg|5hsvJ8rzQ9MH{zeWmg1woq{iI-0Kja* zmwSgW+Li}xHeRHoM9kI*V`lbc5dlJnV%?i!uj?TS_r?PpX%yYl^6P+?zoz+%xfV)7 zSsaeV^u0_-vM&)8gZWSukNMC5AkLaUUPl(6)fbPM?p71GO2u4}{%f-@_87_`9%el$ z>L4L|xN>sljTLKMQs^VC)Bu)R;zw{C(w?=L3fXG&h3`%uYOj@OllEPzE%$9z9AQ3x!Y)Zp z%a|Et`7OSUnvS#|FNG*uB-yWeUq&94Y{vxkW)+>N_G*EVj-bR&qzJwouZd8#2IjkU&BTyGRC%WJ#)PJ1(UVJsgg2ufy8WiXVH2UH3gFhGNYK96Mzp|Fi3l#s znwR&bC8O<>nE}C3Nl&l9Pm46<>UKr#4+e?IQ}Gz#2%8P707eKgr-%DMs)f`yWMS94 z+~QJ!KG!#kv)pUqudQ!@^x4_zdBd>j@a4lUGbHE&JRJ4Ff~iXBc2)%K$KGtHeX(4I zot|9?uAEEbr240(k~vha1_wO)dyrUMe-j9Xz^tT!LoZPT_x=|fn`l5uQLE*W@aERw z z+Mncd8U7M-6AbZ4DF$r>bU;`zW+Xc8I;8t(dJm=DyFRFWbf=;G>)rH_N~5`)3h)T< zPsMdU9qs$ey|xl%KSXVnq--kqWKEK`^}Kz?Z8bFBSWp{a3R^Ba258;KqkH~dnU+4E z#z*sA!iUz?Ovoi6;0yjnXzgY~TqsTJ{MmYuan zARZL*a#a`kc-c2~zGw>PpWHk-CpdV994ml>0#v=JH#g`gA^X-`O|K$`m=i$%1--@f z*Pxv9TU=d%4ca(jDaw=SsA4K@>&>BkBBeU5q<;Ys}J!(XiOxpxMV7 zoc`bV_pHh>Rt!hily>su?|v}8Kh1=irTFM9Wd2b{y^O<292DjTv_rK(8DO*L_G`1G zi*#!1E4D5m-cfop4vmuvDr@*4U^dk;VRuk$gj<}~c67*rrQN9cG()yp%Yl#kXCO}N zrW{RM#n?CxQ(i8i#+pa#Jun~4_3)WJws(8hio4-)a%0A#KhOjU(y%9<(0pKuWAxLzafS@c$-U$l&#Yb%#K{d%wT;xdJ00Q zB}j#s3kFa38g!R5_E9R6JT#;9k!Y>Ln3pVa(|Ej=>4*}@9mB&xepoF}vd;Lj1+titK!`>ROZ({5z(F*;r z#tp&K29$cTb~fA#pUZuGA4~8FwwmS^RZIHa#l;cNbN^F-&nLr6*HQ-(m5|X4J|p?4 zOF{Jv5ob?_cM`Er;p>zPHu5jSZDkc=r%eo$Beo4}jTTY3kwH@JH7RqeXaa)!vHZ2n z0|lx)mx7qm1;WG%VSMu+laPK(OditwkgqG}d^JYN{3knCBKds-nG~1rdBy}EP2JuQmm-&N ziP5}4+H~A4?1C}2!%>=Q(F&)DSR&)UiVg_xFVlo6*Gz?Lg!JKd8$)ydT9244YhZ7C z$?z!d-tOFT9)|oBa3K5^8#wqE&ml6RqFn%LGriAikYJJU+%VD4uIQ}p9#cdk^iqA2u5HI}d@sTG)Kcx5d~k7Lv3 za34v&yNIe`gdOb&&&;GcQgxZ?H{Y_HGVElSd!*oLi&ImDIzKw(8ZWHfu6rg@y%EjI&z;h)Mcu$ZAz!2 z%0MbmU6Zug==<-E@ux@(^Ef)xQ&|Ic^3h9FteQX5Gb9)YQb`R8eS49xA2p@iM(q&& cd(J+<)} Date: Wed, 22 Oct 2014 11:28:48 +0000 Subject: [PATCH 02/31] Fixed problem encountered in the case "using_oasis=true" : automatic detection of a server does not work in coupled mode. Back to the old method : if you want to use XIOS server mode, it is mandatory to specify "using_server=true" in iodef.xml in coupled case. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@507 d613d254-d18a-4304-b296-5125d4c4d670 --- src/client.cpp | 13 +++---------- src/cxios.cpp | 1 + 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index fb0d0e9..5ada09e 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -131,19 +131,12 @@ namespace xios else MPI_Comm_dup(localComm,&intraComm) ; CTimer::get("XIOS").resume() ; CTimer::get("XIOS init").resume() ; - - // Verify whether we are on server mode or not - CXios::setNotUsingServer(); - int interCommSize = 0, intraCommSize = 0; - oasis_get_intercomm(interComm,CXios::xiosCodeId); - MPI_Comm_size(interComm, &interCommSize); - MPI_Comm_size(intraComm, &intraCommSize); - if (interCommSize == intraCommSize) CXios::setUsingServer(); - - if (CXios::usingServer) + + if (CXios::usingServer) { MPI_Status status ; MPI_Comm_rank(intraComm,&rank) ; + oasis_get_intercomm(interComm,CXios::xiosCodeId) ; if (rank==0) MPI_Recv(&serverLeader,1, MPI_INT, 0, 0, interComm, &status) ; MPI_Bcast(&serverLeader,1,MPI_INT,0,intraComm) ; diff --git a/src/cxios.cpp b/src/cxios.cpp index c4368ae..89a0e4d 100644 --- a/src/cxios.cpp +++ b/src/cxios.cpp @@ -35,6 +35,7 @@ namespace xios set_new_handler(noMemory); parseFile(rootFile); usingOasis=getin("using_oasis",false) ; + usingServer=getin("using_server",false) ; info.setLevel(getin("info_level",0)) ; printInfo2File=getin("print_file",false); bufferSize=getin("buffer_size",defaultBufferSize) ; -- GitLab From a186a497d03da5e97b6ca31a8640d808fd64f259 Mon Sep 17 00:00:00 2001 From: mhnguyen Date: Fri, 24 Oct 2014 15:09:55 +0000 Subject: [PATCH 03/31] Fixing bug with netcdf_seq +) Adding include file for exception +) Correcting call inside a namespace Test +) On local +) Passed git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@508 d613d254-d18a-4304-b296-5125d4c4d670 --- src/output/netCdfInterface.cpp | 4 ++-- src/output/netCdfInterface.hpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/output/netCdfInterface.cpp b/src/output/netCdfInterface.cpp index fa58a82..41905eb 100644 --- a/src/output/netCdfInterface.cpp +++ b/src/output/netCdfInterface.cpp @@ -48,7 +48,7 @@ */ int CNetCdfInterface::createPar(const StdString& fileName, int cMode, MPI_Comm comm, MPI_Info info, int& ncId) { - int status = ::nc_create_par((fileName.c_str()), cMode, comm, info, &ncId); + int status = xios::nc_create_par((fileName.c_str()), cMode, comm, info, &ncId); if (NC_NOERR != status) { StdString errormsg(nc_strerror(status)); @@ -101,7 +101,7 @@ */ int CNetCdfInterface::openPar(const StdString& fileName, int oMode, MPI_Comm comm, MPI_Info info, int& ncId) { - int status = ::nc_open_par((fileName.c_str()), oMode, comm, info, &ncId); + int status = xios::nc_open_par((fileName.c_str()), oMode, comm, info, &ncId); if (NC_NOERR != status) { StdString errormsg(nc_strerror(status)); diff --git a/src/output/netCdfInterface.hpp b/src/output/netCdfInterface.hpp index e7779b5..b4bb13e 100644 --- a/src/output/netCdfInterface.hpp +++ b/src/output/netCdfInterface.hpp @@ -11,6 +11,7 @@ #include "xmlioserver_spl.hpp" #include "mpi.hpp" +#include "exception.hpp" #include "netcdf.hpp" namespace xios -- GitLab From 30df6f15a3b4e2aa5ae294b20c0d381b078af351 Mon Sep 17 00:00:00 2001 From: aclsce Date: Thu, 20 Nov 2014 16:11:12 +0000 Subject: [PATCH 04/31] Removed the use of boolean variable in complete example. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@513 d613d254-d18a-4304-b296-5125d4c4d670 --- inputs/COMPLETE/context_surface.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/inputs/COMPLETE/context_surface.xml b/inputs/COMPLETE/context_surface.xml index 1f34086..eae2ec7 100644 --- a/inputs/COMPLETE/context_surface.xml +++ b/inputs/COMPLETE/context_surface.xml @@ -39,7 +39,6 @@ @field_A_srf_max file_1d - false -- GitLab From 06c6e5f46287d86a981ac87933e4e1807d7152e6 Mon Sep 17 00:00:00 2001 From: mhnguyen Date: Mon, 24 Nov 2014 11:11:19 +0000 Subject: [PATCH 05/31] Removing a line causing compilation error on Ada git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@514 d613d254-d18a-4304-b296-5125d4c4d670 --- src/output/netCdfInterface.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/output/netCdfInterface.hpp b/src/output/netCdfInterface.hpp index b4bb13e..e7779b5 100644 --- a/src/output/netCdfInterface.hpp +++ b/src/output/netCdfInterface.hpp @@ -11,7 +11,6 @@ #include "xmlioserver_spl.hpp" #include "mpi.hpp" -#include "exception.hpp" #include "netcdf.hpp" namespace xios -- GitLab From 29788d2d003491c83e063e930a1b39a600c2f9d6 Mon Sep 17 00:00:00 2001 From: ymipsl Date: Wed, 26 Nov 2014 15:17:02 +0000 Subject: [PATCH 06/31] bug fix reported in xios-1.0 : xios_is_valid_variable and xios_is_valid_variablegroup was not exported in the public fortran interface. YM git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@519 d613d254-d18a-4304-b296-5125d4c4d670 --- src/interface/fortran/ixios.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/interface/fortran/ixios.F90 b/src/interface/fortran/ixios.F90 index ac5db20..9f874fc 100644 --- a/src/interface/fortran/ixios.F90 +++ b/src/interface/fortran/ixios.F90 @@ -177,8 +177,9 @@ PUBLIC :: xios(is_defined_attr), xios(is_defined_domain_attr), xios(is_defined_d PUBLIC :: xios(add_child) PUBLIC :: xios(is_valid_context),xios(is_valid_domain), xios(is_valid_domaingroup),xios(is_valid_field), & - xios(is_valid_fieldgroup), xios(is_valid_file), xios(is_valid_filegroup), xios(is_valid_grid), & - xios(is_valid_gridgroup), xios(is_valid_axis), xios(is_valid_axisgroup) + xios(is_valid_fieldgroup), xios(is_valid_file), xios(is_valid_filegroup), xios(is_valid_grid), & + xios(is_valid_gridgroup), xios(is_valid_axis), xios(is_valid_axisgroup), xios(is_valid_variable), & + xios(is_valid_variablegroup) PUBLIC :: xios(set_current_context) PUBLIC :: xios(set_timestep),xios(update_calendar) -- GitLab From cb4d96bc8015781d4269860d775e7bbe95a96631 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 1 Dec 2014 08:33:54 +0000 Subject: [PATCH 07/31] Backport r520 "Fix: xios_is_valid_context always returned false." to the XIOS 1.0. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@521 d613d254-d18a-4304-b296-5125d4c4d670 --- src/interface/c/iccontext.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/interface/c/iccontext.cpp b/src/interface/c/iccontext.cpp index b1729b7..a1cbc18 100644 --- a/src/interface/c/iccontext.cpp +++ b/src/interface/c/iccontext.cpp @@ -70,16 +70,19 @@ extern "C" std::string id; if (!cstr2string(_id, _id_len, id)) return; - CTimer::get("XIOS").resume() ; + CTimer::get("XIOS").resume(); std::vector def_vector = xios::CContext::getRoot()->getChildList(); + *_ret = false; for (std::size_t i = 0; i < def_vector.size(); i++) - { - if (def_vector[i]->getId().compare(id) == 0) + { + if (def_vector[i]->getId().compare(id) == 0) + { *_ret = true; + break; + } } - *_ret = false; - CTimer::get("XIOS").suspend() ; + CTimer::get("XIOS").suspend(); } } // extern "C" -- GitLab From dd4370209fed026137fee85707ec49471c5fc9af Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 1 Dec 2014 08:49:17 +0000 Subject: [PATCH 08/31] Fix a typo in DECLARE_ENUM9 macro: getSize method returned 8 instead of 9. Also backport that fix to XIOS 1.0. Note that this macro is currently not used by XIOs so this bug had no impact in practice. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@522 d613d254-d18a-4304-b296-5125d4c4d670 --- src/declare_attribute.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declare_attribute.hpp b/src/declare_attribute.hpp index 45c9e74..be7a735 100644 --- a/src/declare_attribute.hpp +++ b/src/declare_attribute.hpp @@ -110,7 +110,7 @@ public: \ enum t_enum { arg1=0, arg2, arg3,arg4,arg5,arg6,arg7,arg8,arg9} ; \ const char** getStr(void) const { static const char * enumStr[] = { #arg1, #arg2, #arg3,#arg4,#arg5,#arg6,#arg7,#arg8,#arg9 } ; return enumStr ; } \ - int getSize(void) const { return 8 ; } \ + int getSize(void) const { return 9 ; } \ } ; \ DECLARE_CLASS_ENUM(name) -- GitLab From 7e4fc8bb536ebd09e0c77dc931493cb90108a591 Mon Sep 17 00:00:00 2001 From: mhnguyen Date: Mon, 1 Dec 2014 17:58:38 +0000 Subject: [PATCH 09/31] Fixing compilation error in parallel with sequential netcdf (This patch is also posted on trunk) git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@524 d613d254-d18a-4304-b296-5125d4c4d670 --- src/output/netCdfInterface.cpp | 1414 ++++++++++++++++---------------- src/output/netCdfInterface.hpp | 5 + src/output/netcdf.hpp | 10 +- 3 files changed, 717 insertions(+), 712 deletions(-) diff --git a/src/output/netCdfInterface.cpp b/src/output/netCdfInterface.cpp index 41905eb..8425e0b 100644 --- a/src/output/netCdfInterface.cpp +++ b/src/output/netCdfInterface.cpp @@ -7,747 +7,747 @@ \brief Wrapper of netcdf functions. */ - #include "netCdfInterface.hpp" - #include "netCdfException.hpp" - - namespace xios - { - /*! - This function creates a new netcdf file and return its id - \param [in] fileName Name of the file - \param [in] cMode create mode - \param [in/out] ncId id of the created file - \return Status code - */ - int CNetCdfInterface::create(const StdString& fileName, int cMode, int& ncId) - { - int status = nc_create((fileName.c_str()), cMode, &ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - sstr << "Error in calling function : nc_create((fileName.c_str()), cMode, &ncId) " << std::endl - << errormsg << std::endl - << "Unable to create file, given its name : " << fileName - << "and its creation mode " << creationMode2String(cMode) << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function creates a new netcdf file on parallel file system - \param [in] fileName Name of the file - \param [in] cMode create mode - \param [in] comm MPI communicator - \param [in] info MPI information - \param [in/out] ncId id of the created file - \return Status code - */ - int CNetCdfInterface::createPar(const StdString& fileName, int cMode, MPI_Comm comm, MPI_Info info, int& ncId) - { - int status = xios::nc_create_par((fileName.c_str()), cMode, comm, info, &ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - sstr << "Error in calling function : nc_create_par((fileName.c_str()), cMode, comm, info, &ncId) " << std::endl - << errormsg << std::endl - << "Unable to create file on parallel filesys, given its name : " << std::endl - << "and its creation mode " << creationMode2String(cMode) << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function opens a netcdf file, given its name and open mode, return its id - \param [in] fileName Name of the file - \param [in] oMode open mode - \param [in/out] ncId id of the opening file - \return Status code - */ - int CNetCdfInterface::open(const StdString& fileName, int oMode, int& ncId) - { - int status = nc_open((fileName.c_str()), oMode, &ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - sstr << "Error in calling function : nc_open((fileName.c_str()), oMode, &ncId) "<< std::endl - << errormsg << std::endl - << "Unable to open file, given its name : " << fileName - << "and its open mode " << openMode2String(oMode) << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - - /*! - This function opens a new netcdf file on parallel file system - \param [in] fileName Name of the file - \param [in] oMode open mode - \param [in] comm MPI communicator - \param [in] info MPI information - \param [in/out] ncId id of the opened file - \return Status code - */ - int CNetCdfInterface::openPar(const StdString& fileName, int oMode, MPI_Comm comm, MPI_Info info, int& ncId) - { - int status = xios::nc_open_par((fileName.c_str()), oMode, comm, info, &ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - sstr << "Error in calling function " << "nc_open_par((fileName.c_str()), oMode, comm, info, &ncId) " << std::endl - << errormsg << std::endl - << "Unable to open file on parallel filesys, given its name : " << fileName - << "and its open mode " << openMode2String(oMode) << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function closes a netcdf file, given its id - \param [in] ncId id of the opening netcdf file - \return Status code - */ - int CNetCdfInterface::close(int ncId) - { - int status = nc_close(ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - sstr << "Error in calling function " << "nc_close(ncId)" << std::endl - << errormsg << std::endl - << "Unable to close file, given its id : " << ncId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function put a netcdf file into define mode, given its id - \param [in] ncId id of the opening netcdf file to be put into define mode - \return Status code - */ - int CNetCdfInterface::reDef(int ncId) - { - int status = nc_redef(ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - sstr << "Error in calling function " << "nc_redef(ncId)" << std::endl +#include "netCdfInterface.hpp" +#include "netCdfException.hpp" + +namespace xios +{ +/*! +This function creates a new netcdf file and return its id +\param [in] fileName Name of the file +\param [in] cMode create mode +\param [in/out] ncId id of the created file +\return Status code +*/ +int CNetCdfInterface::create(const StdString& fileName, int cMode, int& ncId) +{ + int status = nc_create((fileName.c_str()), cMode, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function : nc_create((fileName.c_str()), cMode, &ncId) " << std::endl + << errormsg << std::endl + << "Unable to create file, given its name : " << fileName + << "and its creation mode " << creationMode2String(cMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function creates a new netcdf file on parallel file system +\param [in] fileName Name of the file +\param [in] cMode create mode +\param [in] comm MPI communicator +\param [in] info MPI information +\param [in/out] ncId id of the created file +\return Status code +*/ +int CNetCdfInterface::createPar(const StdString& fileName, int cMode, MPI_Comm comm, MPI_Info info, int& ncId) +{ + int status = xios::nc_create_par((fileName.c_str()), cMode, comm, info, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function : nc_create_par((fileName.c_str()), cMode, comm, info, &ncId) " << std::endl << errormsg << std::endl - << "Unable to put this file into define mode given its id : " << ncId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function ends a netcdf file define mode, given its id - \param [in] ncId id of the opening netcdf file to be put into define mode - \return Status code - */ - int CNetCdfInterface::endDef(int ncId) - { - int status = nc_enddef(ncId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_enddef(ncId)" << std::endl - << errormsg << std::endl - << "Unable to end define mode of this file, given its id : " << ncId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with ncid and group name then return ncid of the named group - \param [in] ncid Groupd id (or File Id) - \param [in] grpName Name of the desired group (or file) - \param [in/out] grpId Group id if the group is found - \return Status code - */ - int CNetCdfInterface::inqNcId(int ncid, const StdString& grpName, int& grpId) - { - int status = nc_inq_ncid(ncid, (grpName.c_str()), &grpId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_ncid(ncid, (grpName.c_str()), &grpId)" << std::endl - << errormsg << std::endl - << "Unable to get id of a group (File), given its name : " << grpName << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - - /*! - This function makes a request to netcdf with ncid and variable name then return ncid of the named variable - \param [in] ncid Groupd id (or File Id) - \param [in] varName Name of the desired variable - \param [in/out] varId Variable id if this variable is found - \return Status code - */ - int CNetCdfInterface::inqVarId(int ncid,const StdString& varName, int& varId) - { - int status = nc_inq_varid(ncid, (varName.c_str()), &varId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function : nc_inq_varid(ncid, (varName.c_str()), &varId)" << std::endl - << (errormsg) << std::endl - << "Unable to get id of variable with name : " << varName << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with a netCdf dimension name then return ncid of the named dimension - \param [in] ncid Groupd id (or File Id) - \param [in] dimName Name of the desired dimension - \param [in/out] dimId Dimension id if this dimension is found - \return Status code - */ - int CNetCdfInterface::inqDimId(int ncid,const StdString& dimName, int& dimId) - { - int status = nc_inq_dimid(ncid, (dimName.c_str()), &dimId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_dimid(ncid, (dimName.c_str()), &dimId)" << std::endl - << errormsg << std::endl - << "Unable to get id of dimension, given its name : " << dimName << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with a netCdf dimension name then return ncid of the named dimension - \param [in] ncid Groupd id (or File Id) - \param [in/out] dimId Dimension id if this dimension is found - \return Status code - */ - int CNetCdfInterface::inqUnLimDim(int ncid, int& dimId) - { - int status = nc_inq_unlimdim(ncid, &dimId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_dimid" << std::endl + << "Unable to create file on parallel filesys, given its name : " << std::endl + << "and its creation mode " << creationMode2String(cMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function opens a netcdf file, given its name and open mode, return its id +\param [in] fileName Name of the file +\param [in] oMode open mode +\param [in/out] ncId id of the opening file +\return Status code +*/ +int CNetCdfInterface::open(const StdString& fileName, int oMode, int& ncId) +{ + int status = nc_open((fileName.c_str()), oMode, &ncId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function : nc_open((fileName.c_str()), oMode, &ncId) "<< std::endl << errormsg << std::endl - << "Unable to get id of unlimited dimension " << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf, returns name of a dimension, given its id - \param [in] ncid Groupd id (or File Id) - \param [in] dimId Id of desired dimension - \param [in/out] dimName Name of desired dimension - \return Status code - */ - int CNetCdfInterface::inqDimName(int ncid, int dimId, StdString& dimName) - { - char fullNameIn[NC_MAX_NAME +1]; - int status = nc_inq_dimname(ncid, dimId, fullNameIn); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_dimname(ncid, dimId, fullNameIn)" << std::endl - << errormsg << std::endl - << "Unable to get dimension name from its id : " << dimId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - dimName = StdString(fullNameIn); - return status; - } - - /*! - This function makes a request to netcdf, returns length of a dimension, given its id - \param [in] ncid Groupd id (or File Id) - \param [in] dimId Id of desired dimension - \param [in/out] dimLen Length of desired dimension - \return Status code - */ - int CNetCdfInterface::inqDimLen(int ncid, int dimId, StdSize& dimLen) - { - int status = nc_inq_dimlen(ncid, dimId, &dimLen); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_dimlen(ncid, dimId, &dimLen)" << std::endl - << errormsg << std::endl - << "Unable to get dimension length from its id: " << dimId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf, returns number of dimensions of a variable, given its id - \param [in] ncid Groupd id (or File Id) - \param [in] varId Id of variable - \param [in/out] ndims number of dimension of the variable - \return Status code - */ - int CNetCdfInterface::inqVarNDims(int ncid, int varId, int& nDims) - { - int status = nc_inq_varndims(ncid, varId, &nDims); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_varndims(ncid, varId, &nDims)" << std::endl - << errormsg << std::endl - << "Unable to get the number of dimension of variable with Id : " << varId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf, returns a list of dimension ID describing the shape of the variable, given its id - \param [in] ncid Groupd id (or File Id) - \param [in] varId Id of variable - \param [in/out] dimIds list of dimension of the variable - \return Status code - */ - int CNetCdfInterface::inqVarDimId(int ncid, int varId, int* dimIds) - { - int status = nc_inq_vardimid(ncid, varId, dimIds); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_vardimid(ncid, varId, dimIds)" << std::endl - << errormsg << std::endl - << "Unable to get list of dimension id of the variable with id " << varId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf, to find all dimension in a group - \param [in] ncid Groupd id (or File Id) - \param [in/out] nDims number of list of dimension - \param [in/out] dimIds list of dimension in a group or any of its parent - \param [in] includeParents number of parents - \return Status code - */ - int CNetCdfInterface::inqDimIds(int ncid, int& nDims, int* dimIds, int includeParents) - { - int status = nc_inq_dimids(ncid, &nDims, dimIds, includeParents); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_inq_dimids(ncid, &nDims, dimIds, includeParents)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to retrieve number of dimension in the group with id : " << ncid << std::endl; - sstr << "With number of Parents " << includeParents << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with a id of a prent groupd and then return id of the created group, given its name - \param [in] parentNcid Id of parent groupd(or File Id) - \param [in] grpName Name of the desired group - \param [in/out] grpId Group id if this group is created sucessfully - \return Status code - */ - int CNetCdfInterface::defGrp(int parentNcid, const StdString& grpName, int& grpId) - { - int status = nc_def_grp(parentNcid, (grpName.c_str()), &grpId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_def_grp(parentNcid, (grpName.c_str()), &grpId)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to create group Id, given its name : " << grpName << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf, add a new dimension to an open netcdf in define mode - \param [in] ncid Id of groupd(or File Id) - \param [in] dimName Name of the desired dimension - \param [in/out] grpId Group id if this group is created sucessfully - \return Status code - */ - int CNetCdfInterface::defDim(int ncid, const StdString& dimName, StdSize dimLen, int& dimId) - { - int status = nc_def_dim(ncid, (dimName.c_str()), dimLen, &dimId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_def_dim(ncid, (dimName.c_str()), dimLen, &dimId)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to create dimension with name : " << dimName - << " and with length " << dimLen << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with its id, to add a new variable to an open netCdf in define mode, - return a variable id, given its name, type, the number of dimensions and list of dimension id - \param [in] ncid Id of groupd(or File Id) - \param [in] varName Name of the desired dimension - \param [in] xtypes One of the set of predefined netCDF data types - \param [in] nDims Number of dimension for the variable - \param [in] dimIds List of ndims dimension ids corresponding to the variable dimensions - \param [in/out] varId Variable id if it is added sucessfully - \return Status code - */ - int CNetCdfInterface::defVar(int ncid,const StdString& varName, nc_type xtype, - int nDims, const int dimIds[], int& varId) - { - int status = nc_def_var(ncid, (varName.c_str()), xtype, nDims, dimIds, &varId); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << " nc_def_var(ncid, (varName.c_str()), xtype, nDims, dimIds, &varId)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to add a new variable with name : " << varName - << " with type " << xtype - << " and number of dimension " << nDims << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with a ncid, to set the chunking size of a variable, - given variable id and type of storage - \param [in] ncid Id groupd(or File Id) - \param [in] varId Id of the variable - \param [in] storage Type of storage (It can be : NC_CONTIGUOUS, NC_CHUNKED) - \param [in/out] chunkSize array list of chunk sizes - \return Status code - */ - int CNetCdfInterface::defVarChunking(int ncid, int varId, int storage, StdSize chunkSize[]) - { - int status = nc_def_var_chunking(ncid, varId, storage, chunkSize); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_def_var_chunking(ncid, varId, storage, chunkSize)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to set chunk size of the variable with id : " << varId - << " and storage type " << storage << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with a ncid, to set the fill parameters for a variable, - given variable id and type of fill - \param [in] ncid Id groupd(or File Id) - \param [in] varId Id of the variable - \param [in] noFill turn on/off nofill mode on a variable - \param [in/out] fillValue - \return Status code - */ - int CNetCdfInterface::defVarFill(int ncid, int varId, int noFill, void* fillValue) - { - int status = nc_def_var_fill(ncid, varId, noFill, fillValue); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_def_var_fill(ncid, varId, noFill, fillValue)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to set fill parameters of the variable with id : " << varId - << " and fill option " << noFill << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with a ncid, to change the way read/write operations are performed - collectively or independently on the variable. - \param [in] ncid Id groupd(or File Id) - \param [in] varId Id of the variable - \param [in] noFill turn on/off nofill mode on a variable - \param [in/out] fillValue - \return Status code - */ - int CNetCdfInterface::varParAccess(int ncid, int varId, int access) - { - int status = nc_var_par_access(ncid, varId, access); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_var_par_access(ncid, varId, access)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to change read/write option of the variable with id : " << varId << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a synchronisation of the disk copy of a netCDF dataset. - \param [in] ncid Id groupd(or File Id) - \return Status code - */ - int CNetCdfInterface::sync(int ncid) - { - int status = nc_sync(ncid); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_sync(ncid)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to make a synchronization of a netCDF file with id : " << ncid << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - /*! - This function makes a request to netcdf with its id, to add or change a variable attribute or gloabl attribute, - given its name, type, number of values provided for attribute - \param [in] ncid Id of groupd(or File Id) - \param [in] varId Id of the variable - \param [in] attrName Name of the attribute - \param [in] xtypes One of the set of predefined netCDF data types - \param [in] numVal Number of values - \param [in] op Array of values provided for attribute - \return Status code - */ - int CNetCdfInterface::putAtt(int ncid, int varId, const StdString& attrName, nc_type xtype, - StdSize numVal, const void* op) - { - int status = nc_put_att(ncid, varId, (attrName.c_str()), xtype, numVal, op); - if (NC_NOERR != status) - { - StdString errormsg(nc_strerror(status)); - StdStringStream sstr; - - sstr << "Error in calling function " << "nc_put_att(ncid, varId, (attrName.c_str()), xtype, numVal, op)" << std::endl; - sstr << errormsg << std::endl; - sstr << "Unable to set attribute " << attrName << " for a variable with id : " << varId - << " with number of attribute " << numVal - << " with type " << xtype << std::endl; - StdString e = sstr.str(); - throw CNetCdfException(e); - } - - return status; - } - - // Some specilization of putAttributeType - template<> - int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, - StdSize numVal, const double* op) + << "Unable to open file, given its name : " << fileName + << "and its open mode " << openMode2String(oMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + + +/*! +This function opens a new netcdf file on parallel file system +\param [in] fileName Name of the file +\param [in] oMode open mode +\param [in] comm MPI communicator +\param [in] info MPI information +\param [in/out] ncId id of the opened file +\return Status code +*/ +int CNetCdfInterface::openPar(const StdString& fileName, int oMode, MPI_Comm comm, MPI_Info info, int& ncId) +{ + int status = xios::nc_open_par((fileName.c_str()), oMode, comm, info, &ncId); + if (NC_NOERR != status) { - return (nc_put_att_double(ncid, varid, attrName, NC_DOUBLE, numVal, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "nc_open_par((fileName.c_str()), oMode, comm, info, &ncId) " << std::endl + << errormsg << std::endl + << "Unable to open file on parallel filesys, given its name : " << fileName + << "and its open mode " << openMode2String(oMode) << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - template<> - int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, - StdSize numVal, const float* op) + return status; +} + +/*! +This function closes a netcdf file, given its id +\param [in] ncId id of the opening netcdf file +\return Status code +*/ +int CNetCdfInterface::close(int ncId) +{ + int status = nc_close(ncId); + if (NC_NOERR != status) { - return (nc_put_att_float(ncid, varid, attrName, NC_FLOAT, numVal, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "nc_close(ncId)" << std::endl + << errormsg << std::endl + << "Unable to close file, given its id : " << ncId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - template<> - int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, - StdSize numVal, const int* op) + return status; +} + +/*! +This function put a netcdf file into define mode, given its id +\param [in] ncId id of the opening netcdf file to be put into define mode +\return Status code +*/ +int CNetCdfInterface::reDef(int ncId) +{ + int status = nc_redef(ncId); + if (NC_NOERR != status) { - return (nc_put_att_int(ncid, varid, attrName, NC_INT, numVal, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + sstr << "Error in calling function " << "nc_redef(ncId)" << std::endl + << errormsg << std::endl + << "Unable to put this file into define mode given its id : " << ncId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - template<> - int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, - StdSize numVal, const long* op) + return status; +} + +/*! +This function ends a netcdf file define mode, given its id +\param [in] ncId id of the opening netcdf file to be put into define mode +\return Status code +*/ +int CNetCdfInterface::endDef(int ncId) +{ + int status = nc_enddef(ncId); + if (NC_NOERR != status) { - return (nc_put_att_long(ncid, varid, attrName, NC_LONG, numVal, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_enddef(ncId)" << std::endl + << errormsg << std::endl + << "Unable to end define mode of this file, given its id : " << ncId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - template<> - int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, - StdSize numVal, const short* op) + return status; +} + +/*! +This function makes a request to netcdf with ncid and group name then return ncid of the named group +\param [in] ncid Groupd id (or File Id) +\param [in] grpName Name of the desired group (or file) +\param [in/out] grpId Group id if the group is found +\return Status code +*/ +int CNetCdfInterface::inqNcId(int ncid, const StdString& grpName, int& grpId) +{ + int status = nc_inq_ncid(ncid, (grpName.c_str()), &grpId); + if (NC_NOERR != status) { - return (nc_put_att_short(ncid, varid, attrName, NC_SHORT, numVal, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_ncid(ncid, (grpName.c_str()), &grpId)" << std::endl + << errormsg << std::endl + << "Unable to get id of a group (File), given its name : " << grpName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } + return status; +} + - // Some specilization of putVariableType - template<> - int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const double* op) +/*! +This function makes a request to netcdf with ncid and variable name then return ncid of the named variable +\param [in] ncid Groupd id (or File Id) +\param [in] varName Name of the desired variable +\param [in/out] varId Variable id if this variable is found +\return Status code +*/ +int CNetCdfInterface::inqVarId(int ncid,const StdString& varName, int& varId) +{ + int status = nc_inq_varid(ncid, (varName.c_str()), &varId); + if (NC_NOERR != status) { - return (nc_put_vara_double(ncid, varid, start, count, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function : nc_inq_varid(ncid, (varName.c_str()), &varId)" << std::endl + << (errormsg) << std::endl + << "Unable to get id of variable with name : " << varName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - template<> - int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const float* op) + return status; +} + +/*! +This function makes a request to netcdf with a netCdf dimension name then return ncid of the named dimension +\param [in] ncid Groupd id (or File Id) +\param [in] dimName Name of the desired dimension +\param [in/out] dimId Dimension id if this dimension is found +\return Status code +*/ +int CNetCdfInterface::inqDimId(int ncid,const StdString& dimName, int& dimId) +{ + int status = nc_inq_dimid(ncid, (dimName.c_str()), &dimId); + if (NC_NOERR != status) { - return (nc_put_vara_float(ncid, varid, start, count, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimid(ncid, (dimName.c_str()), &dimId)" << std::endl + << errormsg << std::endl + << "Unable to get id of dimension, given its name : " << dimName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - template<> - int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const int* op) + return status; +} + +/*! +This function makes a request to netcdf with a netCdf dimension name then return ncid of the named dimension +\param [in] ncid Groupd id (or File Id) +\param [in/out] dimId Dimension id if this dimension is found +\return Status code +*/ +int CNetCdfInterface::inqUnLimDim(int ncid, int& dimId) +{ + int status = nc_inq_unlimdim(ncid, &dimId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimid" << std::endl + << errormsg << std::endl + << "Unable to get id of unlimited dimension " << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf, returns name of a dimension, given its id +\param [in] ncid Groupd id (or File Id) +\param [in] dimId Id of desired dimension +\param [in/out] dimName Name of desired dimension +\return Status code +*/ +int CNetCdfInterface::inqDimName(int ncid, int dimId, StdString& dimName) +{ + char fullNameIn[NC_MAX_NAME +1]; + int status = nc_inq_dimname(ncid, dimId, fullNameIn); + if (NC_NOERR != status) { - return (nc_put_vara_int(ncid, varid, start, count, op)); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimname(ncid, dimId, fullNameIn)" << std::endl + << errormsg << std::endl + << "Unable to get dimension name from its id : " << dimId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } + dimName = StdString(fullNameIn); + return status; +} - /*! - This function verifies an existence of a variable by using its name. - Be careful, althoug false means variable doens't exist, it could show that netCDF file doesn't either - \param [in] ncid Id of groupd(or File Id) - \param [in] attrName Name of the variable - \return Existence of variable - */ - bool CNetCdfInterface::isVarExisted(int ncId, const StdString& varName) +/*! +This function makes a request to netcdf, returns length of a dimension, given its id +\param [in] ncid Groupd id (or File Id) +\param [in] dimId Id of desired dimension +\param [in/out] dimLen Length of desired dimension +\return Status code +*/ +int CNetCdfInterface::inqDimLen(int ncid, int dimId, StdSize& dimLen) +{ + int status = nc_inq_dimlen(ncid, dimId, &dimLen); + if (NC_NOERR != status) { - int varId = 0; - return (NC_NOERR == (nc_inq_varid(ncId, varName.c_str(), &varId))); + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimlen(ncid, dimId, &dimLen)" << std::endl + << errormsg << std::endl + << "Unable to get dimension length from its id: " << dimId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); } - StdString CNetCdfInterface::openMode2String(int oMode) + return status; +} + +/*! +This function makes a request to netcdf, returns number of dimensions of a variable, given its id +\param [in] ncid Groupd id (or File Id) +\param [in] varId Id of variable +\param [in/out] ndims number of dimension of the variable +\return Status code +*/ +int CNetCdfInterface::inqVarNDims(int ncid, int varId, int& nDims) +{ + int status = nc_inq_varndims(ncid, varId, &nDims); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_varndims(ncid, varId, &nDims)" << std::endl + << errormsg << std::endl + << "Unable to get the number of dimension of variable with Id : " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf, returns a list of dimension ID describing the shape of the variable, given its id +\param [in] ncid Groupd id (or File Id) +\param [in] varId Id of variable +\param [in/out] dimIds list of dimension of the variable +\return Status code +*/ +int CNetCdfInterface::inqVarDimId(int ncid, int varId, int* dimIds) +{ + int status = nc_inq_vardimid(ncid, varId, dimIds); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_vardimid(ncid, varId, dimIds)" << std::endl + << errormsg << std::endl + << "Unable to get list of dimension id of the variable with id " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf, to find all dimension in a group +\param [in] ncid Groupd id (or File Id) +\param [in/out] nDims number of list of dimension +\param [in/out] dimIds list of dimension in a group or any of its parent +\param [in] includeParents number of parents +\return Status code +*/ +int CNetCdfInterface::inqDimIds(int ncid, int& nDims, int* dimIds, int includeParents) +{ + int status = nc_inq_dimids(ncid, &nDims, dimIds, includeParents); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_inq_dimids(ncid, &nDims, dimIds, includeParents)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to retrieve number of dimension in the group with id : " << ncid << std::endl; + sstr << "With number of Parents " << includeParents << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf with a id of a prent groupd and then return id of the created group, given its name +\param [in] parentNcid Id of parent groupd(or File Id) +\param [in] grpName Name of the desired group +\param [in/out] grpId Group id if this group is created sucessfully +\return Status code +*/ +int CNetCdfInterface::defGrp(int parentNcid, const StdString& grpName, int& grpId) +{ + int status = nc_def_grp(parentNcid, (grpName.c_str()), &grpId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_grp(parentNcid, (grpName.c_str()), &grpId)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to create group Id, given its name : " << grpName << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf, add a new dimension to an open netcdf in define mode +\param [in] ncid Id of groupd(or File Id) +\param [in] dimName Name of the desired dimension +\param [in/out] grpId Group id if this group is created sucessfully +\return Status code +*/ +int CNetCdfInterface::defDim(int ncid, const StdString& dimName, StdSize dimLen, int& dimId) +{ + int status = nc_def_dim(ncid, (dimName.c_str()), dimLen, &dimId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_dim(ncid, (dimName.c_str()), dimLen, &dimId)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to create dimension with name : " << dimName + << " and with length " << dimLen << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf with its id, to add a new variable to an open netCdf in define mode, +return a variable id, given its name, type, the number of dimensions and list of dimension id +\param [in] ncid Id of groupd(or File Id) +\param [in] varName Name of the desired dimension +\param [in] xtypes One of the set of predefined netCDF data types +\param [in] nDims Number of dimension for the variable +\param [in] dimIds List of ndims dimension ids corresponding to the variable dimensions +\param [in/out] varId Variable id if it is added sucessfully +\return Status code +*/ +int CNetCdfInterface::defVar(int ncid,const StdString& varName, nc_type xtype, + int nDims, const int dimIds[], int& varId) +{ + int status = nc_def_var(ncid, (varName.c_str()), xtype, nDims, dimIds, &varId); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << " nc_def_var(ncid, (varName.c_str()), xtype, nDims, dimIds, &varId)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to add a new variable with name : " << varName + << " with type " << xtype + << " and number of dimension " << nDims << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf with a ncid, to set the chunking size of a variable, +given variable id and type of storage +\param [in] ncid Id groupd(or File Id) +\param [in] varId Id of the variable +\param [in] storage Type of storage (It can be : NC_CONTIGUOUS, NC_CHUNKED) +\param [in/out] chunkSize array list of chunk sizes +\return Status code +*/ +int CNetCdfInterface::defVarChunking(int ncid, int varId, int storage, StdSize chunkSize[]) +{ + int status = nc_def_var_chunking(ncid, varId, storage, chunkSize); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_var_chunking(ncid, varId, storage, chunkSize)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set chunk size of the variable with id : " << varId + << " and storage type " << storage << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf with a ncid, to set the fill parameters for a variable, +given variable id and type of fill +\param [in] ncid Id groupd(or File Id) +\param [in] varId Id of the variable +\param [in] noFill turn on/off nofill mode on a variable +\param [in/out] fillValue +\return Status code +*/ +int CNetCdfInterface::defVarFill(int ncid, int varId, int noFill, void* fillValue) +{ + int status = nc_def_var_fill(ncid, varId, noFill, fillValue); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_def_var_fill(ncid, varId, noFill, fillValue)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set fill parameters of the variable with id : " << varId + << " and fill option " << noFill << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf with a ncid, to change the way read/write operations are performed +collectively or independently on the variable. +\param [in] ncid Id groupd(or File Id) +\param [in] varId Id of the variable +\param [in] noFill turn on/off nofill mode on a variable +\param [in/out] fillValue +\return Status code +*/ +int CNetCdfInterface::varParAccess(int ncid, int varId, int access) +{ + int status = nc_var_par_access(ncid, varId, access); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_var_par_access(ncid, varId, access)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to change read/write option of the variable with id : " << varId << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a synchronisation of the disk copy of a netCDF dataset. +\param [in] ncid Id groupd(or File Id) +\return Status code +*/ +int CNetCdfInterface::sync(int ncid) +{ + int status = nc_sync(ncid); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_sync(ncid)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to make a synchronization of a netCDF file with id : " << ncid << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + +/*! +This function makes a request to netcdf with its id, to add or change a variable attribute or gloabl attribute, +given its name, type, number of values provided for attribute +\param [in] ncid Id of groupd(or File Id) +\param [in] varId Id of the variable +\param [in] attrName Name of the attribute +\param [in] xtypes One of the set of predefined netCDF data types +\param [in] numVal Number of values +\param [in] op Array of values provided for attribute +\return Status code +*/ +int CNetCdfInterface::putAtt(int ncid, int varId, const StdString& attrName, nc_type xtype, + StdSize numVal, const void* op) +{ + int status = nc_put_att(ncid, varId, (attrName.c_str()), xtype, numVal, op); + if (NC_NOERR != status) + { + StdString errormsg(nc_strerror(status)); + StdStringStream sstr; + + sstr << "Error in calling function " << "nc_put_att(ncid, varId, (attrName.c_str()), xtype, numVal, op)" << std::endl; + sstr << errormsg << std::endl; + sstr << "Unable to set attribute " << attrName << " for a variable with id : " << varId + << " with number of attribute " << numVal + << " with type " << xtype << std::endl; + StdString e = sstr.str(); + throw CNetCdfException(e); + } + + return status; +} + + // Some specilization of putAttributeType +template<> +int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const double* op) +{ + return (nc_put_att_double(ncid, varid, attrName, NC_DOUBLE, numVal, op)); +} + +template<> +int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const float* op) +{ + return (nc_put_att_float(ncid, varid, attrName, NC_FLOAT, numVal, op)); +} + +template<> +int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const int* op) +{ + return (nc_put_att_int(ncid, varid, attrName, NC_INT, numVal, op)); +} + +template<> +int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const long* op) +{ + return (nc_put_att_long(ncid, varid, attrName, NC_LONG, numVal, op)); +} + +template<> +int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, + StdSize numVal, const short* op) +{ + return (nc_put_att_short(ncid, varid, attrName, NC_SHORT, numVal, op)); +} + + +// Some specilization of putVariableType +template<> +int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const double* op) +{ + return (nc_put_vara_double(ncid, varid, start, count, op)); +} + +template<> +int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const float* op) +{ + return (nc_put_vara_float(ncid, varid, start, count, op)); +} + +template<> +int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const int* op) +{ + return (nc_put_vara_int(ncid, varid, start, count, op)); +} + + /*! + This function verifies an existence of a variable by using its name. + Be careful, althoug false means variable doens't exist, it could show that netCDF file doesn't either + \param [in] ncid Id of groupd(or File Id) + \param [in] attrName Name of the variable + \return Existence of variable + */ +bool CNetCdfInterface::isVarExisted(int ncId, const StdString& varName) +{ + int varId = 0; + return (NC_NOERR == (nc_inq_varid(ncId, varName.c_str(), &varId))); +} + +StdString CNetCdfInterface::openMode2String(int oMode) +{ + StdString modeMes; + switch (oMode) { - StdString modeMes; - switch (oMode) - { - case NC_NOWRITE: - modeMes = StdString("NC_NOWRITE : Opening netCDF file with read-only access with buffering and caching access"); - break; - case NC_SHARE: - modeMes = StdString("NC_SHARE : Several processes can read the file concurrently"); - break; - case NC_WRITE: - modeMes = StdString("NC_WRITE : NetCDF file is readable and writable"); - break; - default: - modeMes = StdString("In the composed opening mode"); - break; - return modeMes; - } + case NC_NOWRITE: + modeMes = StdString("NC_NOWRITE : Opening netCDF file with read-only access with buffering and caching access"); + break; + case NC_SHARE: + modeMes = StdString("NC_SHARE : Several processes can read the file concurrently"); + break; + case NC_WRITE: + modeMes = StdString("NC_WRITE : NetCDF file is readable and writable"); + break; + default: + modeMes = StdString("In the composed opening mode"); + break; + return modeMes; } +} - StdString CNetCdfInterface::creationMode2String(int cMode) +StdString CNetCdfInterface::creationMode2String(int cMode) +{ + StdString modeMes; + switch (cMode) { - StdString modeMes; - switch (cMode) - { - case NC_NOCLOBBER: - modeMes = StdString("NC_NOCLOBBER : Not overwrite an exisiting netCDF file "); - break; - case NC_SHARE: - modeMes = StdString("NC_SHARE : Several processes can read from and write into the file concurrently"); - break; - case NC_64BIT_OFFSET: - modeMes = StdString("NC_64BIT_OFFSET : NetCDF file is 64-bit offset"); - break; - case NC_NETCDF4: - modeMes = StdString("NC_NETCDF4 : NetCDF file is HDF5/NetCDF-4"); - break; - case NC_CLASSIC_MODEL: - modeMes = StdString("NC_CLASSIC_MODEL : NetCDF file is classical model"); - break; - default: - modeMes = StdString("In the composed creation mode"); - break; - return modeMes; - } + case NC_NOCLOBBER: + modeMes = StdString("NC_NOCLOBBER : Not overwrite an exisiting netCDF file "); + break; + case NC_SHARE: + modeMes = StdString("NC_SHARE : Several processes can read from and write into the file concurrently"); + break; + case NC_64BIT_OFFSET: + modeMes = StdString("NC_64BIT_OFFSET : NetCDF file is 64-bit offset"); + break; + case NC_NETCDF4: + modeMes = StdString("NC_NETCDF4 : NetCDF file is HDF5/NetCDF-4"); + break; + case NC_CLASSIC_MODEL: + modeMes = StdString("NC_CLASSIC_MODEL : NetCDF file is classical model"); + break; + default: + modeMes = StdString("In the composed creation mode"); + break; + return modeMes; } +} } diff --git a/src/output/netCdfInterface.hpp b/src/output/netCdfInterface.hpp index e7779b5..57d1cfa 100644 --- a/src/output/netCdfInterface.hpp +++ b/src/output/netCdfInterface.hpp @@ -10,6 +10,11 @@ #define __NETCDF_INTERFACE_HPP_ #include "xmlioserver_spl.hpp" + +#if !defined(USING_NETCDF_PAR) +#include "exception.hpp" +#endif + #include "mpi.hpp" #include "netcdf.hpp" diff --git a/src/output/netcdf.hpp b/src/output/netcdf.hpp index 83625a6..e358426 100644 --- a/src/output/netcdf.hpp +++ b/src/output/netcdf.hpp @@ -23,8 +23,8 @@ extern "C" #endif #if !defined(USING_NETCDF_PAR) - #define NC_INDEPENDENT 0 - #define NC_COLLECTIVE 1 +#define NC_INDEPENDENT 0 +#define NC_COLLECTIVE 1 #endif namespace xios @@ -39,9 +39,9 @@ namespace xios return -1 ; #endif } - + inline int nc_open_par(const char *path, int mode, MPI_Comm comm, MPI_Info info,int *ncidp) - { + { #if defined(USING_NETCDF_PAR) return ::nc_open_par(path, mode, comm, info, ncidp) ; #else @@ -50,7 +50,7 @@ namespace xios return -1 ; #endif } - + inline int nc_var_par_access(int ncid, int varid, int par_access) { #if defined(USING_NETCDF_PAR) -- GitLab From 81677994c1c20d3a7f98b9fcacf4a666218c6be7 Mon Sep 17 00:00:00 2001 From: aclsce Date: Thu, 4 Dec 2014 14:36:07 +0000 Subject: [PATCH 10/31] - Added xios_variable as public type (in order to be used by the xios client) - Added example of getting/setting variable as global/local attribute of field/file in test_complete. - Some cleaning in test_complete program and xml files. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@529 d613d254-d18a-4304-b296-5125d4c4d670 --- inputs/COMPLETE/context_atmosphere.xml | 4 +- inputs/COMPLETE/context_surface.xml | 5 +- src/interface/fortran/ixios.F90 | 3 +- src/test/test_complete.f90 | 97 ++++++++++++++++---------- 4 files changed, 63 insertions(+), 46 deletions(-) diff --git a/inputs/COMPLETE/context_atmosphere.xml b/inputs/COMPLETE/context_atmosphere.xml index a42eb86..b2ce96f 100644 --- a/inputs/COMPLETE/context_atmosphere.xml +++ b/inputs/COMPLETE/context_atmosphere.xml @@ -1,6 +1,6 @@ - + @@ -25,6 +25,4 @@ - - diff --git a/inputs/COMPLETE/context_surface.xml b/inputs/COMPLETE/context_surface.xml index eae2ec7..0604758 100644 --- a/inputs/COMPLETE/context_surface.xml +++ b/inputs/COMPLETE/context_surface.xml @@ -23,7 +23,7 @@ @field_A_srf_max - file_6h + file_6h @@ -38,7 +38,6 @@ @field_A_srf_max - file_1d @@ -50,6 +49,4 @@ - - diff --git a/src/interface/fortran/ixios.F90 b/src/interface/fortran/ixios.F90 index 9f874fc..f5105e0 100644 --- a/src/interface/fortran/ixios.F90 +++ b/src/interface/fortran/ixios.F90 @@ -156,7 +156,8 @@ INTERFACE xios(setVar) END INTERFACE xios(setVar) PUBLIC :: txios(domain), txios(domaingroup),txios(field), txios(fieldgroup),txios(file), txios(filegroup), & - txios(grid), txios(gridgroup), txios(axis), txios(axisgroup),txios(context), txios(date),txios(time) + txios(grid), txios(gridgroup), txios(axis), txios(axisgroup),txios(context), txios(date), & + txios(time), txios(variable) PUBLIC :: xios(set_attr), xios(set_domain_attr), xios(set_domaingroup_attr), xios(set_fieldgroup_attr), & xios(set_field_attr), xios(set_file_attr), xios(set_filegroup_attr), & diff --git a/src/test/test_complete.f90 b/src/test/test_complete.f90 index 81b426d..a87a4e9 100644 --- a/src/test/test_complete.f90 +++ b/src/test/test_complete.f90 @@ -19,15 +19,16 @@ PROGRAM test_complete TYPE(xios_field) :: field_hdl TYPE(xios_fieldgroup) :: fieldgroup_hdl TYPE(xios_file) :: file_hdl + TYPE(xios_variable) :: var_hdl LOGICAL :: ok - CHARACTER(len=256) :: crname - + CHARACTER(len=256) :: crname, str_temp DOUBLE PRECISION,DIMENSION(ni_glo,nj_glo) :: lon_glo,lat_glo DOUBLE PRECISION :: field_A_glo(ni_glo,nj_glo,llm) DOUBLE PRECISION,ALLOCATABLE :: lon(:,:),lat(:,:),field_A_atm(:,:,:), field_A_srf(:,:), lonvalue(:) INTEGER, ALLOCATABLE :: kindex(:) INTEGER :: ni,ibegin,iend,nj,jbegin,jend INTEGER :: i,j,l,ts,n, nb_pt + INTEGER :: iret !!! MPI Initialization @@ -44,10 +45,10 @@ PROGRAM test_complete !########################################################################### -! Contexte ATM +! ATM Context !########################################################################### -!!! Initialisation des coordonnées globales et locales pour la grille régulière +!!! Initialization of global and local coordinates for regular grid DO j=1,nj_glo DO i=1,ni_glo @@ -76,7 +77,7 @@ PROGRAM test_complete field_A_atm(1:ni,1:nj,:)=field_A_glo(ibegin:iend,jbegin:jend,:) -!!! Context ATMOSPHERE +!!! ATMOSPHERE context CALL xios_context_initialize("atmosphere",comm) CALL xios_get_handle("atmosphere",ctx_hdl) @@ -96,31 +97,31 @@ PROGRAM test_complete CALL xios_set_domain_attr("domain_atm_zoom",data_dim=2, data_ibegin=-1, data_ni=ni+2, data_jbegin=-2, data_nj=nj+4) CALL xios_set_domain_attr("domain_atm_zoom",lonvalue=RESHAPE(lon,(/ni*nj/)),latvalue=RESHAPE(lat,(/ni*nj/))) -!!! Activation du groupe field_definition +!!! field_definition group activation CALL xios_set_fieldgroup_attr("field_definition",enabled=.TRUE.) -!!! Création d un nouveau champ +!!! Creation of new field CALL xios_get_handle("field_definition",fieldgroup_hdl) CALL xios_add_child(fieldgroup_hdl,field_hdl,"field_B_atm") -!!! Heritage des attributs d un autre champ +!!! Attribute inheritance from another field CALL xios_set_attr(field_hdl,field_ref="field_A_atm",name="field_B_atm") -!!! Affectation de ce nouveau champ au fichier avec un nouveau nom +!!! Assign new field into a file (with a new name) CALL xios_get_handle("output_atmosphere",file_hdl) CALL xios_add_child(file_hdl,field_hdl) CALL xios_set_attr(field_hdl,field_ref="field_B_atm",name="field_C_atm") -!!! Definition du timestep +!!! Timestep definition dtime%second=3600 CALL xios_set_timestep(dtime) -!!! Recupration des valeurs des longitudes et de taille des domaines locaux (pour test de fonctionnalité) +!!! Get longitude values and local domain sizes (to check functionality) ni=0 ; lonvalue(:)=0 CALL xios_get_domain_attr("domain_atm",ni=ni,lonvalue=lonvalue) @@ -128,36 +129,36 @@ PROGRAM test_complete PRINT *,"ni",ni PRINT *,"lonvalue",lonvalue ; -!!! Fin de la definition du contexte +!!! End of context definition CALL xios_close_context_definition() -!!! Test des valeurs des champs/fichiers +!!! Test on fields/files values - !!! Attribut defini ? + !!! Is an attribute defined ? CALL xios_is_defined_field_attr("field_A_atm",enabled=ok) PRINT *,"field_A_atm : attribute enabled is defined ? ",ok - !!! Recuperer la valeur d un attribut + !!! Get an attibute value CALL xios_get_field_attr("field_A_atm",name=crname) PRINT *,"field_A_atm : attribute name is : ",TRIM(crname) - !!! Champ actif (besoin de fournir la valeur) ? + !!! Is a field active (i.e need to give the value ) ? PRINT*,"field field_A_atm is active ? ",xios_field_is_active("field_A_atm") - !!! Champ defini ? + !!! Is a field defined ? PRINT*,"field field_A_atm is valid ?",xios_is_valid_field("field_A_atm") !########################################################################### -! Contexte SRF +! SRF Context !########################################################################### -!!! Initialisation des coordonnées globales et locales pour la grille indexee (1 point sur 2) +!!! Initialization of global and local coordinates for indexed grid (1 point every 2 points) nb_pt=ni*nj/2 ALLOCATE(kindex(nb_pt),field_A_srf(nb_pt,llm)) @@ -180,27 +181,48 @@ PROGRAM test_complete CALL xios_set_domain_attr("domain_srf",data_n_index=nb_pt, data_i_index=kindex) CALL xios_set_domain_attr("domain_srf",lonvalue=RESHAPE(lon,(/ni*nj/)),latvalue=RESHAPE(lat,(/ni*nj/))) -!!! Création d un nouveau champ +!!! Creation of new field CALL xios_get_handle("field_definition",fieldgroup_hdl) CALL xios_add_child(fieldgroup_hdl,field_hdl,"field_B_srf") -!!! Heritage des attributs d un autre champ +!!! Attribute inheritance from another field CALL xios_set_attr(field_hdl,field_ref="field_A_srf",name="field_B_srf") - -!!! Affectation de ce nouveau champ au fichier avec un nouveau nom + +!!! Assign new field into a file (with a new name) CALL xios_get_handle("output_surface",file_hdl) CALL xios_add_child(file_hdl,field_hdl) CALL xios_set_attr(field_hdl,field_ref="field_B_srf",name="field_C_srf") - -!!! Definition du timestep + +!!! Add a variable as field local attribute + + CALL xios_add_child(field_hdl,var_hdl,"my_local_attribute") + CALL xios_set_attr(var_hdl,type="string") + iret=xios_setVar("my_local_attribute","attribute_local") + +!!! Add a variable as file global attribute + + CALL xios_add_child(file_hdl,var_hdl,"my_global_attribute") + CALL xios_set_attr(var_hdl,type="string") + iret=xios_setVar("my_global_attribute","attribute_global") + +!!! Modify a variable used as attribute (defined in xml file) + + iret=xios_setVar("my_global_attribute_xml","6h_file") + +!!! Get the value of a variable (defined in xml file) + + iret=xios_getVar("my_attribute1",str_temp) + PRINT *, "my_attribute1 is :",TRIM(str_temp) + +!!! Timestep definition dtime%second=1800 CALL xios_set_timestep(dtime) -!!! Recupration des valeurs des longitudes et de taille des domaines locaux (pour test de fonctionnalité) +!!! Get longitude values and local domain sizes (to check functionality) ni=0 ; lonvalue(:)=0 CALL xios_get_domain_attr("domain_srf",ni=ni,lonvalue=lonvalue) @@ -208,13 +230,12 @@ PROGRAM test_complete PRINT *,"ni",ni PRINT *,"lonvalue",lonvalue ; -!!! Fin de la definition du contexte SRF +!!! End of SRF context definition CALL xios_close_context_definition() - !#################################################################################### -!!! Boucle temporelle +!!! Loop on timesteps !#################################################################################### DO ts=1,24*10 @@ -222,24 +243,24 @@ PROGRAM test_complete CALL xios_get_handle("atmosphere",ctx_hdl) CALL xios_set_current_context(ctx_hdl) -!!! Mise a jour du pas de temps +!!! Update of calendar CALL xios_update_calendar(ts) -!!! On donne la valeur du champ atm +!!! Put the value of atm field CALL xios_send_field("field_A_atm",field_A_atm) -!!! On change de contexte +!!! Change of context CALL xios_get_handle("surface",ctx_hdl) CALL xios_set_current_context(ctx_hdl) -!!! Mise a jour du pas de temps +!!! Update of calendar CALL xios_update_calendar(ts) -!!! On donne la valeur du champ srf +!!! Put the value of srf field CALL xios_send_field("field_A_srf",field_A_srf) @@ -247,17 +268,17 @@ PROGRAM test_complete ENDDO !#################################################################################### -!!! Finalisation +!!! Finalization !#################################################################################### -!!! Fin des contextes - +!!! End of contextes + CALL xios_context_finalize() CALL xios_get_handle("atmosphere",ctx_hdl) CALL xios_set_current_context(ctx_hdl) CALL xios_context_finalize() -!!! Fin de XIOS +!!! End of XIOS CALL xios_finalize() -- GitLab From d3076a167a4343edc6c1d7bae2cf3ca555e8059f Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 9 Dec 2014 12:02:34 +0000 Subject: [PATCH 11/31] Fix: String variable with whitespaces were incorrectly parsed. The strings were only parsed until the first whitespace was encountered. Note that leading and trailing whitespaces are removed by design. Also backport that fix to XIOS 1.0. This commit fixes ticket #60. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@530 d613d254-d18a-4304-b296-5125d4c4d670 --- src/node/variable.hpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/node/variable.hpp b/src/node/variable.hpp index 63cc709..be3fddb 100644 --- a/src/node/variable.hpp +++ b/src/node/variable.hpp @@ -97,16 +97,6 @@ namespace xios }; // class CVar - template<> - inline bool CVariable::getData(void) const - { - if (content.compare("true")==0 || content.compare(".true.")==0 || content.compare(".TRUE.")==0) return true ; - else if (content.compare("false")==0 || content.compare(".false.")==0 || content.compare(".FALSE.")==0) return false ; - else ERROR("CVariable::getdata()", - << "Cannot convert string <" << content << "> into type required" ); - return false ; - } - template inline T CVariable::getData(void) const { @@ -119,6 +109,20 @@ namespace xios return retval ; } + template<> + inline bool CVariable::getData(void) const + { + if (content.compare("true")==0 || content.compare(".true.")==0 || content.compare(".TRUE.")==0) return true ; + else if (content.compare("false")==0 || content.compare(".false.")==0 || content.compare(".FALSE.")==0) return false ; + else ERROR("CVariable::getdata()", + << "Cannot convert string <" << content << "> into type required" ); + return false ; + } + + template<> + inline std::string CVariable::getData(void) const + { return content; } + template<> inline void CVariable::setData(bool data) { -- GitLab From af7d3160205b55280355d2c4d096f9eb9abaf00a Mon Sep 17 00:00:00 2001 From: rlacroix Date: Thu, 11 Dec 2014 10:45:48 +0000 Subject: [PATCH 12/31] Backport r534 to XIOS 1.0: Add an error message when the timestep was not configured by the user. Previously no error message was displayed but the output file(s) was not written. Also improve the error message when the calendar type or the start date is missing. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@535 d613d254-d18a-4304-b296-5125d4c4d670 --- src/node/context.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/node/context.cpp b/src/node/context.cpp index a355ac3..94142b5 100644 --- a/src/node/context.cpp +++ b/src/node/context.cpp @@ -72,10 +72,18 @@ namespace xios { void CContext::solveCalendar(void) { if (this->calendar.get() != NULL) return; - if (calendar_type.isEmpty() || start_date.isEmpty()) + if (calendar_type.isEmpty()) ERROR(" CContext::solveCalendar(void)", << "[ context id = " << this->getId() << " ] " - << "Impossible to define a calendar (an attribute is missing)."); + << "Impossible to define a calendar: the calendar type is missing."); + if (start_date.isEmpty()) + ERROR(" CContext::solveCalendar(void)", + << "[ context id = " << this->getId() << " ] " + << "Impossible to define a calendar: the start date is missing."); + if (timestep.isEmpty()) + ERROR(" CContext::solveCalendar(void)", + << "[ context id = " << this->getId() << " ] " + << "Impossible to define a calendar: the timestep is missing."); #define DECLARE_CALENDAR(MType , mtype) \ if (calendar_type.getValue().compare(#mtype) == 0) \ @@ -85,8 +93,7 @@ namespace xios { (new C##MType##Calendar(start_date.getValue())); \ else this->calendar = boost::shared_ptr \ (new C##MType##Calendar(start_date.getValue(),time_origin.getValue())); \ - if (!this->timestep.isEmpty()) \ - this->calendar->setTimeStep \ + this->calendar->setTimeStep \ (CDuration::FromString(this->timestep.getValue())); \ return; \ } -- GitLab From b988d8808ae1b9db3bb4b348eff0759c81466943 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 16 Dec 2014 16:09:58 +0000 Subject: [PATCH 13/31] Fix: The conversion of a date to a number of seconds since the time origin was wrong. Remove the work around in nc4_data_output.cpp which hid this bug. Also backport this fix in XIOS 1.0. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@544 d613d254-d18a-4304-b296-5125d4c4d670 --- src/date.cpp | 2 +- src/date.hpp | 3 ++- src/output/nc4_data_output.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/date.cpp b/src/date.cpp index bd636f1..7794397 100644 --- a/src/date.cpp +++ b/src/date.cpp @@ -118,7 +118,7 @@ namespace xios CDate::operator Time(void) const // Non vérifiée, pas optimisée ... { // Todo : Tester si la date courante est supérieure à la date initiale. - Time retvalue = - relCalendar.getNbSecond(relCalendar.getInitDate()) + Time retvalue = - relCalendar.getNbSecond(relCalendar.getTimeOrigin()) + relCalendar.getNbSecond(*this); if ((relCalendar.getId().compare("D360") == 0) || diff --git a/src/date.hpp b/src/date.hpp index b0d11b1..7fb66f7 100644 --- a/src/date.hpp +++ b/src/date.hpp @@ -31,7 +31,8 @@ namespace xios friend StdOStream & operator<<(StdOStream & out, const CDate & date); friend StdIStream & operator>>(StdIStream & in, CDate & date); // Non testée. - operator Time(void) const; // Retourne le nombre de secondes écoulées depuis la date d'origine définie dans le calendrier. + //!< Return the number of seconds since the time origin fixed when creating the calendar + operator Time(void) const; /// Traitements /// bool checkDate(void); // Vérifie la validité de la date. diff --git a/src/output/nc4_data_output.cpp b/src/output/nc4_data_output.cpp index 4311325..c1675a7 100644 --- a/src/output/nc4_data_output.cpp +++ b/src/output/nc4_data_output.cpp @@ -939,15 +939,15 @@ namespace xios if (wtime) { - time_counter(0)= (Time(*field->last_Write_srv)+Time(*field->lastlast_Write_srv))/2 -Time(context->calendar->getTimeOrigin()); + time_counter(0)= (Time(*field->last_Write_srv) + Time(*field->lastlast_Write_srv)) / 2; if (field->foperation->timeType() == func::CFunctor::instant) - time_data(0) = Time(*field->last_Write_srv)-Time(context->calendar->getTimeOrigin()); + time_data(0) = Time(*field->last_Write_srv); else if (field->foperation->timeType() == func::CFunctor::centered) time_data(0) = time_counter(0); - time_counter_bound(0) = Time(*field->lastlast_Write_srv) - Time(context->calendar->getTimeOrigin()); - time_counter_bound(1) = Time(*field->last_Write_srv) - Time(context->calendar->getTimeOrigin()); + time_counter_bound(0) = Time(*field->lastlast_Write_srv); + time_counter_bound(1) = Time(*field->last_Write_srv); if (field->foperation->timeType() == func::CFunctor::instant) - time_data_bound(0) = time_data_bound(1) = Time(*field->last_Write_srv)-Time(context->calendar->getTimeOrigin()); + time_data_bound(0) = time_data_bound(1) = Time(*field->last_Write_srv); else if (field->foperation->timeType() == func::CFunctor::centered) { time_data_bound(0) = time_counter_bound(0); -- GitLab From 0924c3779424cb1723d58c84b4d6d1ee790ef34f Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 20 Jan 2015 08:35:32 +0000 Subject: [PATCH 14/31] Fix test_complete.f90 not to use INTEGER variable instead of LOGICAL variable. Depending on the compiler this could cause an error during compilation. Reported by Mike Rezny. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@547 d613d254-d18a-4304-b296-5125d4c4d670 --- src/test/test_complete.f90 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/test_complete.f90 b/src/test/test_complete.f90 index a87a4e9..42c814e 100644 --- a/src/test/test_complete.f90 +++ b/src/test/test_complete.f90 @@ -28,7 +28,6 @@ PROGRAM test_complete INTEGER, ALLOCATABLE :: kindex(:) INTEGER :: ni,ibegin,iend,nj,jbegin,jend INTEGER :: i,j,l,ts,n, nb_pt - INTEGER :: iret !!! MPI Initialization @@ -200,21 +199,21 @@ PROGRAM test_complete CALL xios_add_child(field_hdl,var_hdl,"my_local_attribute") CALL xios_set_attr(var_hdl,type="string") - iret=xios_setVar("my_local_attribute","attribute_local") + ok=xios_setVar("my_local_attribute","attribute_local") !!! Add a variable as file global attribute CALL xios_add_child(file_hdl,var_hdl,"my_global_attribute") CALL xios_set_attr(var_hdl,type="string") - iret=xios_setVar("my_global_attribute","attribute_global") + ok=xios_setVar("my_global_attribute","attribute_global") !!! Modify a variable used as attribute (defined in xml file) - iret=xios_setVar("my_global_attribute_xml","6h_file") + ok=xios_setVar("my_global_attribute_xml","6h_file") !!! Get the value of a variable (defined in xml file) - iret=xios_getVar("my_attribute1",str_temp) + ok=xios_getVar("my_attribute1",str_temp) PRINT *, "my_attribute1 is :",TRIM(str_temp) !!! Timestep definition -- GitLab From 74f8638b715948e483e36eae0a452f04cf719c05 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Fri, 23 Jan 2015 15:18:43 +0000 Subject: [PATCH 15/31] Backport r523 into the stable branch. Improve the message error handling by mimicking the behavior of the info/report logs. Output the error messages to the standart error message until the context is correctly initialized. Then, output the error messages to a file if the user has set "print_file" parameter to "true". - Fix: Errors that occured before MPI was initialized (e.g. during the config file parsing) caused a MPI error on top of the original error. - Fix: The error file could sometimes be misnamed if the error happened before the context was completely known. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@548 d613d254-d18a-4304-b296-5125d4c4d670 --- src/client.cpp | 119 ++++++++++++++++++++++++++++++---------------- src/client.hpp | 40 +++++++++------- src/cxios.cpp | 27 +++++++---- src/cxios.hpp | 5 +- src/exception.cpp | 28 +---------- src/log.cpp | 1 + src/log.hpp | 13 +++-- src/server.cpp | 112 +++++++++++++++++++++++++++++-------------- src/server.hpp | 89 ++++++++++++++++++---------------- 9 files changed, 258 insertions(+), 176 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 5ada09e..a58e83f 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -20,6 +20,7 @@ namespace xios bool CClient::is_MPI_Initialized ; int CClient::rank = INVALID_RANK; StdOFStream CClient::m_infoStream; + StdOFStream CClient::m_errorStream; void CClient::initialize(const string& codeId,MPI_Comm& localComm,MPI_Comm& returnComm) { @@ -232,46 +233,84 @@ namespace xios return rank; } - /*! - * \brief Open file stream to write in - * Opening a file stream with a specific file name suffix-client+rank - * \param [in] protype file name - */ - void CClient::openInfoStream(const StdString& fileName) - { - std::filebuf* fb = m_infoStream.rdbuf(); - StdStringStream fileNameClient; - int numDigit = 0; - int size = 0; - MPI_Comm_size(CXios::globalComm, &size); - while (size) - { - size /= 10; - ++numDigit; - } - - fileNameClient << fileName << "_" << std::setfill('0') << std::setw(numDigit) << getRank() << ".out"; - fb->open(fileNameClient.str().c_str(), std::ios::out); - if (!fb->is_open()) - ERROR("void CClient::openInfoStream(const StdString& fileName)", - < file to write" ); - - info.write2File(fb); - report.write2File(fb); - } - - //! Write out to standard output - void CClient::openInfoStream() - { - info.write2StdOut(); - report.write2StdOut(); - } - - //! Close file if it opens - void CClient::closeInfoStream() - { - if (m_infoStream.is_open()) m_infoStream.close(); - } + /*! + * Open a file specified by a suffix and an extension and use it for the given file buffer. + * The file name will be suffix+rank+extension. + * + * \param fileName[in] protype file name + * \param ext [in] extension of the file + * \param fb [in/out] the file buffer + */ + void CClient::openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb) + { + StdStringStream fileNameClient; + int numDigit = 0; + int size = 0; + MPI_Comm_size(CXios::globalComm, &size); + while (size) + { + size /= 10; + ++numDigit; + } + + fileNameClient << fileName << "_" << std::setfill('0') << std::setw(numDigit) << getRank() << ext; + fb->open(fileNameClient.str().c_str(), std::ios::out); + if (!fb->is_open()) + ERROR("void CClient::openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb)", + << std::endl << "Can not open <" << fileNameClient << "> file to write the client log(s)."); + } + + /*! + * \brief Open a file stream to write the info logs + * Open a file stream with a specific file name suffix+rank + * to write the info logs. + * \param fileName [in] protype file name + */ + void CClient::openInfoStream(const StdString& fileName) + { + std::filebuf* fb = m_infoStream.rdbuf(); + openStream(fileName, ".out", fb); + + info.write2File(fb); + report.write2File(fb); + } + //! Write the info logs to standard output + void CClient::openInfoStream() + { + info.write2StdOut(); + report.write2StdOut(); + } + //! Close the info logs file if it opens + void CClient::closeInfoStream() + { + if (m_infoStream.is_open()) m_infoStream.close(); + } + + /*! + * \brief Open a file stream to write the error log + * Open a file stream with a specific file name suffix+rank + * to write the error log. + * \param fileName [in] protype file name + */ + void CClient::openErrorStream(const StdString& fileName) + { + std::filebuf* fb = m_errorStream.rdbuf(); + openStream(fileName, ".err", fb); + + error.write2File(fb); + } + + //! Write the error log to standard error output + void CClient::openErrorStream() + { + error.write2StdErr(); + } + + //! Close the error log file if it opens + void CClient::closeErrorStream() + { + if (m_errorStream.is_open()) m_errorStream.close(); + } } diff --git a/src/client.hpp b/src/client.hpp index ef29ad3..3b26831 100644 --- a/src/client.hpp +++ b/src/client.hpp @@ -8,32 +8,40 @@ namespace xios { class CClient { - public: + public: + static void initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm); + static void finalize(void); + static void registerContext(const string& id, MPI_Comm contextComm); - static void initialize(const string& codeId,MPI_Comm& localComm,MPI_Comm& returnComm) ; - static void finalize(void) ; - static void registerContext(const string& id,MPI_Comm contextComm) ; + static MPI_Comm intraComm; + static MPI_Comm interComm; + static int serverLeader; + static bool is_MPI_Initialized ; - static MPI_Comm intraComm ; - static MPI_Comm interComm ; - static int serverLeader; - static bool is_MPI_Initialized ; - - public: + //! Get rank of the current process static int getRank(); + //! Open a file stream to write the info logs static void openInfoStream(const StdString& fileName); - + //! Write the info logs to standard output static void openInfoStream(); - + //! Close the info logs file if it opens static void closeInfoStream(); - protected: - static int rank; - static StdOFStream m_infoStream; + //! Open a file stream to write the error log + static void openErrorStream(const StdString& fileName); + //! Write the error log to standard error output + static void openErrorStream(); + //! Close the error log file if it opens + static void closeErrorStream(); + protected: + static int rank; + static StdOFStream m_infoStream; + static StdOFStream m_errorStream; - } ; + static void openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb); + }; } #endif diff --git a/src/cxios.cpp b/src/cxios.cpp index 89a0e4d..b215021 100644 --- a/src/cxios.cpp +++ b/src/cxios.cpp @@ -26,8 +26,7 @@ namespace xios double CXios::bufferServerFactorSize=2 ; size_t CXios::defaultBufferSize=1024*1024*100 ; // 100Mo double CXios::defaultBufferServerFactorSize=2 ; - bool CXios::printInfo2File; - bool CXios::isServerSide; + bool CXios::printLogs2Files; void CXios::initialize() @@ -37,7 +36,7 @@ namespace xios usingOasis=getin("using_oasis",false) ; usingServer=getin("using_server",false) ; info.setLevel(getin("info_level",0)) ; - printInfo2File=getin("print_file",false); + printLogs2Files=getin("print_file",false); bufferSize=getin("buffer_size",defaultBufferSize) ; bufferServerFactorSize=getin("buffer_server_factor_size",defaultBufferServerFactorSize) ; globalComm=MPI_COMM_WORLD ; @@ -53,13 +52,19 @@ namespace xios CClient::initialize(codeId,localComm,returnComm) ; - if (usingServer) isServerSide = isServer=false; - else isServerSide = isServer=true; + if (usingServer) isServer=false; + else isServer=true; - if (printInfo2File) + if (printLogs2Files) + { CClient::openInfoStream(clientFile); + CClient::openErrorStream(clientFile); + } else + { CClient::openInfoStream(); + CClient::openErrorStream(); + } } void CXios::clientFinalize(void) @@ -81,15 +86,19 @@ namespace xios isClient=true; isServer=false ; - isServerSide = true; - // Initialize all aspects MPI CServer::initialize(); - if (printInfo2File) + if (printLogs2Files) + { CServer::openInfoStream(serverFile); + CServer::openErrorStream(serverFile); + } else + { CServer::openInfoStream(); + CServer::openErrorStream(); + } // Enter the loop to listen message from Client CServer::eventLoop(); diff --git a/src/cxios.hpp b/src/cxios.hpp index 55e25f1..12ba432 100644 --- a/src/cxios.hpp +++ b/src/cxios.hpp @@ -34,7 +34,7 @@ namespace xios static MPI_Comm globalComm ; - static bool printInfo2File; + static bool printLogs2Files; //!< Printing out logs into files static bool usingOasis ; static bool usingServer ; static size_t bufferSize ; @@ -49,9 +49,6 @@ namespace xios //! Setting xios NOT to use server mode static void setNotUsingServer(); - //! A silly variable to detect whether one process is in client or server side. Should be removed on refactoring code - static bool isServerSide; - } ; } diff --git a/src/exception.cpp b/src/exception.cpp index 7bfbeb5..bc765d8 100644 --- a/src/exception.cpp +++ b/src/exception.cpp @@ -5,6 +5,7 @@ #include "client.hpp" #include "server.hpp" #include "cxios.hpp" +#include "log.hpp" namespace xios { @@ -33,34 +34,9 @@ namespace xios } #else { - int numDigit = 0; - int size = 0; - MPI_Comm_size(CXios::globalComm, &size); - while (size) - { - size /= 10; - ++numDigit; - } - - StdOFStream fileStream; - StdStringStream fileNameErr; - std::streambuf* psbuf; - if (CXios::isServerSide) - fileNameErr << CXios::serverFile << "_" << std::setfill('0') - << std::setw(numDigit) << CServer::getRank() << ".err"; - else - fileNameErr << CXios::clientFile << "_" << std::setfill('0') - << std::setw(numDigit) << CClient::getRank() << ".err"; - - - fileStream.open(fileNameErr.str().c_str(), std::ofstream::out); - psbuf = fileStream.rdbuf(); - std::cerr.rdbuf(psbuf); - std::cerr << this->getMessage() << std::endl; - fileStream.close(); + error << this->getMessage() << std::endl; abort(); } - #endif } diff --git a/src/log.cpp b/src/log.cpp index c851603..d0d56fa 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -4,4 +4,5 @@ namespace xios { CLog info("info") ; CLog report("report") ; + CLog error("error", cerr.rdbuf()) ; } diff --git a/src/log.hpp b/src/log.hpp index d03088c..f31573a 100644 --- a/src/log.hpp +++ b/src/log.hpp @@ -12,7 +12,8 @@ namespace xios class CLog : public ostream { public : - CLog(const string& name_) : ostream(cout.rdbuf()),level(0),name(name_), strBuf_(cout.rdbuf()) {} + CLog(const string& name_, std::streambuf* sBuff = cout.rdbuf()) + : ostream(sBuff), level(0), name(name_), strBuf_(sBuff) {} CLog& operator()(int l) { if (l<=level) @@ -29,11 +30,15 @@ namespace xios bool isActive(int l) {if (l<=level) return true ; else return false ; } public: - //! Write info into a file with its streambuf + //! Write log into a file with its streambuf void write2File(std::streambuf* sBuff) { changeStreamBuff(sBuff); } - //! Write info into standard output + //! Write log into standard output void write2StdOut() { changeStreamBuff(cout.rdbuf()); } + + //! Write log into standard error output + void write2StdErr() { changeStreamBuff(cerr.rdbuf()); } + private: /*! * \brief Change current streambuf (by default std::cout) to new one @@ -42,7 +47,6 @@ namespace xios */ void changeStreamBuff(std::streambuf* sBuff) { strBuf_ = sBuff; rdbuf(sBuff); } - private : int level ; string name ; std::streambuf* strBuf_; @@ -50,5 +54,6 @@ namespace xios extern CLog info; extern CLog report; + extern CLog error; } #endif diff --git a/src/server.cpp b/src/server.cpp index 8fb1ed8..732c01b 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -20,6 +20,7 @@ namespace xios bool CServer::isRoot ; int CServer::rank = INVALID_RANK; StdOFStream CServer::m_infoStream; + StdOFStream CServer::m_errorStream; map CServer::contextList ; bool CServer::finished=false ; bool CServer::is_MPI_Initialized ; @@ -406,45 +407,84 @@ namespace xios return rank; } - /*! - * \brief Open file stream to write in - * Opening a file stream with a specific file name suffix-server+rank - * \param [in] protype file name - */ - void CServer::openInfoStream(const StdString& fileName) - { - std::filebuf* fb = m_infoStream.rdbuf(); - StdStringStream fileNameServer; - int numDigit = 0; - int size = 0; - MPI_Comm_size(CXios::globalComm, &size); - while (size) - { - size /= 10; - ++numDigit; - } + /*! + * Open a file specified by a suffix and an extension and use it for the given file buffer. + * The file name will be suffix+rank+extension. + * + * \param fileName[in] protype file name + * \param ext [in] extension of the file + * \param fb [in/out] the file buffer + */ + void CServer::openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb) + { + StdStringStream fileNameClient; + int numDigit = 0; + int size = 0; + MPI_Comm_size(CXios::globalComm, &size); + while (size) + { + size /= 10; + ++numDigit; + } - fileNameServer << fileName <<"_" << std::setfill('0') << std::setw(numDigit) << getRank() << ".out"; - fb->open(fileNameServer.str().c_str(), std::ios::out); - if (!fb->is_open()) - ERROR("void CServer::openInfoStream(const StdString& fileName)", - < file to write" ); + fileNameClient << fileName << "_" << std::setfill('0') << std::setw(numDigit) << getRank() << ext; + fb->open(fileNameClient.str().c_str(), std::ios::out); + if (!fb->is_open()) + ERROR("void CServer::openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb)", + << std::endl << "Can not open <" << fileNameClient << "> file to write the server log(s)."); + } - info.write2File(fb); - report.write2File(fb); - } + /*! + * \brief Open a file stream to write the info logs + * Open a file stream with a specific file name suffix+rank + * to write the info logs. + * \param fileName [in] protype file name + */ + void CServer::openInfoStream(const StdString& fileName) + { + std::filebuf* fb = m_infoStream.rdbuf(); + openStream(fileName, ".out", fb); - //! Open stream for standard output - void CServer::openInfoStream() - { - info.write2StdOut(); - report.write2StdOut(); - } + info.write2File(fb); + report.write2File(fb); + } - //! Close opening stream - void CServer::closeInfoStream() - { - if (m_infoStream.is_open()) m_infoStream.close(); - } + //! Write the info logs to standard output + void CServer::openInfoStream() + { + info.write2StdOut(); + report.write2StdOut(); + } + + //! Close the info logs file if it opens + void CServer::closeInfoStream() + { + if (m_infoStream.is_open()) m_infoStream.close(); + } + + /*! + * \brief Open a file stream to write the error log + * Open a file stream with a specific file name suffix+rank + * to write the error log. + * \param fileName [in] protype file name + */ + void CServer::openErrorStream(const StdString& fileName) + { + std::filebuf* fb = m_errorStream.rdbuf(); + openStream(fileName, ".err", fb); + error.write2File(fb); + } + + //! Write the error log to standard error output + void CServer::openErrorStream() + { + error.write2StdErr(); + } + + //! Close the error log file if it opens + void CServer::closeErrorStream() + { + if (m_errorStream.is_open()) m_errorStream.close(); + } } diff --git a/src/server.hpp b/src/server.hpp index 73d351f..7604578 100644 --- a/src/server.hpp +++ b/src/server.hpp @@ -10,52 +10,59 @@ namespace xios { class CServer { - public: - - static void initialize(void) ; - static void finalize(void) ; - static void eventLoop(void) ; - static void contextEventLoop(void) ; - static void listenContext(void) ; - static void listenFinalize(void) ; - static void recvContextMessage(void* buff,int count) ; - static void listenRootContext(void) ; - static void listenRootFinalize(void) ; - static void registerContext(void* buff,int count, int leaderRank=0) ; - - static MPI_Comm intraComm ; - static list interComm ; - static CEventScheduler* eventScheduler ; - - struct contextMessage - { - int nbRecv ; - int leaderRank ; - } ; - - static bool isRoot ; - - static map contextList ; - static bool finished ; - static bool is_MPI_Initialized ; - - public: - //! Get rank of the current process - static int getRank(); - - //! Print Information into a file - static void openInfoStream(const StdString& fileName); + public: + static void initialize(void); + static void finalize(void); + static void eventLoop(void); + static void contextEventLoop(void); + static void listenContext(void); + static void listenFinalize(void); + static void recvContextMessage(void* buff,int count); + static void listenRootContext(void); + static void listenRootFinalize(void); + static void registerContext(void* buff,int count, int leaderRank=0); - //! Print information to standard output - static void openInfoStream(); + static MPI_Comm intraComm; + static list interComm; + static CEventScheduler* eventScheduler; + + struct contextMessage + { + int nbRecv; + int leaderRank; + }; + + static bool isRoot; + + static map contextList; + static bool finished; + static bool is_MPI_Initialized; - //! Close Info stream (closing file) + public: + //! Get rank of the current process + static int getRank(); + + //! Open a file stream to write the info logs + static void openInfoStream(const StdString& fileName); + //! Write the info logs to standard output + static void openInfoStream(); + //! Close the info logs file if it opens static void closeInfoStream(); - private: + //! Open a file stream to write the error log + static void openErrorStream(const StdString& fileName); + //! Write the error log to standard error output + static void openErrorStream(); + //! Close the error log file if it opens + static void closeErrorStream(); + + private: + static int rank; static StdOFStream m_infoStream; - static int rank ; - } ; + static StdOFStream m_errorStream; + + static void openStream(const StdString& fileName, const StdString& ext, std::filebuf* fb); + }; } #endif -- GitLab From 4d5fdf888c31250a57fe1719dfbec4076e5dbd41 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 24 Feb 2015 08:50:14 +0000 Subject: [PATCH 16/31] Fix incorrect output values when using a field_ref or the @ operator on a field computed from an operation. The computed values were never transmitted from the source field to the destination field. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@562 d613d254-d18a-4304-b296-5125d4c4d670 --- inputs/COMPLETE/context_surface.xml | 65 +-- src/node/field.cpp | 769 ++++++++++++++-------------- 2 files changed, 412 insertions(+), 422 deletions(-) diff --git a/inputs/COMPLETE/context_surface.xml b/inputs/COMPLETE/context_surface.xml index 0604758..d82b14a 100644 --- a/inputs/COMPLETE/context_surface.xml +++ b/inputs/COMPLETE/context_surface.xml @@ -1,52 +1,57 @@ - + + field_A_srf + 273.15 + - field_A_srf + field_C_srf - + field_A_srf + field_C_srf - + - - - surf_att - 10 - 6.8 - 100.201 + + + surf_att + 10 + 6.8 + 100.201 + + field_A_srf_K + @field_A_srf_K + - - @field_A_srf_max - file_6h + + @field_A_srf_max + file_6h - - - surf_att - 10 - 6.8 - 100.201 + + + surf_att + 10 + 6.8 + 100.201 - - @field_A_srf_max + + @field_A_srf_max - - - - - - - - - + + + + + + + + + diff --git a/src/node/field.cpp b/src/node/field.cpp index a1de6f6..3d4f140 100644 --- a/src/node/field.cpp +++ b/src/node/field.cpp @@ -13,7 +13,7 @@ #include namespace xios{ - + /// ////////////////////// Définitions ////////////////////// /// CField::CField(void) @@ -26,9 +26,9 @@ namespace xios{ , foperation(), hasInstantData(false), hasExpression(false) , active(false) , hasOutputFile(false),hasFieldOut(false), slotUpdateDate(NULL) , processed(false) - { setVirtualVariableGroup() ; } + { setVirtualVariableGroup(); } - CField::CField(const StdString & id) + CField::CField(const StdString& id) : CObjectTemplate(id), CFieldAttributes() , refObject(), baseRefObject() , grid(), file() @@ -38,65 +38,63 @@ namespace xios{ , foperation(), hasInstantData(false), hasExpression(false) , active(false), hasOutputFile(false), hasFieldOut(false), slotUpdateDate(NULL) , processed(false) - { setVirtualVariableGroup() ; } + { setVirtualVariableGroup(); } CField::~CField(void) { -// this->grid.reset() ; -// this->file.reset() ; - this->foperation.reset() ; - if (hasExpression) delete expression ; - if (slotUpdateDate!=NULL) delete slotUpdateDate ; - - } +// this->grid.reset(); +// this->file.reset(); + this->foperation.reset(); + if (hasExpression) delete expression; + if (slotUpdateDate != NULL) delete slotUpdateDate; + } //---------------------------------------------------------------- void CField::setVirtualVariableGroup(CVariableGroup* newVVariableGroup) - { - this->vVariableGroup = newVVariableGroup; + { + this->vVariableGroup = newVVariableGroup; } - + void CField::setVirtualVariableGroup(void) { this->setVirtualVariableGroup(CVariableGroup::create()); } - + CVariableGroup* CField::getVirtualVariableGroup(void) const { - return (this->vVariableGroup); + return this->vVariableGroup; } - std::vector CField::getAllVariables(void) const { - return (this->vVariableGroup->getAllChildren()); + return this->vVariableGroup->getAllChildren(); } - - void CField::solveDescInheritance(bool apply, const CAttributeMap * const parent) + + void CField::solveDescInheritance(bool apply, const CAttributeMap* const parent) { SuperClassAttribute::setAttributes(parent,apply); this->getVirtualVariableGroup()->solveDescInheritance(apply, NULL); } - //---------------------------------------------------------------- + //---------------------------------------------------------------- bool CField::updateDataServer - (const CDate & currDate, + (const CDate& currDate, const std::deque< CArray* > storedClient) { const CDate opeDate = *last_operation + freq_operation; - const CDate writeDate = *last_Write + freq_write; - + const CDate writeDate = *last_Write + freq_write; + if (opeDate <= currDate) { if (this->data.numElements() != this->grid->storeIndex[0]->numElements()) { - this->data.resize(this->grid->storeIndex[0] ->numElements()); - } - CArray input(data.numElements()) ; - this->grid->inputFieldServer(storedClient, input); + this->data.resize(this->grid->storeIndex[0]->numElements()); + } + CArray input(data.numElements()); + this->grid->inputFieldServer(storedClient, input); (*this->foperation)(input); *last_operation = currDate; } @@ -105,137 +103,135 @@ namespace xios{ this->foperation->final(); this->incrementNStep(); *last_Write = writeDate; - return (true); + return true; } - return (false); + return false; } - + bool CField::dispatchEvent(CEventServer& event) { - - if (SuperClass::dispatchEvent(event)) return true ; + + if (SuperClass::dispatchEvent(event)) return true; else { switch(event.type) { case EVENT_ID_UPDATE_DATA : - recvUpdateData(event) ; - return true ; - break ; + recvUpdateData(event); + return true; + break; case EVENT_ID_ADD_VARIABLE : - recvAddVariable(event) ; - return true ; - break ; - + recvAddVariable(event); + return true; + break; + case EVENT_ID_ADD_VARIABLE_GROUP : - recvAddVariableGroup(event) ; - return true ; - break ; - + recvAddVariableGroup(event); + return true; + break; + default : - ERROR("bool CField::dispatchEvent(CEventServer& event)",<<"Unknown Event") ; - return false ; + ERROR("bool CField::dispatchEvent(CEventServer& event)", << "Unknown Event"); + return false; } } } - + void CField::sendUpdateData(void) { - CContext* context = CContext::getCurrent() ; - CContextClient* client=context->client ; - - CEventClient event(getType(),EVENT_ID_UPDATE_DATA) ; - - map* >::iterator it ; - list > list_msg ; - list< CArray* > list_data ; - - for(it=grid->storeIndex_toSrv.begin();it!=grid->storeIndex_toSrv.end();it++) + CContext* context = CContext::getCurrent(); + CContextClient* client = context->client; + + CEventClient event(getType(),EVENT_ID_UPDATE_DATA); + + map* >::iterator it; + list > list_msg; + list< CArray* > list_data; + + for (it = grid->storeIndex_toSrv.begin(); it != grid->storeIndex_toSrv.end(); it++) { - int rank=(*it).first ; - CArray& index = *(it->second) ; - CArray data_tmp(index.numElements()) ; - - for(int n=0;n(new CMessage)) ; - list_data.push_back(new CArray(data_tmp)) ; - *list_msg.back()<nbSenders[rank],*list_msg.back()) ; + int rank = (*it).first; + CArray& index = *(it->second); + CArray data_tmp(index.numElements()); + + for (int n = 0; n < data_tmp.numElements(); n++) data_tmp(n) = data(index(n)); + list_msg.push_back(shared_ptr(new CMessage)); + list_data.push_back(new CArray(data_tmp)); + *list_msg.back() << getId() << *list_data.back(); + event.push(rank,grid->nbSenders[rank],*list_msg.back()); } - client->sendEvent(event) ; - - for(list< CArray* >::iterator it=list_data.begin();it!=list_data.end();it++) delete *it ; + client->sendEvent(event); + + for (list< CArray* >::iterator it = list_data.begin(); it != list_data.end(); it++) delete *it; } - + void CField::recvUpdateData(CEventServer& event) { - vector ranks ; - vector buffers ; - - list::iterator it ; - string fieldId ; + vector ranks; + vector buffers; + + list::iterator it; + string fieldId; - for (it=event.subEvents.begin();it!=event.subEvents.end();++it) + for (it = event.subEvents.begin(); it != event.subEvents.end(); ++it) { - int rank=it->rank; - CBufferIn* buffer=it->buffer; - *buffer>>fieldId ; - ranks.push_back(rank) ; - buffers.push_back(buffer) ; + int rank = it->rank; + CBufferIn* buffer = it->buffer; + *buffer >> fieldId; + ranks.push_back(rank); + buffers.push_back(buffer); } - get(fieldId)->recvUpdateData(ranks,buffers) ; + get(fieldId)->recvUpdateData(ranks,buffers); } - + void CField::recvUpdateData(vector& ranks, vector& buffers) { - + if (data_srv.empty()) { - for(map* >::iterator it=grid->out_i_fromClient.begin();it!=grid->out_i_fromClient.end();it++) + for (map* >::iterator it = grid->out_i_fromClient.begin(); it != grid->out_i_fromClient.end(); it++) { - int rank=it->first ; - CArray data_tmp(it->second->numElements()) ; - data_srv.insert( pair* >(rank, new CArray(data_tmp) ) ) ; - foperation_srv.insert(pair >(rank,boost::shared_ptr(new func::CInstant(*data_srv[rank])))) ; + int rank = it->first; + CArray data_tmp(it->second->numElements()); + data_srv.insert( pair* >(rank, new CArray(data_tmp))); + foperation_srv.insert(pair >(rank,boost::shared_ptr(new func::CInstant(*data_srv[rank])))); } } - CContext* context = CContext::getCurrent() ; - const CDate & currDate = context->getCalendar()->getCurrentDate(); + CContext* context = CContext::getCurrent(); + const CDate& currDate = context->getCalendar()->getCurrentDate(); const CDate opeDate = *last_operation_srv + freq_operation_srv; - const CDate writeDate = *last_Write_srv + freq_write_srv; - + const CDate writeDate = *last_Write_srv + freq_write_srv; - if (opeDate <= currDate) { - for(int n=0;n data_tmp ; - *buffers[n]>>data_tmp ; - (*foperation_srv[ranks[n]])(data_tmp) ; + CArray data_tmp; + *buffers[n] >> data_tmp; + (*foperation_srv[ranks[n]])(data_tmp); } *last_operation_srv = currDate; } - + if (writeDate < (currDate + freq_operation_srv)) { - for(int n=0;nfoperation_srv[ranks[n]]->final(); } - + *last_Write_srv = writeDate; - writeField() ; - *lastlast_Write_srv=*last_Write_srv; + writeField(); + *lastlast_Write_srv = *last_Write_srv; } } - + void CField::writeField(void) { - if (! getRelFile()->allDomainEmpty ) - if (! grid->domain->isEmpty() || getRelFile()->type == CFile::type_attr::one_file) + if (!getRelFile()->allDomainEmpty) + if (!grid->domain->isEmpty() || getRelFile()->type == CFile::type_attr::one_file) { getRelFile()->checkFile(); this->incrementNStep(); @@ -245,44 +241,44 @@ namespace xios{ //---------------------------------------------------------------- void CField::setRelFile(CFile* _file) - { + { this->file = _file; - hasOutputFile=true ; + hasOutputFile = true; } //---------------------------------------------------------------- - StdString CField::GetName(void) { return (StdString("field")); } - StdString CField::GetDefName(void){ return (CField::GetName()); } - ENodeType CField::GetType(void) { return (eField); } + StdString CField::GetName(void) { return StdString("field"); } + StdString CField::GetDefName(void) { return CField::GetName(); } + ENodeType CField::GetType(void) { return eField; } //---------------------------------------------------------------- CGrid* CField::getRelGrid(void) const - { - return (this->grid); + { + return this->grid; } //---------------------------------------------------------------- CFile* CField::getRelFile(void) const - { - return (this->file); + { + return this->file; } - + StdSize CField::getNStep(void) const { - return (this->nstep); + return this->nstep; } - + void CField::incrementNStep(void) { this->nstep++; } - + void CField::resetNStep(void) { - this->nstep=0; + this->nstep = 0; } //---------------------------------------------------------------- @@ -290,70 +286,70 @@ namespace xios{ CField* CField::getDirectFieldReference(void) const { if (this->field_ref.isEmpty()) - return (this->getBaseFieldReference()); + return this->getBaseFieldReference(); - if (! CField::has(this->field_ref.getValue())) + if (!CField::has(this->field_ref.getValue())) ERROR("CField::getDirectFieldReference(void)", << "[ ref_name = " << this->field_ref.getValue() << "]" << " invalid field name !"); - return (CField::get(this->field_ref.getValue())); + return CField::get(this->field_ref.getValue()); } //---------------------------------------------------------------- CField* CField::getBaseFieldReference(void) const - { - return (baseRefObject); + { + return baseRefObject; } //---------------------------------------------------------------- - const std::vector& CField::getAllReference(void) const - { - return (refObject); + const std::vector& CField::getAllReference(void) const + { + return refObject; } //---------------------------------------------------------------- - const StdString & CField::getBaseFieldId(void) const - { - return (this->getBaseFieldReference()->getId()); + const StdString& CField::getBaseFieldId(void) const + { + return this->getBaseFieldReference()->getId(); } - + //---------------------------------------------------------------- - - const CDuration & CField::getFreqOperation(void) const + + const CDuration& CField::getFreqOperation(void) const { - return (this->freq_operation); + return this->freq_operation; } - + //---------------------------------------------------------------- - const CDuration & CField::getFreqWrite(void) const + const CDuration& CField::getFreqWrite(void) const { - return (this->freq_write); + return this->freq_write; } - + //---------------------------------------------------------------- - + boost::shared_ptr CField::getFieldOperation(void) const { - return (this->foperation); + return this->foperation; } //---------------------------------------------------------------- bool CField::hasDirectFieldReference(void) const - { - return (!this->field_ref.isEmpty()); + { + return !this->field_ref.isEmpty(); } - + bool CField::isActive(void) const - { - return (!this->refObject.empty()); + { + return !this->refObject.empty(); } //---------------------------------------------------------------- - + CArray CField::getData(void) const { return(this->data); @@ -379,15 +375,15 @@ namespace xios{ { if (!processed) { - processed=true ; - solveRefInheritance(true) ; - solveBaseReference() ; - solveOperation() ; - solveGridReference() ; - - if (hasDirectFieldReference()) baseRefObject->processEnabledField() ; - buildExpression(); - active=true; + processed = true; + solveRefInheritance(true); + solveBaseReference(); + solveOperation(); + solveGridReference(); + + if (hasDirectFieldReference()) baseRefObject->processEnabledField(); + buildExpression(); + active = true; } } @@ -395,8 +391,8 @@ namespace xios{ { std::set sset; CField* refer_sptr; - CField * refer_ptr = this; - + CField* refer_ptr = this; + while (refer_ptr->hasDirectFieldReference()) { refer_sptr = refer_ptr->getDirectFieldReference(); @@ -412,18 +408,17 @@ namespace xios{ SuperClassAttribute::setAttributes(refer_ptr, apply); sset.insert(refer_ptr); } - } void CField::solveBaseReference(void) { std::set sset; CField* refer_sptr; - CField * refer_ptr = this; - + CField* refer_ptr = this; + if (this->hasDirectFieldReference()) baseRefObject = getDirectFieldReference(); else baseRefObject = CField::get(this); - + while (refer_ptr->hasDirectFieldReference()) { refer_sptr = refer_ptr->getDirectFieldReference(); @@ -438,34 +433,34 @@ namespace xios{ sset.insert(refer_ptr); } - - if (hasDirectFieldReference()) baseRefObject->addReference(this) ; + + if (hasDirectFieldReference()) baseRefObject->addReference(this); } - + //---------------------------------------------------------------- void CField::solveOperation(void) { using namespace func; - - if (!hasOutputFile && !hasFieldOut) return ; - - StdString id ; - if (hasId()) id=getId(); - else if (!name.isEmpty()) id=name ; - else if (hasDirectFieldReference()) id=baseRefObject->getId() ; - + + if (!hasOutputFile && !hasFieldOut) return; + + StdString id; + if (hasId()) id = getId(); + else if (!name.isEmpty()) id = name; + else if (hasDirectFieldReference()) id = baseRefObject->getId(); + CContext* context = CContext::getCurrent(); - - if (freq_op.isEmpty()) freq_op=string("1ts") ; - - if (operation.isEmpty() ) + + if (freq_op.isEmpty()) freq_op = string("1ts"); + + if (operation.isEmpty()) { ERROR("CField::solveOperation(void)", << "[ id = " << id << "]" << "Impossible to define an operation for this field !"); } - + CDuration freq_offset_ = NoneDu; if (!freq_offset.isEmpty()) { @@ -474,14 +469,14 @@ namespace xios{ else { freq_offset.setValue(NoneDu.toString()); - } + } // if (CXIOSManager::GetStatus() == CXIOSManager::LOC_SERVER) if (context->hasServer) { - if (hasOutputFile) + if (hasOutputFile) { - this->freq_operation_srv =CDuration::FromString(this->file->output_freq.getValue()); + this->freq_operation_srv = CDuration::FromString(this->file->output_freq.getValue()); this->freq_write_srv = CDuration::FromString(this->file->output_freq.getValue()); } this->lastlast_Write_srv = boost::shared_ptr @@ -492,19 +487,19 @@ namespace xios{ (new CDate(context->getCalendar()->getInitDate())); // this->foperation_srv = // boost::shared_ptr(new CInstant(this->data_srv)); - - if (hasOutputFile) + + if (hasOutputFile) { - const CDuration toffset = this->freq_operation_srv - freq_offset_ - context->getCalendar()->getTimeStep(); + const CDuration toffset = this->freq_operation_srv - freq_offset_ - context->getCalendar()->getTimeStep(); *this->last_operation_srv = *this->last_operation_srv - toffset; } } - + // if (context->hasClient) -// { +// { this->freq_operation = CDuration::FromString(freq_op.getValue()); if (hasOutputFile) this->freq_write = CDuration::FromString(this->file->output_freq.getValue()); - if (hasFieldOut) + if (hasFieldOut) { this->freq_write = CDuration::FromString(this->fieldOut->freq_op.getValue()); } @@ -512,19 +507,18 @@ namespace xios{ (new CDate(context->getCalendar()->getInitDate())); this->last_operation = boost::shared_ptr (new CDate(context->getCalendar()->getInitDate())); - - const CDuration toffset = this->freq_operation - freq_offset_ - context->getCalendar()->getTimeStep(); - *this->last_operation = *this->last_operation - toffset; - - if (operation.get()=="once") isOnceOperation=true ; - else isOnceOperation=false; - isFirstOperation=true; - - -#define DECLARE_FUNCTOR(MType, mtype) \ - if (operation.getValue().compare(#mtype) == 0) \ - { \ - if (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value==true) \ + + const CDuration toffset = this->freq_operation - freq_offset_ - context->getCalendar()->getTimeStep(); + *this->last_operation = *this->last_operation - toffset; + + if (operation.get() == "once") isOnceOperation = true; + else isOnceOperation = false; + isFirstOperation = true; + +#define DECLARE_FUNCTOR(MType, mtype) \ + if (operation.getValue().compare(#mtype) == 0) \ + { \ + if (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true) \ { \ boost::shared_ptr foperation_(new C##MType(this->data,default_value)); \ this->foperation = foperation_; \ @@ -532,24 +526,22 @@ namespace xios{ else \ { \ boost::shared_ptr foperation_(new C##MType(this->data)); \ - this->foperation = foperation_; \ + this->foperation = foperation_; \ } \ - return; \ + return; \ } - + #include "functor_type.conf" - + ERROR("CField::solveOperation(void)", << "[ operation = " << operation.getValue() << "]" << "The operation is not defined !"); // } - - } - + //---------------------------------------------------------------- /* - void CField::fromBinary(StdIStream & is) + void CField::fromBinary(StdIStream& is) { SuperClass::fromBinary(is); #define CLEAR_ATT(name_)\ @@ -571,101 +563,99 @@ namespace xios{ if (!domain_ref.isEmpty()) { if (CDomain::has(domain_ref.getValue())) - domain = CDomain::get(domain_ref.getValue()) ; + domain = CDomain::get(domain_ref.getValue()); else ERROR("CField::solveGridReference(void)", << "Reference to the domain \'" - << domain_ref.getValue() << "\' is wrong") ; + << domain_ref.getValue() << "\' is wrong"); } if (!axis_ref.isEmpty()) { if (CAxis::has(axis_ref.getValue())) - axis = CAxis::get(axis_ref.getValue()) ; + axis = CAxis::get(axis_ref.getValue()); else ERROR("CField::solveGridReference(void)", << "Reference to the axis \'" - << axis_ref.getValue() <<"\' is wrong") ; + << axis_ref.getValue() <<"\' is wrong"); } if (!grid_ref.isEmpty()) { if (CGrid::has(grid_ref.getValue())) - this->grid = CGrid::get(grid_ref.getValue()) ; + this->grid = CGrid::get(grid_ref.getValue()); else ERROR("CField::solveGridReference(void)", << "Reference to the grid \'" << grid_ref.getValue() << "\' is wrong"); } - + if (grid_ref.isEmpty() && domain_ref.isEmpty()) { ERROR("CField::solveGridReference(void)", << "The horizontal domain for this field is not defined"); } - - CType goodDomain ; - CType goodAxis ; + + CType goodDomain; + CType goodAxis; if (!grid_ref.isEmpty()) { - if (!grid->domain_ref.isEmpty()) goodDomain=grid->domain_ref ; - if (!grid->axis_ref.isEmpty()) goodAxis=grid->axis_ref ; + if (!grid->domain_ref.isEmpty()) goodDomain = grid->domain_ref; + if (!grid->axis_ref.isEmpty()) goodAxis = grid->axis_ref; } - if (!domain_ref.isEmpty()) goodDomain=domain_ref ; - if (!axis_ref.isEmpty()) goodAxis=axis_ref ; - - - if (goodDomain.isEmpty()) + if (!domain_ref.isEmpty()) goodDomain = domain_ref; + if (!axis_ref.isEmpty()) goodAxis = axis_ref; + + if (goodDomain.isEmpty()) { ERROR("CField::solveGridReference(void)", << "The horizontal domain for this field is not defined"); } - else + else { - if (CDomain::has(goodDomain)) domain = CDomain::get(goodDomain) ; - else ERROR("CField::solveGridReference(void)",<< "Reference to the domain \'"<domain_ref.isEmpty() && goodDomain.get() == grid->domain_ref.get()) - if (goodAxis.isEmpty()) nothingToDo=true ; - else if (!grid->axis_ref.isEmpty()) - if (grid->axis_ref.get()==goodAxis.get()) nothingToDo=true ; + if (goodAxis.isEmpty()) nothingToDo = true; + else if (!grid->axis_ref.isEmpty()) + if (grid->axis_ref.get() == goodAxis.get()) nothingToDo = true; } - + if (!nothingToDo) { if (!goodAxis.isEmpty()) { - this->grid = CGrid::createGrid(domain, axis) ; + this->grid = CGrid::createGrid(domain, axis); this->grid_ref.setValue(this->grid->getId()); } else { - this->grid = CGrid::createGrid(domain) ; + this->grid = CGrid::createGrid(domain); this->grid_ref.setValue(this->grid->getId()); - } + } } - grid->solveReference() ; + grid->solveReference(); } - ///------------------------------------------------------------------- template <> - void CGroupTemplate::solveRefInheritance(void) + void CGroupTemplate::solveRefInheritance(void) { if (this->group_ref.isEmpty()) return; StdString gref = this->group_ref.getValue(); @@ -679,272 +669,267 @@ namespace xios{ CFieldGroup* owner = CFieldGroup::get(boost::polymorphic_downcast(this)); std::vector allChildren = group->getAllChildren(); - std::vector::iterator - it = allChildren.begin(), end = allChildren.end(); - + std::vector::iterator it = allChildren.begin(), end = allChildren.end(); + for (; it != end; it++) { CField* child = *it; - if (child->hasId()) owner->createChild()->field_ref.setValue(child->getId()) ; - + if (child->hasId()) owner->createChild()->field_ref.setValue(child->getId()); + } } - + void CField::scaleFactorAddOffset(double scaleFactor, double addOffset) { map* >::iterator it; - for(it=data_srv.begin();it!=data_srv.end();it++) *it->second = (*it->second -addOffset) * 1./scaleFactor ; + for (it = data_srv.begin(); it != data_srv.end(); it++) *it->second = (*it->second - addOffset) / scaleFactor; } - + void CField::outputField(CArray& fieldOut) { map* >::iterator it; - for(it=data_srv.begin();it!=data_srv.end();it++) - grid->outputField(it->first,*it->second, fieldOut) ; - + for (it = data_srv.begin(); it != data_srv.end(); it++) + grid->outputField(it->first,*it->second, fieldOut); + } - + void CField::outputField(CArray& fieldOut) { map* >::iterator it; - for(it=data_srv.begin();it!=data_srv.end();it++) + for (it = data_srv.begin(); it != data_srv.end(); it++) { - grid->outputField(it->first,*it->second, fieldOut) ; + grid->outputField(it->first,*it->second, fieldOut); } } + ///------------------------------------------------------------------- - void CField::parse(xml::CXMLNode & node) + void CField::parse(xml::CXMLNode& node) { SuperClass::parse(node); - if (! node.getContent(this->content)) + if (!node.getContent(this->content)) { if (node.goToChildElement()) { do { - if (node.getElementName()=="variable" || node.getElementName()=="variable_group") this->getVirtualVariableGroup()->parseChild(node); - } while (node.goToNextElement()) ; + if (node.getElementName() == "variable" || node.getElementName() == "variable_group") this->getVirtualVariableGroup()->parseChild(node); + } while (node.goToNextElement()); node.goToParentElement(); } } } - + CArray* CField::getInstantData(void) { - if (!hasInstantData) + if (!hasInstantData) { - instantData.resize(grid->storeIndex_client.numElements()) ; - hasInstantData=true ; + instantData.resize(grid->storeIndex_client.numElements()); + hasInstantData = true; } - return &instantData ; + return &instantData; } - + void CField::addReference(CField* field) { - refObject.push_back(field) ; + refObject.push_back(field); } - + void CField::addDependency(CField* field, int slotId) { - fieldDependency.push_back(pair(field,slotId)) ; + fieldDependency.push_back(pair(field,slotId)); } - + void CField::buildExpression(void) { - if (content.size() > 0) + if (content.size() > 0) { - CSimpleNodeExpr* simpleExpr=parseExpr(content+'\0') ; - expression=CFieldNode::newNode(simpleExpr) ; - delete simpleExpr ; - set instantFieldIds ; - map associatedInstantFieldIds ; - expression->getInstantFieldIds(instantFieldIds) ; - for (set::iterator it=instantFieldIds.begin() ; it!=instantFieldIds.end();++it) + CSimpleNodeExpr* simpleExpr = parseExpr(content+'\0'); + expression = CFieldNode::newNode(simpleExpr); + delete simpleExpr; + set instantFieldIds; + map associatedInstantFieldIds; + expression->getInstantFieldIds(instantFieldIds); + for (set::iterator it = instantFieldIds.begin(); it != instantFieldIds.end(); ++it) { - if (*it!="this") + if (*it != "this") { - if (CField::has(*it)) + if (CField::has(*it)) { - CField* field=CField::get(*it) ; - field->processEnabledField() ; - associatedInstantFieldIds[*it]=field ; + CField* field = CField::get(*it); + field->processEnabledField(); + associatedInstantFieldIds[*it] = field; } - else ERROR("void CField::buildExpression(void)",<<" Field "<<*it<<" does not exist") ; + else ERROR("void CField::buildExpression(void)", << " Field " << *it << " does not exist"); } } - - set averageFieldIds ; - map associatedAverageFieldIds ; - - expression->getAverageFieldIds(averageFieldIds) ; - for (set::iterator it=averageFieldIds.begin() ; it!=averageFieldIds.end();++it) - { - if (CField::has(*it)) + + set averageFieldIds; + map associatedAverageFieldIds; + + expression->getAverageFieldIds(averageFieldIds); + for (set::iterator it = averageFieldIds.begin(); it != averageFieldIds.end(); ++it) + { + if (CField::has(*it)) { - CFieldGroup* root=CFieldGroup::get("field_definition") ; - CField* averageField=root->createChild() ; - CField* instantField=root->createChild() ; - averageField->field_ref=*it ; - averageField->hasFieldOut=true ; - averageField->fieldOut=instantField ; - instantField->freq_op=freq_op ; - averageField-> processEnabledField() ; + CFieldGroup* root = CFieldGroup::get("field_definition"); + CField* averageField = root->createChild(); + CField* instantField = root->createChild(); + averageField->field_ref = *it; + averageField->hasFieldOut = true; + averageField->fieldOut = instantField; + instantField->freq_op = freq_op; + averageField-> processEnabledField(); instantField->SuperClassAttribute::setAttributes(averageField, true); - instantField->field_ref.reset() ; - instantField->operation.reset() ; + instantField->field_ref.reset(); + instantField->operation.reset(); - instantField-> processEnabledField() ; - associatedAverageFieldIds[*it]=instantField ; + instantField-> processEnabledField(); + associatedAverageFieldIds[*it] = instantField; } - else ERROR("void CField::buildExpression(void)",<<" Field "<<*it<<" does not exist") ; + else ERROR("void CField::buildExpression(void)", << " Field " << *it << " does not exist"); } - expression->reduce(this,associatedInstantFieldIds,associatedAverageFieldIds) ; + expression->reduce(this,associatedInstantFieldIds,associatedAverageFieldIds); - slots.resize(instantFieldIds.size()+averageFieldIds.size()) ; - resetSlots() ; - int slotId=0 ; - set fields ; - expression->getFields(fields) ; - for (set::iterator it=fields.begin() ; it!=fields.end();++it,++slotId) (*it)->addDependency(this,slotId) ; - hasExpression=true; + slots.resize(instantFieldIds.size() + averageFieldIds.size()); + resetSlots(); + int slotId = 0; + set fields; + expression->getFields(fields); + for (set::iterator it = fields.begin(); it != fields.end(); ++it, ++slotId) (*it)->addDependency(this,slotId); + hasExpression = true; } } - + void CField::resetSlots(void) { - for(vector::iterator it=slots.begin();it!=slots.end();++it) *it=false ; + for (vector::iterator it = slots.begin(); it != slots.end(); ++it) *it = false; } - + bool CField::slotsFull(void) { - bool ret=true ; - for(vector::iterator it=slots.begin();it!=slots.end();++it) ret &= *it; - return ret ; + bool ret = true; + for (vector::iterator it = slots.begin(); it != slots.end(); ++it) ret &= *it; + return ret; } - void CField::setSlot(int slotId) { - CContext* context = CContext::getCurrent() ; - const CDate & currDate = context->getCalendar()->getCurrentDate(); - if (slotUpdateDate==NULL || currDate!=*slotUpdateDate) + CContext* context = CContext::getCurrent(); + const CDate& currDate = context->getCalendar()->getCurrentDate(); + if (slotUpdateDate == NULL || currDate != *slotUpdateDate) { - resetSlots() ; - if (slotUpdateDate==NULL) slotUpdateDate=new CDate(currDate) ; - else *slotUpdateDate=currDate ; + resetSlots(); + if (slotUpdateDate == NULL) slotUpdateDate = new CDate(currDate); + else *slotUpdateDate = currDate; } - slots[slotId]=true ; + slots[slotId] = true; if (slotsFull()) { - CArray expr(expression->compute()) ; - - if (hasInstantData) + CArray expr(expression->compute()); + + if (hasInstantData) { - instantData=expr ; - for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) - if (it->first!=this) it->first->setSlot(it->second) ; + instantData = expr; + for (list< pair >::iterator it = fieldDependency.begin(); it != fieldDependency.end(); ++it) + if (it->first != this) it->first->setSlot(it->second); } - - if (hasOutputFile) updateDataFromExpression(expr) ; - - } - } + if (hasOutputFile) updateDataFromExpression(expr); + const std::vector& refField = getAllReference(); + for (std::vector::const_iterator it = refField.begin(); it != refField.end(); it++) + { + if (!(*it)->hasExpression) + (*it)->setDataFromExpression(expr); + } + } + } CVariable* CField::addVariable(const string& id) { - return vVariableGroup->createChild(id) ; + return vVariableGroup->createChild(id); } CVariableGroup* CField::addVariableGroup(const string& id) { - return vVariableGroup->createChildGroup(id) ; + return vVariableGroup->createChildGroup(id); } - void CField::sendAddVariable(const string& id) { - CContext* context=CContext::getCurrent() ; - - if (! context->hasServer ) + CContext* context = CContext::getCurrent(); + + if (!context->hasServer) { - CContextClient* client=context->client ; + CContextClient* client = context->client; - CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE) ; + CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE); if (client->isServerLeader()) { - CMessage msg ; - msg<getId() ; - msg<getServerLeader(),1,msg) ; - client->sendEvent(event) ; + CMessage msg; + msg << this->getId(); + msg << id; + event.push(client->getServerLeader(),1,msg); + client->sendEvent(event); } - else client->sendEvent(event) ; + else client->sendEvent(event); } - + } - - + void CField::sendAddVariableGroup(const string& id) { - CContext* context=CContext::getCurrent() ; - if (! context->hasServer ) + CContext* context = CContext::getCurrent(); + if (!context->hasServer) { - CContextClient* client=context->client ; + CContextClient* client = context->client; - CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE_GROUP) ; + CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE_GROUP); if (client->isServerLeader()) { - CMessage msg ; - msg<getId() ; - msg<getServerLeader(),1,msg) ; - client->sendEvent(event) ; + CMessage msg; + msg << this->getId(); + msg << id; + event.push(client->getServerLeader(),1,msg); + client->sendEvent(event); } - else client->sendEvent(event) ; + else client->sendEvent(event); } - + } - + void CField::recvAddVariable(CEventServer& event) { - - CBufferIn* buffer=event.subEvents.begin()->buffer; + + CBufferIn* buffer = event.subEvents.begin()->buffer; string id; - *buffer>>id ; - get(id)->recvAddVariable(*buffer) ; + *buffer >> id; + get(id)->recvAddVariable(*buffer); } - - + void CField::recvAddVariable(CBufferIn& buffer) { - string id ; - buffer>>id ; - addVariable(id) ; + string id; + buffer >> id; + addVariable(id); } void CField::recvAddVariableGroup(CEventServer& event) { - - CBufferIn* buffer=event.subEvents.begin()->buffer; + + CBufferIn* buffer = event.subEvents.begin()->buffer; string id; - *buffer>>id ; - get(id)->recvAddVariableGroup(*buffer) ; + *buffer >> id; + get(id)->recvAddVariableGroup(*buffer); } - - + void CField::recvAddVariableGroup(CBufferIn& buffer) { - string id ; - buffer>>id ; - addVariableGroup(id) ; + string id; + buffer >> id; + addVariableGroup(id); } - - - - } // namespace xios -- GitLab From b956280e1eac506a6b4f7ecc4fa6eb5e6747328d Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 24 Feb 2015 09:09:12 +0000 Subject: [PATCH 17/31] Test complete: Fix a typo in context_atmosphere (cosmetic only). git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@563 d613d254-d18a-4304-b296-5125d4c4d670 --- inputs/COMPLETE/context_atmosphere.xml | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/inputs/COMPLETE/context_atmosphere.xml b/inputs/COMPLETE/context_atmosphere.xml index b2ce96f..aa7cd7b 100644 --- a/inputs/COMPLETE/context_atmosphere.xml +++ b/inputs/COMPLETE/context_atmosphere.xml @@ -1,28 +1,27 @@ - + - - + - + - + - - - - - - - - - - + + + + + + + + + + -- GitLab From 05cfdbe848c0427ae29a1644dcd73ce040179961 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 2 Mar 2015 10:12:31 +0000 Subject: [PATCH 18/31] Add arch files for Centro Euro-Mediterraneo sui Cambiamenti Climatici's cluster ATHENA. Courtesy of Tomas Lovato. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@564 d613d254-d18a-4304-b296-5125d4c4d670 --- arch/arch-X64_ATHENA.env | 15 +++++++++++++++ arch/arch-X64_ATHENA.fcm | 26 ++++++++++++++++++++++++++ arch/arch-X64_ATHENA.path | 12 ++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 arch/arch-X64_ATHENA.env create mode 100644 arch/arch-X64_ATHENA.fcm create mode 100644 arch/arch-X64_ATHENA.path diff --git a/arch/arch-X64_ATHENA.env b/arch/arch-X64_ATHENA.env new file mode 100644 index 0000000..0fe35c7 --- /dev/null +++ b/arch/arch-X64_ATHENA.env @@ -0,0 +1,15 @@ +# Environment to compile XIOS on Athena +# +# Prerequisite softwares installed with +# +module load INTEL/intel_xe_2013 +module load HDF5/hdf5-1.8.11_parallel +module load NETCDF/netcdf-4.3_parallel +module load NETCDF/parallel-netcdf-1.3.1 + +#export NETCDF_DIR=${NETCDF} +#export PNETCDF_DIR=${PNETCDF} +export NETCDF_DIR=/users/home/opt/netcdf/netcdf-4.3_parallel +export PNETCDF_DIR=/users/home/opt/netcdf/parallel-netcdf-1.3.1 +export HDF5_DIR=/users/home/opt/hdf5/hdf5-1.8.11_parallel + diff --git a/arch/arch-X64_ATHENA.fcm b/arch/arch-X64_ATHENA.fcm new file mode 100644 index 0000000..9839041 --- /dev/null +++ b/arch/arch-X64_ATHENA.fcm @@ -0,0 +1,26 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +%CCOMPILER mpiicc +%FCOMPILER mpiifort +%LINKER mpiifort -nofor-main + +%BASE_CFLAGS -diag-disable 1125 -diag-disable 279 +%PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS +%DEV_CFLAGS -g -traceback +%DEBUG_CFLAGS -DBZ_DEBUG -g -traceback -fno-inline + +%BASE_FFLAGS -D__NONE__ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -g -O2 -traceback +%DEBUG_FFLAGS -g -traceback + +%BASE_INC -D__NONE__ +%BASE_LD -lstdc++ -lz -lcurl -Wl -lgpfs + +%CPP mpiicc -EP +%FPP cpp -P +%MAKE gmake + + diff --git a/arch/arch-X64_ATHENA.path b/arch/arch-X64_ATHENA.path new file mode 100644 index 0000000..e5816d9 --- /dev/null +++ b/arch/arch-X64_ATHENA.path @@ -0,0 +1,12 @@ +NETCDF_INCDIR="-I${NETCDF_DIR}/include -I${PNETCDF_DIR}/include" +NETCDF_LIBDIR="-L${NETCDF_DIR}/lib -L${PNETCDF_DIR}/lib" +NETCDF_LIB="-L${NETCDF_DIR}/lib -lnetcdff -L${NETCDF_DIR}/lib -lnetcdf -L${PNETCDF_DIR}/lib -lpnetcdf" + +HDF5_INCDIR="-I${HDF5_DIR}/include" +HDF5_LIBDIR="-L${HDF5_DIR}/lib" +HDF5_LIB="-L${HDF5_DIR}/lib -lhdf5_hl -L${HDF5_DIR}/lib -lhdf5" + +OASIS_INCDIR="" +OASIS_LIBDIR="" +OASIS_LIB="" + -- GitLab From 4cf8f5426a5cb5c36173c0331f20ba8570ee5aaa Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 2 Mar 2015 16:10:46 +0000 Subject: [PATCH 19/31] Modify test_complete so that zoom is actually tested. Note that the trunk is currently broken and does not pass this test. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@565 d613d254-d18a-4304-b296-5125d4c4d670 --- src/test/test_complete.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/test_complete.f90 b/src/test/test_complete.f90 index 42c814e..7024447 100644 --- a/src/test/test_complete.f90 +++ b/src/test/test_complete.f90 @@ -95,6 +95,7 @@ PROGRAM test_complete CALL xios_set_domain_attr("domain_atm_zoom",ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, ni=ni,jbegin=jbegin,nj=nj) CALL xios_set_domain_attr("domain_atm_zoom",data_dim=2, data_ibegin=-1, data_ni=ni+2, data_jbegin=-2, data_nj=nj+4) CALL xios_set_domain_attr("domain_atm_zoom",lonvalue=RESHAPE(lon,(/ni*nj/)),latvalue=RESHAPE(lat,(/ni*nj/))) + CALL xios_set_domain_attr("domain_atm_zoom",zoom_ibegin=40, zoom_ni=20, zoom_jbegin=40, zoom_nj=10) !!! field_definition group activation -- GitLab From 0d93f89136bbb6035fb89d80e72aa9f46faba108 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 9 Mar 2015 09:04:51 +0000 Subject: [PATCH 20/31] Improve the error messages when checking the axis attributes. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@566 d613d254-d18a-4304-b296-5125d4c4d670 --- src/node/axis.cpp | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/node/axis.cpp b/src/node/axis.cpp index a4bd22f..36bc51b 100644 --- a/src/node/axis.cpp +++ b/src/node/axis.cpp @@ -8,7 +8,7 @@ #include "xmlioserver_spl.hpp" namespace xios { - + /// ////////////////////// Définitions ////////////////////// /// CAxis::CAxis(void) @@ -53,29 +53,31 @@ namespace xios { { if (this->isChecked) return; if (this->size.isEmpty()) - ERROR("CAxis::checkAttributes(void)",<< "Attribut of the axis must be specified") ; + ERROR("CAxis::checkAttributes(void)", + << "Attribute of the axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] must be specified"); StdSize size = this->size.getValue(); - - StdSize zoom_begin,zoom_end, zoom_size ; - - zoom_begin = (this->zoom_begin.isEmpty()) ? 1 : this->zoom_begin.getValue() ; - zoom_end = (this->zoom_end.isEmpty()) ? size : this->zoom_end.getValue() ; - zoom_size = (this->zoom_size.isEmpty()) ? size : this->zoom_size.getValue() ; - - if (this->zoom_begin.isEmpty()) zoom_begin=zoom_end-zoom_size+1 ; - if (this->zoom_end.isEmpty()) zoom_end=zoom_begin+zoom_size-1 ; - if (this->zoom_size.isEmpty()) zoom_size=zoom_end-zoom_begin+1 ; - + + StdSize zoom_begin,zoom_end, zoom_size; + + zoom_begin = (this->zoom_begin.isEmpty()) ? 1 : this->zoom_begin.getValue(); + zoom_end = (this->zoom_end.isEmpty()) ? size : this->zoom_end.getValue(); + zoom_size = (this->zoom_size.isEmpty()) ? size : this->zoom_size.getValue(); + + if (this->zoom_begin.isEmpty()) zoom_begin=zoom_end-zoom_size+1; + if (this->zoom_end.isEmpty()) zoom_end=zoom_begin+zoom_size-1; + if (this->zoom_size.isEmpty()) zoom_size=zoom_end-zoom_begin+1; + if ( (zoom_begin < 1) || (zoom_begin > size) || (zoom_end<1) || (zoom_end>size) || (zoom_size<1) || (zoom_size>size) || (zoom_begin>zoom_end)) - ERROR("CAxis::checkAttributes(void)",<< "One or more attribut of , , , are not well specified") ; - this->zoom_begin.setValue(zoom_begin) ; - this->zoom_end.setValue(zoom_end) ; - this->zoom_size.setValue(zoom_size) ; - + ERROR("CAxis::checkAttributes(void)", + << "One or more attributes among , , of axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] are not well specified"); + this->zoom_begin.setValue(zoom_begin); + this->zoom_end.setValue(zoom_end); + this->zoom_size.setValue(zoom_size); + StdSize true_size = value.numElements(); if (size != true_size) ERROR("CAxis::checkAttributes(void)", - << "The array \'value\' has a different size that the one defined by the \'size\' attribut") + << "The array \'value\' of axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] has a different size that the one defined by the \'size\' attribute"); this->isChecked = true; } -- GitLab From 59ce069558d36653e00d2159cf2eb4494b93f605 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 10 Mar 2015 12:30:08 +0000 Subject: [PATCH 21/31] Fix: Make sure the grids are consistent when doing field operations. Always treats internal grids as such to avoid errors when doing further operations. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@572 d613d254-d18a-4304-b296-5125d4c4d670 --- src/node/field_impl.hpp | 134 +++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 64 deletions(-) diff --git a/src/node/field_impl.hpp b/src/node/field_impl.hpp index 65c3608..c378ce7 100644 --- a/src/node/field_impl.hpp +++ b/src/node/field_impl.hpp @@ -15,59 +15,57 @@ namespace xios { template void CField::setData(const CArray& _data) { - if (hasInstantData) + if (hasInstantData) { - grid->inputField(_data, instantData); - for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) it->first->setSlot(it->second) ; + grid->inputField(_data, instantData); + for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) it->first->setSlot(it->second); } - + if (!hasExpression) { const std::vector& refField=getAllReference(); std::vector::const_iterator it = refField.begin(), end = refField.end(); - - for (; it != end; it++) (*it)->setData(_data) ; - if (hasOutputFile || hasFieldOut) updateData(_data) ; + + for (; it != end; it++) (*it)->setData(_data); + if (hasOutputFile || hasFieldOut) updateData(_data); } - } void CField::setDataFromExpression(const CArray& _data) { - if (hasInstantData) + if (hasInstantData) { - instantData=_data; - for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) it->first->setSlot(it->second) ; + instantData=_data; + for(list< pair >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it) it->first->setSlot(it->second); } - + if (!hasExpression) { const std::vector& refField=getAllReference(); std::vector::const_iterator it = refField.begin(), end = refField.end(); - - for (; it != end; it++) (*it)->setData(_data) ; - if (hasOutputFile || hasFieldOut) updateData(_data) ; + + for (; it != end; it++) (*it)->setDataFromExpression(_data); + if (hasOutputFile || hasFieldOut) updateDataFromExpression(_data); } - } template bool CField::updateData(const CArray& _data) - { + { CContext* context=CContext::getCurrent(); const CDate & currDate = context->getCalendar()->getCurrentDate(); const CDate opeDate = *last_operation + freq_operation; - const CDate writeDate = *last_Write + freq_write; - bool doOperation, doWrite; + const CDate writeDate = *last_Write + freq_write; + bool doOperation, doWrite; + - info(50) << "CField::updateData " << currDate << " : send data to " << this->getBaseFieldId() << std::endl; info(50) << "Next operation " << opeDate<data.resize(this->grid->storeIndex_client.numElements()); } - - CArray input(data.numElements()) ; - this->grid->inputField(_data, input); + + CArray input(data.numElements()); + this->grid->inputField(_data, input); (*this->foperation)(input); - + *last_operation = currDate; - info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; + info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; } - doWrite = (writeDate < (currDate + freq_operation)) ; + doWrite = (writeDate < (currDate + freq_operation)); if (isOnceOperation) - { - if(isFirstOperation) + { + if(isFirstOperation) { - doWrite=true ; - isFirstOperation=false ; + doWrite=true; + isFirstOperation=false; } - else doWrite=false ; + else doWrite=false; } - + if (doWrite) { this->foperation->final(); @@ -102,37 +100,37 @@ namespace xios { if (hasOutputFile) { info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; - CTimer::get("XIOS Send Data").resume() ; - sendUpdateData() ; - CTimer::get("XIOS Send Data").suspend() ; + CTimer::get("XIOS Send Data").resume(); + sendUpdateData(); + CTimer::get("XIOS Send Data").suspend(); } - + if (hasFieldOut) { - fieldOut->setDataFromExpression(data) ; + fieldOut->setDataFromExpression(data); } - return (true); + return (true); } return (false); } - + bool CField::updateDataFromExpression(const CArray& _data) - { + { CContext* context=CContext::getCurrent(); const CDate & currDate = context->getCalendar()->getCurrentDate(); const CDate opeDate = *last_operation + freq_operation; - const CDate writeDate = *last_Write + freq_write; - bool doOperation, doWrite; + const CDate writeDate = *last_Write + freq_write; + bool doOperation, doWrite; + - info(50) << "CField::updateData " << currDate << " : send data to " << this->getBaseFieldId() << std::endl; info(50) << "Next operation " << opeDate<data.resize(this->grid->storeIndex_client.numElements()); } - + (*this->foperation)(_data); - + *last_operation = currDate; - info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; + info(50) << "(*last_operation = currDate) : " << *last_operation << " = " << currDate << std::endl; } - doWrite = (writeDate < (currDate + freq_operation)) ; + doWrite = (writeDate < (currDate + freq_operation)); if (isOnceOperation) - { - if(isFirstOperation) + { + if(isFirstOperation) { - doWrite=true ; - isFirstOperation=false ; + doWrite=true; + isFirstOperation=false; } - else doWrite=false ; + else doWrite=false; } - + if (doWrite) { this->foperation->final(); *last_Write = writeDate; - info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; - CTimer::get("XIOS Send Data").resume() ; - sendUpdateData() ; - CTimer::get("XIOS Send Data").suspend() ; - return (true); + if (hasOutputFile) + { + info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; + CTimer::get("XIOS Send Data").resume(); + sendUpdateData(); + CTimer::get("XIOS Send Data").suspend(); + } + + if (hasFieldOut) + { + fieldOut->setDataFromExpression(data); + } + return (true); } return (false); -- GitLab From 1b150769db5d488609ad5e127d354888228c49ea Mon Sep 17 00:00:00 2001 From: rlacroix Date: Fri, 13 Mar 2015 07:38:42 +0000 Subject: [PATCH 22/31] Convert parse_xml.cpp to Fortran to ease compiling with PGI compilers. Previously linking would fail because a special compiler switch is required when linking a CPP code with a Fortran library using PGI. To avoid having to handle that special case, switch to Fortran. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@573 d613d254-d18a-4304-b296-5125d4c4d670 --- src/interface/c/icdata.cpp | 8 ++++++++ src/test/parse_xml.cpp | 10 ---------- src/test/parse_xml.f90 | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 10 deletions(-) delete mode 100644 src/test/parse_xml.cpp create mode 100644 src/test/parse_xml.f90 diff --git a/src/interface/c/icdata.cpp b/src/interface/c/icdata.cpp index a7c1f4d..2e7492c 100644 --- a/src/interface/c/icdata.cpp +++ b/src/interface/c/icdata.cpp @@ -38,6 +38,14 @@ extern "C" typedef xios::CContext * XContextPtr; // -------------------- Traitement des données ------------------------------ + + // This function is not exported to the public Fortran interface, + // it is only used from the parse_xml.exe standalone test tool. + void cxios_init(void) + { + CXios::initialize(); + } + void cxios_init_server(void) { CXios::initServerSide(); diff --git a/src/test/parse_xml.cpp b/src/test/parse_xml.cpp deleted file mode 100644 index bf8f541..0000000 --- a/src/test/parse_xml.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "cxios.hpp" - - -using namespace std ; -using namespace xios ; - -int main (int argc, char ** argv, char ** UNUSED (env)) -{ - CXios::initialize() ; -} diff --git a/src/test/parse_xml.f90 b/src/test/parse_xml.f90 new file mode 100644 index 0000000..d8c2952 --- /dev/null +++ b/src/test/parse_xml.f90 @@ -0,0 +1,17 @@ +PROGRAM parse_xml + USE, INTRINSIC :: ISO_C_BINDING + IMPLICIT NONE + + INTERFACE + SUBROUTINE xios_init() BIND(C, name='cxios_init') + END SUBROUTINE + END INTERFACE + + CALL xios_init() ! This will parse the XML file and report any parsing error + +END PROGRAM parse_xml + + + + + -- GitLab From 3b39900238b9967c7a5cd90fea6f0c1fc7f82ddf Mon Sep 17 00:00:00 2001 From: rlacroix Date: Fri, 13 Mar 2015 10:08:28 +0000 Subject: [PATCH 23/31] Update the arch files for Curie: - Update NetCDF to version 4.3.3.1 - Update PGI compiler to version 14.10 (fixes compilation for the xios-1.0 branch) - Update GCC compiler to version 4.9.1 - Update Vampir to version 8.2.1 - Various clean-ups. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@574 d613d254-d18a-4304-b296-5125d4c4d670 --- arch/arch-X64_CURIE.env | 3 +-- arch/arch-X64_CURIE.path | 10 +++++----- arch/arch-X64_CURIE_GCC.env | 4 ++-- arch/arch-X64_CURIE_GCC.path | 6 +++--- arch/arch-X64_CURIE_PGI.env | 5 ++--- arch/arch-X64_CURIE_PGI.fcm | 2 +- arch/arch-X64_CURIE_PGI.path | 6 +++--- arch/arch-X64_CURIE_VAMPIR.env | 5 ++--- arch/arch-X64_CURIE_VAMPIR.path | 10 +++++----- 9 files changed, 24 insertions(+), 27 deletions(-) diff --git a/arch/arch-X64_CURIE.env b/arch/arch-X64_CURIE.env index 3a47f66..acc1d32 100644 --- a/arch/arch-X64_CURIE.env +++ b/arch/arch-X64_CURIE.env @@ -1,4 +1,3 @@ module unload netcdf module unload hdf5 -module load hdf5/1.8.9_parallel -module load netcdf/4.2_hdf5_parallel +module load netcdf/4.3.3.1_hdf5_parallel diff --git a/arch/arch-X64_CURIE.path b/arch/arch-X64_CURIE.path index c4b7d7c..8cf23e2 100644 --- a/arch/arch-X64_CURIE.path +++ b/arch/arch-X64_CURIE.path @@ -1,14 +1,14 @@ -NETCDF_INCDIR="-I $NETCDF_INC_DIR" -NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" +NETCDF_INCDIR="-I $NETCDF_INCDIR" +NETCDF_LIBDIR="-L $NETCDF_LIBDIR" NETCDF_LIB="-lnetcdf" MPI_INCDIR="" MPI_LIBDIR="" MPI_LIB="" -HDF5_INCDIR="-I$HDF5_INC_DIR" -HDF5_LIBDIR="-L$HDF5_LIB_DIR" -HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="-lhdf5_hl -lhdf5 -lz -lcurl" OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" diff --git a/arch/arch-X64_CURIE_GCC.env b/arch/arch-X64_CURIE_GCC.env index eda4d81..764b701 100644 --- a/arch/arch-X64_CURIE_GCC.env +++ b/arch/arch-X64_CURIE_GCC.env @@ -1,7 +1,7 @@ module unload netcdf module unload hdf5 -module load netcdf/4.2_hdf5_parallel -module load gnu/4.6.3 +module load netcdf/4.3.3.1_hdf5_parallel +module load gnu/4.9.1 export OMPI_CC=gcc export OMPI_CXX=g++ export OMPI_F77=gfortran diff --git a/arch/arch-X64_CURIE_GCC.path b/arch/arch-X64_CURIE_GCC.path index 5626a28..6032f7c 100644 --- a/arch/arch-X64_CURIE_GCC.path +++ b/arch/arch-X64_CURIE_GCC.path @@ -1,6 +1,6 @@ -NETCDF_INCDIR="-I $NETCDF_INC_DIR" -NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" -NETCDF_LIB="-lnetcdff -lnetcdf" +NETCDF_INCDIR="-I $NETCDF_INCDIR" +NETCDF_LIBDIR="-L $NETCDF_LIBDIR" +NETCDF_LIB="-lnetcdf" MPI_INCDIR="" MPI_LIBDIR="" diff --git a/arch/arch-X64_CURIE_PGI.env b/arch/arch-X64_CURIE_PGI.env index 4187b0a..3d5df63 100644 --- a/arch/arch-X64_CURIE_PGI.env +++ b/arch/arch-X64_CURIE_PGI.env @@ -1,11 +1,10 @@ module unload netcdf module unload hdf5 -module load netcdf/4.2_hdf5_parallel +module load netcdf/4.3.3.1_hdf5_parallel #module unload intel module unload pgi module unload gnu -module load gnu/4.6.3 -module load pgi/12.6 +module load pgi/14.10 export OMPI_CC=pgcc export OMPI_CXX=pgcpp diff --git a/arch/arch-X64_CURIE_PGI.fcm b/arch/arch-X64_CURIE_PGI.fcm index 831450a..8c663cd 100644 --- a/arch/arch-X64_CURIE_PGI.fcm +++ b/arch/arch-X64_CURIE_PGI.fcm @@ -4,7 +4,7 @@ %CCOMPILER mpicxx -noswitcherror %FCOMPILER mpif90 -noswitcherror -%LINKER mpif90 -noswitcherror +%LINKER mpif90 -noswitcherror %BASE_CFLAGS -D__NONE__ %PROD_CFLAGS -O3 -D BOOST_DISABLE_ASSERTS diff --git a/arch/arch-X64_CURIE_PGI.path b/arch/arch-X64_CURIE_PGI.path index 5626a28..6032f7c 100644 --- a/arch/arch-X64_CURIE_PGI.path +++ b/arch/arch-X64_CURIE_PGI.path @@ -1,6 +1,6 @@ -NETCDF_INCDIR="-I $NETCDF_INC_DIR" -NETCDF_LIBDIR="-L $NETCDF_LIB_DIR" -NETCDF_LIB="-lnetcdff -lnetcdf" +NETCDF_INCDIR="-I $NETCDF_INCDIR" +NETCDF_LIBDIR="-L $NETCDF_LIBDIR" +NETCDF_LIB="-lnetcdf" MPI_INCDIR="" MPI_LIBDIR="" diff --git a/arch/arch-X64_CURIE_VAMPIR.env b/arch/arch-X64_CURIE_VAMPIR.env index 327e39e..9d06aff 100644 --- a/arch/arch-X64_CURIE_VAMPIR.env +++ b/arch/arch-X64_CURIE_VAMPIR.env @@ -1,6 +1,5 @@ module unload netcdf module unload hdf5 module unload vampir -module load vampir/7.5 -module load hdf5/1.8.9_parallel -module load netcdf/4.2_hdf5_parallel +module load vampir/8.2.1 +module load netcdf/4.3.3.1_hdf5_parallel diff --git a/arch/arch-X64_CURIE_VAMPIR.path b/arch/arch-X64_CURIE_VAMPIR.path index e9b9a0e..3b3f691 100644 --- a/arch/arch-X64_CURIE_VAMPIR.path +++ b/arch/arch-X64_CURIE_VAMPIR.path @@ -1,14 +1,14 @@ -NETCDF_INCDIR="-I $NETCDF_INC_DIR" -NETCDF_LIBDIR="-L$NETCDF_LIB_DIR" +NETCDF_INCDIR="-I $NETCDF_INCDIR" +NETCDF_LIBDIR="-L$NETCDF_LIBDIR" NETCDF_LIB="-lnetcdf" MPI_INCDIR="" MPI_LIBDIR="" MPI_LIB="" -HDF5_INCDIR="-I$HDF5_INC_DIR" -HDF5_LIBDIR="-L$HDF5_LIB_DIR" -HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="-lhdf5_hl -lhdf5 -lz -lcurl" OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" -- GitLab From 17d7d3b6e37959b08d16c74b4fb0fc1b59cc56b8 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Fri, 13 Mar 2015 16:49:10 +0000 Subject: [PATCH 24/31] Fix compilation with PGI for the development version of XIOS 2.0 - Convert parse_xml.cpp to Fortran (port r573 to the trunk). - Modify date_interface to work-around a problem related to xios_duration type. - Reorganize the XIOS module to work-around a problem related to operator overloads for xios_duration and xios_date types. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@576 d613d254-d18a-4304-b296-5125d4c4d670 --- src/test/parse_xml.f90 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/test/parse_xml.f90 b/src/test/parse_xml.f90 index d8c2952..64e0381 100644 --- a/src/test/parse_xml.f90 +++ b/src/test/parse_xml.f90 @@ -10,8 +10,3 @@ PROGRAM parse_xml CALL xios_init() ! This will parse the XML file and report any parsing error END PROGRAM parse_xml - - - - - -- GitLab From 7e2e99003bb40f41e465ed23bc930ab8c62e563d Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 23 Mar 2015 10:11:29 +0000 Subject: [PATCH 25/31] Fix possibly incorrect error messages in case of NetCDF failure. Some return statements were misplaced which could lead to unpredictable behavior. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@578 d613d254-d18a-4304-b296-5125d4c4d670 --- src/output/netCdfInterface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/output/netCdfInterface.cpp b/src/output/netCdfInterface.cpp index 8425e0b..c58164c 100644 --- a/src/output/netCdfInterface.cpp +++ b/src/output/netCdfInterface.cpp @@ -719,8 +719,8 @@ StdString CNetCdfInterface::openMode2String(int oMode) default: modeMes = StdString("In the composed opening mode"); break; - return modeMes; } + return modeMes; } StdString CNetCdfInterface::creationMode2String(int cMode) @@ -746,8 +746,8 @@ StdString CNetCdfInterface::creationMode2String(int cMode) default: modeMes = StdString("In the composed creation mode"); break; - return modeMes; } + return modeMes; } } -- GitLab From 47cc7b27ae00748db61ecf0c7188123ac4dceb87 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 23 Mar 2015 10:18:04 +0000 Subject: [PATCH 26/31] Add a missing return statement to the CDuration::solveTimeStep method. Cosmetic only, the return value was never used. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@579 d613d254-d18a-4304-b296-5125d4c4d670 --- src/duration.cpp | 69 +++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/src/duration.cpp b/src/duration.cpp index 2d8b27e..968ed92 100644 --- a/src/duration.cpp +++ b/src/duration.cpp @@ -19,26 +19,26 @@ namespace xios CDuration & CDuration::operator=(const CDuration & duration) { - year = duration.year; month = duration.month ; day = duration.day; - hour = duration.hour; minute = duration.minute; second = duration.second; timestep=duration.timestep ; - return (*this); + year = duration.year; month = duration.month; day = duration.day; + hour = duration.hour; minute = duration.minute; second = duration.second; timestep=duration.timestep; + return *this; } StdOStream & operator<<(StdOStream & out, const CDuration & duration) { StdOStringStream sout; bool testValue = true; - if(duration.year != 0.0) { testValue = false; sout << duration.year << "y " ; } + if(duration.year != 0.0) { testValue = false; sout << duration.year << "y "; } if(duration.month != 0.0) { testValue = false; sout << duration.month << "mo "; } - if(duration.day != 0.0) { testValue = false; sout << duration.day << "d " ; } - if(duration.hour != 0.0) { testValue = false; sout << duration.hour << "h " ; } + if(duration.day != 0.0) { testValue = false; sout << duration.day << "d "; } + if(duration.hour != 0.0) { testValue = false; sout << duration.hour << "h "; } if(duration.minute != 0.0) { testValue = false; sout << duration.minute << "mi "; } - if(duration.second != 0.0) { testValue = false; sout << duration.second << "s " ; } - if(duration.timestep != 0.0 || testValue) { sout << duration.timestep << "ts " ; } + if(duration.second != 0.0) { testValue = false; sout << duration.second << "s "; } + if(duration.timestep != 0.0 || testValue) { sout << duration.timestep << "ts "; } // << suppression de l'espace en fin de chaîne. out << (sout.str().substr(0, sout.str().size()-1)); - return (out); + return out; } StdIStream & operator>>(StdIStream & in , CDuration & duration) @@ -49,15 +49,15 @@ namespace xios char c = '/'; while (!in.eof()) { - if (!(in >> v >> c)) + if (!(in >> v >> c)) { - //DEBUG("----> Pb StdIStream & operator>>(StdIStream & in , CDuration & duration)") ; - //if (in.eof()) DEBUG("----> Fin de fichier StdIStream & operator>>(StdIStream & in , CDuration & duration)") ; + //DEBUG("----> Pb StdIStream & operator>>(StdIStream & in , CDuration & duration)"); + //if (in.eof()) DEBUG("----> Fin de fichier StdIStream & operator>>(StdIStream & in , CDuration & duration)"); } - if (in.eof()) + if (in.eof()) { - //DEBUG("----> Fin de fichier StdIStream & operator>>(StdIStream & in , CDuration & duration)") ; - break ; + //DEBUG("----> Fin de fichier StdIStream & operator>>(StdIStream & in , CDuration & duration)"); + break; } switch (c) { @@ -81,17 +81,17 @@ namespace xios case 't' : { in >> c; - if (c=='s') duration.timestep = v; + if (c=='s') duration.timestep = v; break; } - + default: StdString valc; valc.append(1, c); //DEBUG("La chaine \"" << valc << "\" ne permet pas de définir une unité de durée."); break; } } - return (in); + return in; } //----------------------------------------------------------------- @@ -100,25 +100,24 @@ namespace xios { if ((year == 0) && (month == 0) && (day == 0) && (hour == 0) && (minute == 0) && (second == 0) && (timestep == 0)) - return (true); - return (false); + return true; + return false; } //----------------------------------------------------------------- CDuration & CDuration::solveTimeStep(const CCalendar & c) { - CDuration timeStep=c.getTimeStep() ; - second +=timestep*timeStep.second ; - minute +=timestep*timeStep.minute ; - hour +=timestep*timeStep.hour ; - day +=timestep*timeStep.day ; - month +=timestep*timeStep.month ; - year +=timestep*timeStep.year ; - timestep = 0 ; - + CDuration timeStep=c.getTimeStep(); + second +=timestep*timeStep.second; + minute +=timestep*timeStep.minute; + hour +=timestep*timeStep.hour; + day +=timestep*timeStep.day; + month +=timestep*timeStep.month; + year +=timestep*timeStep.year; + timestep = 0; + return *this; } - - + CDuration & CDuration::resolve(const CCalendar & c) { // Simplification de l'écriture des minutes. @@ -138,7 +137,7 @@ namespace xios // Simplification de l'écriture des années. month += modf(year, &year) * (float)c.getYearLength(); year += int(month) /c.getYearLength(); month = int(month)%c.getYearLength(); - return (*this); + return *this; } //----------------------------------------------------------------- @@ -147,18 +146,16 @@ namespace xios { const CDuration & own = *this; StdOStringStream oss; oss << own; - return (oss.str()); + return oss.str(); } CDuration CDuration::FromString(const StdString & str) { CDuration dr = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; StdIStringStream iss(str); iss >> dr; - return (dr); + return dr; } ///--------------------------------------------------------------- - - } // namespace xios -- GitLab From d8173e1540d95fa72a30417fb8cd6f674341affd Mon Sep 17 00:00:00 2001 From: rlacroix Date: Mon, 23 Mar 2015 10:29:48 +0000 Subject: [PATCH 27/31] Fix: getInheritedStringValue could return an incorrect value. The non-inherited value was always used even when it was empty and inheritence should have been used. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@580 d613d254-d18a-4304-b296-5125d4c4d670 --- src/attribute_enum_impl.hpp | 378 ++++++++++++++++++------------------ 1 file changed, 187 insertions(+), 191 deletions(-) diff --git a/src/attribute_enum_impl.hpp b/src/attribute_enum_impl.hpp index 53933d1..8766eed 100644 --- a/src/attribute_enum_impl.hpp +++ b/src/attribute_enum_impl.hpp @@ -7,199 +7,195 @@ #include "generate_interface.hpp" #include "attribute_enum.hpp" - + namespace xios { - - /// ////////////////////// Définitions ////////////////////// /// - template - CAttributeEnum::CAttributeEnum(const StdString & id) - : CAttribute(id) - { /* Ne rien faire de plus */ } - - template - CAttributeEnum::CAttributeEnum(const StdString & id, const T_enum & value) - : CAttribute(id) - { - this->setValue(value); - } - - template - CAttributeEnum::CAttributeEnum(const StdString & id, - xios_map & umap) - : CAttribute(id) - { - umap.insert(umap.end(), std::make_pair(id, this)); - } - - template - CAttributeEnum::CAttributeEnum - (const StdString & id, const T_enum & value, - xios_map & umap) - : CAttribute(id) - { - this->setValue(value); - umap.insert(umap.end(), std::make_pair(id, this)); - } - - ///-------------------------------------------------------------- - template - void CAttributeEnum::reset(void) - { - CEnum::reset() ; - inheritedValue.reset() ; - } - - template - typename T::t_enum CAttributeEnum::getValue(void) const - { - return CEnum::get() ; - } - - template - string CAttributeEnum::getStringValue(void) const - { - return CEnum::toString() ; - } - - template - void CAttributeEnum::setValue(const typename T::t_enum & value) - { - CEnum::set(value) ; - } - - template - void CAttributeEnum::set(const CAttribute& attr) - { - this->set(dynamic_cast& >(attr)) ; - } - - template - void CAttributeEnum::set(const CAttributeEnum& attr) - { - CEnum::set(attr) ; - } - - - template - void CAttributeEnum::setInheritedValue(const CAttribute& attr) - { - this->setInheritedValue(dynamic_cast& >(attr)) ; - } - - template - void CAttributeEnum::setInheritedValue(const CAttributeEnum& attr) - { - if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ; - } - - template - typename T::t_enum CAttributeEnum::getInheritedValue(void) const - { - if (this->isEmpty()) return inheritedValue.get() ; - else return getValue() ; - } - - template - string CAttributeEnum::getInheritedStringValue(void) const - { - return CEnum::toString() ; - if (this->isEmpty()) return inheritedValue.toString() ; - else return CEnum::toString() ; ; - } - - template - bool CAttributeEnum::hasInheritedValue(void) const - { - return !this->isEmpty() || !inheritedValue.isEmpty() ; - } - - //--------------------------------------------------------------- - - template - CAttributeEnum& CAttributeEnum::operator=(const T_enum & value) - { - this->setValue(value); - return *this; - } - - //--------------------------------------------------------------- - - template - StdString CAttributeEnum::_toString(void) const - { - StdOStringStream oss; - if (!CEnum::isEmpty() && this->hasId()) - oss << this->getName() << "=\"" << CEnum::toString() << "\""; - return (oss.str()); - } - - template - void CAttributeEnum::_fromString(const StdString & str) - { - CEnum::fromString(str) ; - } - - template - bool CAttributeEnum::_toBuffer (CBufferOut& buffer) const - { - return CEnum::toBuffer(buffer) ; - } - - template - bool CAttributeEnum::_fromBuffer(CBufferIn& buffer) - { - return CEnum::fromBuffer(buffer) ; - } - - template - void CAttributeEnum::generateCInterface(ostream& oss,const string& className) - { - CInterface::AttributeCInterface(oss, className, this->getName()) ; - } - - template - void CAttributeEnum::generateFortran2003Interface(ostream& oss,const string& className) - { - CInterface::AttributeFortran2003Interface(oss, className, this->getName()) ; - } - - template - void CAttributeEnum::generateFortranInterfaceDeclaration_(ostream& oss,const string& className) - { - CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()+"_") ; - } - - template - void CAttributeEnum::generateFortranInterfaceBody_(ostream& oss,const string& className) - { - CInterface::AttributeFortranInterfaceBody(oss, className, this->getName()) ; - } - - template - void CAttributeEnum::generateFortranInterfaceDeclaration(ostream& oss,const string& className) - { - CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()) ; - } - - template - void CAttributeEnum::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) - { - CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()+"_") ; - } - - template - void CAttributeEnum::generateFortranInterfaceGetBody_(ostream& oss,const string& className) - { - CInterface::AttributeFortranInterfaceGetBody(oss, className, this->getName()) ; - } - - template - void CAttributeEnum::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) - { - CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()) ; - } - + /// ////////////////////// Définitions ////////////////////// /// + template + CAttributeEnum::CAttributeEnum(const StdString & id) + : CAttribute(id) + { /* Ne rien faire de plus */ } + + template + CAttributeEnum::CAttributeEnum(const StdString & id, const T_enum & value) + : CAttribute(id) + { + this->setValue(value); + } + + template + CAttributeEnum::CAttributeEnum(const StdString & id, + xios_map & umap) + : CAttribute(id) + { + umap.insert(umap.end(), std::make_pair(id, this)); + } + + template + CAttributeEnum::CAttributeEnum + (const StdString & id, const T_enum & value, + xios_map & umap) + : CAttribute(id) + { + this->setValue(value); + umap.insert(umap.end(), std::make_pair(id, this)); + } + + ///-------------------------------------------------------------- + template + void CAttributeEnum::reset(void) + { + CEnum::reset(); + inheritedValue.reset(); + } + + template + typename T::t_enum CAttributeEnum::getValue(void) const + { + return CEnum::get(); + } + + template + string CAttributeEnum::getStringValue(void) const + { + return CEnum::toString(); + } + + template + void CAttributeEnum::setValue(const typename T::t_enum & value) + { + CEnum::set(value); + } + + template + void CAttributeEnum::set(const CAttribute& attr) + { + this->set(dynamic_cast& >(attr)); + } + + template + void CAttributeEnum::set(const CAttributeEnum& attr) + { + CEnum::set(attr); + } + + template + void CAttributeEnum::setInheritedValue(const CAttribute& attr) + { + this->setInheritedValue(dynamic_cast& >(attr)); + } + + template + void CAttributeEnum::setInheritedValue(const CAttributeEnum& attr) + { + if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()); + } + + template + typename T::t_enum CAttributeEnum::getInheritedValue(void) const + { + if (this->isEmpty()) return inheritedValue.get(); + else return getValue(); + } + + template + string CAttributeEnum::getInheritedStringValue(void) const + { + if (this->isEmpty()) return inheritedValue.toString(); + else return CEnum::toString(); + } + + template + bool CAttributeEnum::hasInheritedValue(void) const + { + return !this->isEmpty() || !inheritedValue.isEmpty(); + } + + //--------------------------------------------------------------- + + template + CAttributeEnum& CAttributeEnum::operator=(const T_enum & value) + { + this->setValue(value); + return *this; + } + + //--------------------------------------------------------------- + + template + StdString CAttributeEnum::_toString(void) const + { + StdOStringStream oss; + if (!CEnum::isEmpty() && this->hasId()) + oss << this->getName() << "=\"" << CEnum::toString() << "\""; + return (oss.str()); + } + + template + void CAttributeEnum::_fromString(const StdString & str) + { + CEnum::fromString(str); + } + + template + bool CAttributeEnum::_toBuffer (CBufferOut& buffer) const + { + return CEnum::toBuffer(buffer); + } + + template + bool CAttributeEnum::_fromBuffer(CBufferIn& buffer) + { + return CEnum::fromBuffer(buffer); + } + + template + void CAttributeEnum::generateCInterface(ostream& oss,const string& className) + { + CInterface::AttributeCInterface(oss, className, this->getName()); + } + + template + void CAttributeEnum::generateFortran2003Interface(ostream& oss,const string& className) + { + CInterface::AttributeFortran2003Interface(oss, className, this->getName()); + } + + template + void CAttributeEnum::generateFortranInterfaceDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()+"_"); + } + + template + void CAttributeEnum::generateFortranInterfaceBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceBody(oss, className, this->getName()); + } + + template + void CAttributeEnum::generateFortranInterfaceDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceDeclaration(oss, className, this->getName()); + } + + template + void CAttributeEnum::generateFortranInterfaceGetDeclaration_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()+"_"); + } + + template + void CAttributeEnum::generateFortranInterfaceGetBody_(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetBody(oss, className, this->getName()); + } + + template + void CAttributeEnum::generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) + { + CInterface::AttributeFortranInterfaceGetDeclaration(oss, className, this->getName()); + } } // namespace xios #endif // __XIOS_ATTRIBUTE_ENUM_IMPL_HPP__ -- GitLab From 5a5bb9cd324887357b095cb19dc13d598979e660 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Tue, 24 Mar 2015 10:21:45 +0000 Subject: [PATCH 28/31] Fix the Fortran interface generation to avoid generating dead code that caused a timer not to be stopped. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@581 d613d254-d18a-4304-b296-5125d4c4d670 --- src/generate_interface_impl.hpp | 7 +- src/interface/c_attr/icaxis_attr.cpp | 70 +++-- src/interface/c_attr/icaxisgroup_attr.cpp | 77 ++--- src/interface/c_attr/iccontext_attr.cpp | 35 ++- src/interface/c_attr/icdomain_attr.cpp | 259 +++++++++-------- src/interface/c_attr/icdomaingroup_attr.cpp | 266 ++++++++++-------- src/interface/c_attr/icfield_attr.cpp | 140 +++++---- src/interface/c_attr/icfieldgroup_attr.cpp | 147 +++++----- src/interface/c_attr/icfile_attr.cpp | 84 +++--- src/interface/c_attr/icfilegroup_attr.cpp | 91 +++--- src/interface/c_attr/icgrid_attr.cpp | 35 ++- src/interface/c_attr/icgridgroup_attr.cpp | 42 +-- src/interface/c_attr/icvariable_attr.cpp | 14 +- src/interface/c_attr/icvariablegroup_attr.cpp | 21 +- 14 files changed, 736 insertions(+), 552 deletions(-) diff --git a/src/generate_interface_impl.hpp b/src/generate_interface_impl.hpp index 73a3338..97a45b2 100644 --- a/src/generate_interface_impl.hpp +++ b/src/generate_interface_impl.hpp @@ -40,9 +40,10 @@ namespace xios { oss<<"bool cxios_is_defined_"<"<"<long_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_axis_name(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -90,9 +92,10 @@ extern "C" bool cxios_is_defined_axis_positive(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->positive.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->positive.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -112,9 +115,10 @@ extern "C" bool cxios_is_defined_axis_size(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->size.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -139,9 +143,10 @@ extern "C" bool cxios_is_defined_axis_standard_name(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->standard_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -166,9 +171,10 @@ extern "C" bool cxios_is_defined_axis_unit(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->unit.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -192,9 +198,10 @@ extern "C" bool cxios_is_defined_axis_value(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->value.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -214,9 +221,10 @@ extern "C" bool cxios_is_defined_axis_zoom_begin(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->zoom_begin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->zoom_begin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -236,9 +244,10 @@ extern "C" bool cxios_is_defined_axis_zoom_end(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->zoom_end.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->zoom_end.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -258,9 +267,10 @@ extern "C" bool cxios_is_defined_axis_zoom_size(axis_Ptr axis_hdl ) { - CTimer::get("XIOS").resume(); - return axis_hdl->zoom_size.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axis_hdl->zoom_size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icaxisgroup_attr.cpp b/src/interface/c_attr/icaxisgroup_attr.cpp index c3e7751..f255ca9 100644 --- a/src/interface/c_attr/icaxisgroup_attr.cpp +++ b/src/interface/c_attr/icaxisgroup_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_axisgroup_group_ref(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_axisgroup_long_name(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->long_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -90,9 +92,10 @@ extern "C" bool cxios_is_defined_axisgroup_name(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -117,9 +120,10 @@ extern "C" bool cxios_is_defined_axisgroup_positive(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->positive.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->positive.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -139,9 +143,10 @@ extern "C" bool cxios_is_defined_axisgroup_size(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->size.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -166,9 +171,10 @@ extern "C" bool cxios_is_defined_axisgroup_standard_name(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->standard_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -193,9 +199,10 @@ extern "C" bool cxios_is_defined_axisgroup_unit(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->unit.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -219,9 +226,10 @@ extern "C" bool cxios_is_defined_axisgroup_value(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->value.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -241,9 +249,10 @@ extern "C" bool cxios_is_defined_axisgroup_zoom_begin(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->zoom_begin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->zoom_begin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -263,9 +272,10 @@ extern "C" bool cxios_is_defined_axisgroup_zoom_end(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->zoom_end.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->zoom_end.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -285,9 +295,10 @@ extern "C" bool cxios_is_defined_axisgroup_zoom_size(axisgroup_Ptr axisgroup_hdl ) { - CTimer::get("XIOS").resume(); - return axisgroup_hdl->zoom_size.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = axisgroup_hdl->zoom_size.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/iccontext_attr.cpp b/src/interface/c_attr/iccontext_attr.cpp index 3c46a81..6bfc4a2 100644 --- a/src/interface/c_attr/iccontext_attr.cpp +++ b/src/interface/c_attr/iccontext_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_context_calendar_type(context_Ptr context_hdl ) { - CTimer::get("XIOS").resume(); - return context_hdl->calendar_type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = context_hdl->calendar_type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_context_output_dir(context_Ptr context_hdl ) { - CTimer::get("XIOS").resume(); - return context_hdl->output_dir.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = context_hdl->output_dir.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -90,9 +92,10 @@ extern "C" bool cxios_is_defined_context_start_date(context_Ptr context_hdl ) { - CTimer::get("XIOS").resume(); - return context_hdl->start_date.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = context_hdl->start_date.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -117,9 +120,10 @@ extern "C" bool cxios_is_defined_context_time_origin(context_Ptr context_hdl ) { - CTimer::get("XIOS").resume(); - return context_hdl->time_origin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = context_hdl->time_origin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -144,9 +148,10 @@ extern "C" bool cxios_is_defined_context_timestep(context_Ptr context_hdl ) { - CTimer::get("XIOS").resume(); - return context_hdl->timestep.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = context_hdl->timestep.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icdomain_attr.cpp b/src/interface/c_attr/icdomain_attr.cpp index d72221c..76ec822 100644 --- a/src/interface/c_attr/icdomain_attr.cpp +++ b/src/interface/c_attr/icdomain_attr.cpp @@ -35,9 +35,10 @@ extern "C" bool cxios_is_defined_domain_bounds_lat(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->bounds_lat.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->bounds_lat.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -61,9 +62,10 @@ extern "C" bool cxios_is_defined_domain_bounds_lon(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->bounds_lon.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->bounds_lon.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -83,9 +85,10 @@ extern "C" bool cxios_is_defined_domain_data_dim(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_dim.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_dim.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -109,9 +112,10 @@ extern "C" bool cxios_is_defined_domain_data_i_index(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_i_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -131,9 +135,10 @@ extern "C" bool cxios_is_defined_domain_data_ibegin(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_ibegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -157,9 +162,10 @@ extern "C" bool cxios_is_defined_domain_data_j_index(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_j_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -179,9 +185,10 @@ extern "C" bool cxios_is_defined_domain_data_jbegin(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_jbegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -201,9 +208,10 @@ extern "C" bool cxios_is_defined_domain_data_n_index(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_n_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_n_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -223,9 +231,10 @@ extern "C" bool cxios_is_defined_domain_data_ni(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_ni.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -245,9 +254,10 @@ extern "C" bool cxios_is_defined_domain_data_nj(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->data_nj.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->data_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -272,9 +282,10 @@ extern "C" bool cxios_is_defined_domain_domain_group_ref(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->domain_group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->domain_group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -298,9 +309,10 @@ extern "C" bool cxios_is_defined_domain_i_index(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->i_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -320,9 +332,10 @@ extern "C" bool cxios_is_defined_domain_ibegin(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->ibegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -342,9 +355,10 @@ extern "C" bool cxios_is_defined_domain_iend(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->iend.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->iend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -368,9 +382,10 @@ extern "C" bool cxios_is_defined_domain_j_index(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->j_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -390,9 +405,10 @@ extern "C" bool cxios_is_defined_domain_jbegin(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->jbegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -412,9 +428,10 @@ extern "C" bool cxios_is_defined_domain_jend(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->jend.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->jend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -438,9 +455,10 @@ extern "C" bool cxios_is_defined_domain_latvalue(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->latvalue.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->latvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -465,9 +483,10 @@ extern "C" bool cxios_is_defined_domain_long_name(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->long_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -491,9 +510,10 @@ extern "C" bool cxios_is_defined_domain_lonvalue(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->lonvalue.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->lonvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -517,9 +537,10 @@ extern "C" bool cxios_is_defined_domain_mask(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->mask.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -544,9 +565,10 @@ extern "C" bool cxios_is_defined_domain_name(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -566,9 +588,10 @@ extern "C" bool cxios_is_defined_domain_ni(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->ni.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -588,9 +611,10 @@ extern "C" bool cxios_is_defined_domain_ni_glo(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->ni_glo.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->ni_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -610,9 +634,10 @@ extern "C" bool cxios_is_defined_domain_nj(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->nj.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -632,9 +657,10 @@ extern "C" bool cxios_is_defined_domain_nj_glo(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->nj_glo.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->nj_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -654,9 +680,10 @@ extern "C" bool cxios_is_defined_domain_nvertex(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->nvertex.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->nvertex.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -681,9 +708,10 @@ extern "C" bool cxios_is_defined_domain_standard_name(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->standard_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -708,9 +736,10 @@ extern "C" bool cxios_is_defined_domain_type(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -730,9 +759,10 @@ extern "C" bool cxios_is_defined_domain_zoom_ibegin(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_ibegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -752,9 +782,10 @@ extern "C" bool cxios_is_defined_domain_zoom_ibegin_loc(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_ibegin_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_ibegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -774,9 +805,10 @@ extern "C" bool cxios_is_defined_domain_zoom_jbegin(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_jbegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -796,9 +828,10 @@ extern "C" bool cxios_is_defined_domain_zoom_jbegin_loc(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_jbegin_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_jbegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -818,9 +851,10 @@ extern "C" bool cxios_is_defined_domain_zoom_ni(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_ni.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -840,9 +874,10 @@ extern "C" bool cxios_is_defined_domain_zoom_ni_loc(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_ni_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_ni_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -862,9 +897,10 @@ extern "C" bool cxios_is_defined_domain_zoom_nj(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_nj.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -884,9 +920,10 @@ extern "C" bool cxios_is_defined_domain_zoom_nj_loc(domain_Ptr domain_hdl ) { - CTimer::get("XIOS").resume(); - return domain_hdl->zoom_nj_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domain_hdl->zoom_nj_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icdomaingroup_attr.cpp b/src/interface/c_attr/icdomaingroup_attr.cpp index 64079d8..bb4d468 100644 --- a/src/interface/c_attr/icdomaingroup_attr.cpp +++ b/src/interface/c_attr/icdomaingroup_attr.cpp @@ -35,9 +35,10 @@ extern "C" bool cxios_is_defined_domaingroup_bounds_lat(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->bounds_lat.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->bounds_lat.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -61,9 +62,10 @@ extern "C" bool cxios_is_defined_domaingroup_bounds_lon(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->bounds_lon.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->bounds_lon.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -83,9 +85,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_dim(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_dim.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_dim.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -109,9 +112,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_i_index(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_i_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -131,9 +135,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_ibegin(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_ibegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -157,9 +162,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_j_index(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_j_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -179,9 +185,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_jbegin(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_jbegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -201,9 +208,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_n_index(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_n_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_n_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -223,9 +231,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_ni(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_ni.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -245,9 +254,10 @@ extern "C" bool cxios_is_defined_domaingroup_data_nj(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->data_nj.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->data_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -272,9 +282,10 @@ extern "C" bool cxios_is_defined_domaingroup_domain_group_ref(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->domain_group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->domain_group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -299,9 +310,10 @@ extern "C" bool cxios_is_defined_domaingroup_group_ref(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -325,9 +337,10 @@ extern "C" bool cxios_is_defined_domaingroup_i_index(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->i_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->i_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -347,9 +360,10 @@ extern "C" bool cxios_is_defined_domaingroup_ibegin(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->ibegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -369,9 +383,10 @@ extern "C" bool cxios_is_defined_domaingroup_iend(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->iend.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->iend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -395,9 +410,10 @@ extern "C" bool cxios_is_defined_domaingroup_j_index(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->j_index.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->j_index.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -417,9 +433,10 @@ extern "C" bool cxios_is_defined_domaingroup_jbegin(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->jbegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -439,9 +456,10 @@ extern "C" bool cxios_is_defined_domaingroup_jend(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->jend.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->jend.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -465,9 +483,10 @@ extern "C" bool cxios_is_defined_domaingroup_latvalue(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->latvalue.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->latvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -492,9 +511,10 @@ extern "C" bool cxios_is_defined_domaingroup_long_name(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->long_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -518,9 +538,10 @@ extern "C" bool cxios_is_defined_domaingroup_lonvalue(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->lonvalue.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->lonvalue.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -544,9 +565,10 @@ extern "C" bool cxios_is_defined_domaingroup_mask(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->mask.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -571,9 +593,10 @@ extern "C" bool cxios_is_defined_domaingroup_name(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -593,9 +616,10 @@ extern "C" bool cxios_is_defined_domaingroup_ni(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->ni.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -615,9 +639,10 @@ extern "C" bool cxios_is_defined_domaingroup_ni_glo(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->ni_glo.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->ni_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -637,9 +662,10 @@ extern "C" bool cxios_is_defined_domaingroup_nj(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->nj.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -659,9 +685,10 @@ extern "C" bool cxios_is_defined_domaingroup_nj_glo(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->nj_glo.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->nj_glo.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -681,9 +708,10 @@ extern "C" bool cxios_is_defined_domaingroup_nvertex(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->nvertex.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->nvertex.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -708,9 +736,10 @@ extern "C" bool cxios_is_defined_domaingroup_standard_name(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->standard_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -735,9 +764,10 @@ extern "C" bool cxios_is_defined_domaingroup_type(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -757,9 +787,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_ibegin(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_ibegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_ibegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -779,9 +810,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_ibegin_loc(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_ibegin_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_ibegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -801,9 +833,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_jbegin(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_jbegin.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_jbegin.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -823,9 +856,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_jbegin_loc(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_jbegin_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_jbegin_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -845,9 +879,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_ni(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_ni.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_ni.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -867,9 +902,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_ni_loc(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_ni_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_ni_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -889,9 +925,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_nj(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_nj.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_nj.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -911,9 +948,10 @@ extern "C" bool cxios_is_defined_domaingroup_zoom_nj_loc(domaingroup_Ptr domaingroup_hdl ) { - CTimer::get("XIOS").resume(); - return domaingroup_hdl->zoom_nj_loc.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = domaingroup_hdl->zoom_nj_loc.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icfield_attr.cpp b/src/interface/c_attr/icfield_attr.cpp index cc23bae..6975405 100644 --- a/src/interface/c_attr/icfield_attr.cpp +++ b/src/interface/c_attr/icfield_attr.cpp @@ -31,9 +31,10 @@ extern "C" bool cxios_is_defined_field_add_offset(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->add_offset.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->add_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -58,9 +59,10 @@ extern "C" bool cxios_is_defined_field_axis_ref(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->axis_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -80,9 +82,10 @@ extern "C" bool cxios_is_defined_field_default_value(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->default_value.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->default_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -102,9 +105,10 @@ extern "C" bool cxios_is_defined_field_detect_missing_value(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->detect_missing_value.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->detect_missing_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -129,9 +133,10 @@ extern "C" bool cxios_is_defined_field_domain_ref(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->domain_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -151,9 +156,10 @@ extern "C" bool cxios_is_defined_field_enabled(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->enabled.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -178,9 +184,10 @@ extern "C" bool cxios_is_defined_field_field_ref(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->field_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->field_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -205,9 +212,10 @@ extern "C" bool cxios_is_defined_field_freq_offset(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->freq_offset.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->freq_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -232,9 +240,10 @@ extern "C" bool cxios_is_defined_field_freq_op(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->freq_op.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->freq_op.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -259,9 +268,10 @@ extern "C" bool cxios_is_defined_field_grid_ref(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->grid_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->grid_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -281,9 +291,10 @@ extern "C" bool cxios_is_defined_field_level(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->level.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -308,9 +319,10 @@ extern "C" bool cxios_is_defined_field_long_name(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->long_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -335,9 +347,10 @@ extern "C" bool cxios_is_defined_field_name(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -362,9 +375,10 @@ extern "C" bool cxios_is_defined_field_operation(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->operation.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->operation.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -384,9 +398,10 @@ extern "C" bool cxios_is_defined_field_prec(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->prec.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->prec.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -406,9 +421,10 @@ extern "C" bool cxios_is_defined_field_scale_factor(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->scale_factor.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->scale_factor.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -433,9 +449,10 @@ extern "C" bool cxios_is_defined_field_standard_name(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->standard_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -460,9 +477,10 @@ extern "C" bool cxios_is_defined_field_unit(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->unit.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -482,9 +500,10 @@ extern "C" bool cxios_is_defined_field_valid_max(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->valid_max.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->valid_max.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -504,9 +523,10 @@ extern "C" bool cxios_is_defined_field_valid_min(field_Ptr field_hdl ) { - CTimer::get("XIOS").resume(); - return field_hdl->valid_min.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = field_hdl->valid_min.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icfieldgroup_attr.cpp b/src/interface/c_attr/icfieldgroup_attr.cpp index e793c5a..9373ddd 100644 --- a/src/interface/c_attr/icfieldgroup_attr.cpp +++ b/src/interface/c_attr/icfieldgroup_attr.cpp @@ -31,9 +31,10 @@ extern "C" bool cxios_is_defined_fieldgroup_add_offset(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->add_offset.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->add_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -58,9 +59,10 @@ extern "C" bool cxios_is_defined_fieldgroup_axis_ref(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->axis_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -80,9 +82,10 @@ extern "C" bool cxios_is_defined_fieldgroup_default_value(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->default_value.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->default_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -102,9 +105,10 @@ extern "C" bool cxios_is_defined_fieldgroup_detect_missing_value(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->detect_missing_value.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->detect_missing_value.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -129,9 +133,10 @@ extern "C" bool cxios_is_defined_fieldgroup_domain_ref(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->domain_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -151,9 +156,10 @@ extern "C" bool cxios_is_defined_fieldgroup_enabled(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->enabled.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -178,9 +184,10 @@ extern "C" bool cxios_is_defined_fieldgroup_field_ref(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->field_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->field_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -205,9 +212,10 @@ extern "C" bool cxios_is_defined_fieldgroup_freq_offset(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->freq_offset.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->freq_offset.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -232,9 +240,10 @@ extern "C" bool cxios_is_defined_fieldgroup_freq_op(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->freq_op.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->freq_op.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -259,9 +268,10 @@ extern "C" bool cxios_is_defined_fieldgroup_grid_ref(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->grid_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->grid_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -286,9 +296,10 @@ extern "C" bool cxios_is_defined_fieldgroup_group_ref(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -308,9 +319,10 @@ extern "C" bool cxios_is_defined_fieldgroup_level(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->level.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -335,9 +347,10 @@ extern "C" bool cxios_is_defined_fieldgroup_long_name(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->long_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->long_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -362,9 +375,10 @@ extern "C" bool cxios_is_defined_fieldgroup_name(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -389,9 +403,10 @@ extern "C" bool cxios_is_defined_fieldgroup_operation(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->operation.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->operation.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -411,9 +426,10 @@ extern "C" bool cxios_is_defined_fieldgroup_prec(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->prec.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->prec.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -433,9 +449,10 @@ extern "C" bool cxios_is_defined_fieldgroup_scale_factor(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->scale_factor.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->scale_factor.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -460,9 +477,10 @@ extern "C" bool cxios_is_defined_fieldgroup_standard_name(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->standard_name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->standard_name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -487,9 +505,10 @@ extern "C" bool cxios_is_defined_fieldgroup_unit(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->unit.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->unit.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -509,9 +528,10 @@ extern "C" bool cxios_is_defined_fieldgroup_valid_max(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->valid_max.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->valid_max.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -531,9 +551,10 @@ extern "C" bool cxios_is_defined_fieldgroup_valid_min(fieldgroup_Ptr fieldgroup_hdl ) { - CTimer::get("XIOS").resume(); - return fieldgroup_hdl->valid_min.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = fieldgroup_hdl->valid_min.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icfile_attr.cpp b/src/interface/c_attr/icfile_attr.cpp index 89c91fb..e929f6a 100644 --- a/src/interface/c_attr/icfile_attr.cpp +++ b/src/interface/c_attr/icfile_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_file_description(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->description.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -58,9 +59,10 @@ extern "C" bool cxios_is_defined_file_enabled(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->enabled.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -80,9 +82,10 @@ extern "C" bool cxios_is_defined_file_min_digits(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->min_digits.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->min_digits.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -107,9 +110,10 @@ extern "C" bool cxios_is_defined_file_name(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -134,9 +138,10 @@ extern "C" bool cxios_is_defined_file_name_suffix(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->name_suffix.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->name_suffix.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -161,9 +166,10 @@ extern "C" bool cxios_is_defined_file_output_freq(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->output_freq.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->output_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -183,9 +189,10 @@ extern "C" bool cxios_is_defined_file_output_level(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->output_level.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->output_level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -210,9 +217,10 @@ extern "C" bool cxios_is_defined_file_par_access(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->par_access.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->par_access.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -237,9 +245,10 @@ extern "C" bool cxios_is_defined_file_split_freq(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->split_freq.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->split_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -264,9 +273,10 @@ extern "C" bool cxios_is_defined_file_split_freq_format(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->split_freq_format.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->split_freq_format.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -291,9 +301,10 @@ extern "C" bool cxios_is_defined_file_sync_freq(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->sync_freq.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->sync_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -318,9 +329,10 @@ extern "C" bool cxios_is_defined_file_type(file_Ptr file_hdl ) { - CTimer::get("XIOS").resume(); - return file_hdl->type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = file_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icfilegroup_attr.cpp b/src/interface/c_attr/icfilegroup_attr.cpp index fe3d98c..083fde0 100644 --- a/src/interface/c_attr/icfilegroup_attr.cpp +++ b/src/interface/c_attr/icfilegroup_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_filegroup_description(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->description.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -58,9 +59,10 @@ extern "C" bool cxios_is_defined_filegroup_enabled(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->enabled.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->enabled.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -85,9 +87,10 @@ extern "C" bool cxios_is_defined_filegroup_group_ref(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -107,9 +110,10 @@ extern "C" bool cxios_is_defined_filegroup_min_digits(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->min_digits.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->min_digits.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -134,9 +138,10 @@ extern "C" bool cxios_is_defined_filegroup_name(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -161,9 +166,10 @@ extern "C" bool cxios_is_defined_filegroup_name_suffix(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->name_suffix.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->name_suffix.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -188,9 +194,10 @@ extern "C" bool cxios_is_defined_filegroup_output_freq(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->output_freq.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->output_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -210,9 +217,10 @@ extern "C" bool cxios_is_defined_filegroup_output_level(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->output_level.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->output_level.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -237,9 +245,10 @@ extern "C" bool cxios_is_defined_filegroup_par_access(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->par_access.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->par_access.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -264,9 +273,10 @@ extern "C" bool cxios_is_defined_filegroup_split_freq(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->split_freq.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->split_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -291,9 +301,10 @@ extern "C" bool cxios_is_defined_filegroup_split_freq_format(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->split_freq_format.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->split_freq_format.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -318,9 +329,10 @@ extern "C" bool cxios_is_defined_filegroup_sync_freq(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->sync_freq.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->sync_freq.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -345,9 +357,10 @@ extern "C" bool cxios_is_defined_filegroup_type(filegroup_Ptr filegroup_hdl ) { - CTimer::get("XIOS").resume(); - return filegroup_hdl->type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = filegroup_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icgrid_attr.cpp b/src/interface/c_attr/icgrid_attr.cpp index 4c54d1c..7c5842f 100644 --- a/src/interface/c_attr/icgrid_attr.cpp +++ b/src/interface/c_attr/icgrid_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_grid_axis_ref(grid_Ptr grid_hdl ) { - CTimer::get("XIOS").resume(); - return grid_hdl->axis_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = grid_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_grid_description(grid_Ptr grid_hdl ) { - CTimer::get("XIOS").resume(); - return grid_hdl->description.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = grid_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -90,9 +92,10 @@ extern "C" bool cxios_is_defined_grid_domain_ref(grid_Ptr grid_hdl ) { - CTimer::get("XIOS").resume(); - return grid_hdl->domain_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = grid_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -116,9 +119,10 @@ extern "C" bool cxios_is_defined_grid_mask(grid_Ptr grid_hdl ) { - CTimer::get("XIOS").resume(); - return grid_hdl->mask.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = grid_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -143,9 +147,10 @@ extern "C" bool cxios_is_defined_grid_name(grid_Ptr grid_hdl ) { - CTimer::get("XIOS").resume(); - return grid_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = grid_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icgridgroup_attr.cpp b/src/interface/c_attr/icgridgroup_attr.cpp index 793b696..776875c 100644 --- a/src/interface/c_attr/icgridgroup_attr.cpp +++ b/src/interface/c_attr/icgridgroup_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_gridgroup_axis_ref(gridgroup_Ptr gridgroup_hdl ) { - CTimer::get("XIOS").resume(); - return gridgroup_hdl->axis_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = gridgroup_hdl->axis_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_gridgroup_description(gridgroup_Ptr gridgroup_hdl ) { - CTimer::get("XIOS").resume(); - return gridgroup_hdl->description.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = gridgroup_hdl->description.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -90,9 +92,10 @@ extern "C" bool cxios_is_defined_gridgroup_domain_ref(gridgroup_Ptr gridgroup_hdl ) { - CTimer::get("XIOS").resume(); - return gridgroup_hdl->domain_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = gridgroup_hdl->domain_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -117,9 +120,10 @@ extern "C" bool cxios_is_defined_gridgroup_group_ref(gridgroup_Ptr gridgroup_hdl ) { - CTimer::get("XIOS").resume(); - return gridgroup_hdl->group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = gridgroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -143,9 +147,10 @@ extern "C" bool cxios_is_defined_gridgroup_mask(gridgroup_Ptr gridgroup_hdl ) { - CTimer::get("XIOS").resume(); - return gridgroup_hdl->mask.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = gridgroup_hdl->mask.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -170,9 +175,10 @@ extern "C" bool cxios_is_defined_gridgroup_name(gridgroup_Ptr gridgroup_hdl ) { - CTimer::get("XIOS").resume(); - return gridgroup_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = gridgroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icvariable_attr.cpp b/src/interface/c_attr/icvariable_attr.cpp index c982955..3434fa8 100644 --- a/src/interface/c_attr/icvariable_attr.cpp +++ b/src/interface/c_attr/icvariable_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_variable_name(variable_Ptr variable_hdl ) { - CTimer::get("XIOS").resume(); - return variable_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = variable_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_variable_type(variable_Ptr variable_hdl ) { - CTimer::get("XIOS").resume(); - return variable_hdl->type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = variable_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } diff --git a/src/interface/c_attr/icvariablegroup_attr.cpp b/src/interface/c_attr/icvariablegroup_attr.cpp index 70a5c33..8e85f47 100644 --- a/src/interface/c_attr/icvariablegroup_attr.cpp +++ b/src/interface/c_attr/icvariablegroup_attr.cpp @@ -36,9 +36,10 @@ extern "C" bool cxios_is_defined_variablegroup_group_ref(variablegroup_Ptr variablegroup_hdl ) { - CTimer::get("XIOS").resume(); - return variablegroup_hdl->group_ref.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = variablegroup_hdl->group_ref.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -63,9 +64,10 @@ extern "C" bool cxios_is_defined_variablegroup_name(variablegroup_Ptr variablegroup_hdl ) { - CTimer::get("XIOS").resume(); - return variablegroup_hdl->name.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = variablegroup_hdl->name.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } @@ -90,9 +92,10 @@ extern "C" bool cxios_is_defined_variablegroup_type(variablegroup_Ptr variablegroup_hdl ) { - CTimer::get("XIOS").resume(); - return variablegroup_hdl->type.hasInheritedValue(); - CTimer::get("XIOS").suspend(); + CTimer::get("XIOS").resume(); + bool isDefined = variablegroup_hdl->type.hasInheritedValue(); + CTimer::get("XIOS").suspend(); + return isDefined; } -- GitLab From 9e5a92dc2a1766e25de4a2b36dcea2283984b071 Mon Sep 17 00:00:00 2001 From: rlacroix Date: Wed, 25 Mar 2015 14:14:54 +0000 Subject: [PATCH 29/31] Add arch files for building on the Cray XCs using the Cray compiler. Files contributed by Mike Rezny (Met Office). git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@582 d613d254-d18a-4304-b296-5125d4c4d670 --- arch/arch-XC30_Cray.env | 5 +++++ arch/arch-XC30_Cray.fcm | 42 ++++++++++++++++++++++++++++++++++++++++ arch/arch-XC30_Cray.path | 18 +++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 arch/arch-XC30_Cray.env create mode 100644 arch/arch-XC30_Cray.fcm create mode 100644 arch/arch-XC30_Cray.path diff --git a/arch/arch-XC30_Cray.env b/arch/arch-XC30_Cray.env new file mode 100644 index 0000000..63e629d --- /dev/null +++ b/arch/arch-XC30_Cray.env @@ -0,0 +1,5 @@ +export HDF5_INC_DIR="" +export HDF5_LIB_DIR="" + +export NETCDF_INC_DIR="" +export NETCDF_LIB_DIR="" diff --git a/arch/arch-XC30_Cray.fcm b/arch/arch-XC30_Cray.fcm new file mode 100644 index 0000000..df6bf5a --- /dev/null +++ b/arch/arch-XC30_Cray.fcm @@ -0,0 +1,42 @@ +################################################################################ +################### Projet xios - xmlioserver ##################### +################################################################################ + +# Cray XC build instructions for XIOS/xios-1.0 +# These files have been tested on +# Archer (XC30), ECMWF (XC30), and the Met Office (XC40) using the Cray PrgEnv. +# One must also: +# module load cray-netcdf-hdf5parallel/4.3.2 +# There is a bug in the CC compiler prior to cce/8.3.7 using -O3 or -O2 +# The workarounds are not ideal: +# Use -Gfast and put up with VERY large executables +# Use -O1 and possibly suffer a significant performance loss. +# +# Mike Rezny Met Office 23/03/2015 + +%CCOMPILER CC +%FCOMPILER ftn +%LINKER CC + +%BASE_CFLAGS -DMPICH_SKIP_MPICXX -h msglevel_4 -h zero -h gnu + +## Only use -O3 if you can load module cce/8.3.7 or later +#%PROD_CFLAGS -O3 -DBOOST_DISABLE_ASSERTS + +## Otherwise take your pick of these, refer to information above. +%PROD_CFLAGS -O1 -DBOOST_DISABLE_ASSERTS +## %PROD_CFLAGS -Gfast -DBOOST_DISABLE_ASSERTS +%DEV_CFLAGS -O2 +%DEBUG_CFLAGS -g + +%BASE_FFLAGS -em -m 4 -e0 -eZ +%PROD_FFLAGS -O3 +%DEV_FFLAGS -G2 +%DEBUG_FFLAGS -g + +%BASE_INC -D__NONE__ +%BASE_LD -D__NONE__ + +%CPP cpp +%FPP cpp -P -CC +%MAKE gmake diff --git a/arch/arch-XC30_Cray.path b/arch/arch-XC30_Cray.path new file mode 100644 index 0000000..8b97af3 --- /dev/null +++ b/arch/arch-XC30_Cray.path @@ -0,0 +1,18 @@ +NETCDF_INCDIR="" +NETCDF_LIBDIR="" +NETCDF_LIB="" + +MPI_INCDIR="" +MPI_LIBDIR="" +MPI_LIB="" + +HDF5_INCDIR="" +HDF5_LIBDIR="" +HDF5_LIB="" + +OASIS_INCDIR="" +OASIS_LIBDIR="" +OASIS_LIB="" +#OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" +#OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" +#OASIS_LIB="-lpsmile.MPI1 -lscrip -lmct -lmpeu" -- GitLab From b1492a14b48beb70aa381f70046bd0cd20befbba Mon Sep 17 00:00:00 2001 From: aclsce Date: Fri, 3 Apr 2015 15:30:22 +0000 Subject: [PATCH 30/31] - Fixed bug related to average temporal operation - Back to previous netcdf version on Curie waiting for a way to handle specific compilation environment for different users. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@588 d613d254-d18a-4304-b296-5125d4c4d670 --- arch/arch-X64_CURIE.env | 3 ++- arch/arch-X64_CURIE.path | 6 +++--- src/functor/average.cpp | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/arch/arch-X64_CURIE.env b/arch/arch-X64_CURIE.env index acc1d32..3a47f66 100644 --- a/arch/arch-X64_CURIE.env +++ b/arch/arch-X64_CURIE.env @@ -1,3 +1,4 @@ module unload netcdf module unload hdf5 -module load netcdf/4.3.3.1_hdf5_parallel +module load hdf5/1.8.9_parallel +module load netcdf/4.2_hdf5_parallel diff --git a/arch/arch-X64_CURIE.path b/arch/arch-X64_CURIE.path index 8cf23e2..8b35daa 100644 --- a/arch/arch-X64_CURIE.path +++ b/arch/arch-X64_CURIE.path @@ -6,9 +6,9 @@ MPI_INCDIR="" MPI_LIBDIR="" MPI_LIB="" -HDF5_INCDIR="" -HDF5_LIBDIR="" -HDF5_LIB="-lhdf5_hl -lhdf5 -lz -lcurl" +HDF5_INCDIR="-I$HDF5_INC_DIR" +HDF5_LIBDIR="-L$HDF5_LIB_DIR" +HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz -lcurl" OASIS_INCDIR="-I$PWD/../../oasis3-mct/BLD/build/lib/psmile.MPI1" OASIS_LIBDIR="-L$PWD/../../oasis3-mct/BLD/lib" diff --git a/src/functor/average.cpp b/src/functor/average.cpp index cbee49a..4756c34 100644 --- a/src/functor/average.cpp +++ b/src/functor/average.cpp @@ -40,7 +40,7 @@ namespace xios int i, n =_dinput.numElements() ; const double * in=_dinput.dataFirst() ; int* nc=nbcalls.dataFirst() ; - for (i=0; i Date: Wed, 15 Apr 2015 12:59:11 +0000 Subject: [PATCH 31/31] Fix incorrect end date in the output files' names when using splitting. git-svn-id: http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0@589 d613d254-d18a-4304-b296-5125d4c4d670 --- src/node/file.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/file.cpp b/src/node/file.cpp index 02262c4..a3ac457 100644 --- a/src/node/file.cpp +++ b/src/node/file.cpp @@ -270,7 +270,7 @@ namespace xios { else splitFormat="%y"; } else splitFormat=split_freq_format ; - oss<<"_"<getStr(splitFormat)<<"-"<< (*lastSplit+(splitFreq-1*Second)).getStr(splitFormat); + oss<<"_"<getStr(splitFormat)<<"-"<< (*lastSplit + splitFreq - 1 * Second).getStr(splitFormat); } bool multifile=true ; -- GitLab

SsYSOV&?KZ9lcHt-(0_r$ot3xSwZq!} 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 literal 0 HcmV?d00001 diff --git a/tools/archive/blitz.tar.gz b/tools/archive/blitz.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ad364bc1c262a189246fc1190ab60e9dba9202f GIT binary patch literal 220214 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

=}=1>n-d0;a*hFk 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%0AanXw43P=PR^Fpw_U3K!HV>!MKcmQJPJ_E}`pw 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