From 8847ab5bd742c484ea32df0547d60f3c09be872c Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sat, 26 Mar 2016 15:01:14 -0400 Subject: De-templatize three files that didn't need it. --- SConstruct | 2 +- jsongen.py | 1047 +++++++++++++++++++++++++++++++++++++++++++++++++ jsongen.py.in | 1049 -------------------------------------------------- maskaudit.py | 158 ++++++++ maskaudit.py.in | 160 -------- valgrind-audit.py | 103 +++++ valgrind-audit.py.in | 105 ----- 7 files changed, 1309 insertions(+), 1315 deletions(-) create mode 100755 jsongen.py delete mode 100644 jsongen.py.in create mode 100755 maskaudit.py delete mode 100644 maskaudit.py.in create mode 100755 valgrind-audit.py delete mode 100644 valgrind-audit.py.in diff --git a/SConstruct b/SConstruct index 9964e848..7d083584 100644 --- a/SConstruct +++ b/SConstruct @@ -1518,7 +1518,7 @@ if len(python_progs) > 0: pylint = Utility("pylint", ["jsongen.py", "maskaudit.py", python_built_extensions], ['''pylint --rcfile=/dev/null --dummy-variables-rgx='^_' --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" --reports=n --disable=F0001,C0103,C0111,C1001,C0301,C0302,C0322,C0324,C0323,C0321,C0330,R0201,R0801,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,W0110,W0201,W0121,W0123,W0231,W0232,W0234,W0401,W0403,W0141,W0142,W0603,W0614,W0640,W0621,W1504,E0602,E0611,E1101,E1102,E1103,F0401 gps/*.py *.py ''' + " ".join(python_progs)]) -# Additional Python readablity style checks +# Additional Python readability style checks if len(python_progs) > 0: pep8 = Utility("pep8", ["jsongen.py", "maskaudit.py", python_built_extensions], ['''pep8 --ignore=E501,W602,E122,E241,E401 {0} gps/[a-zA-Z]*.py *.py'''.format(" ".join(python_progs))]) diff --git a/jsongen.py b/jsongen.py new file mode 100755 index 00000000..f42b4017 --- /dev/null +++ b/jsongen.py @@ -0,0 +1,1047 @@ +#!/usr/bin/env python +# +# This file is Copyright (c) 2010 by the GPSD project +# BSD terms apply: see the file COPYING in the distribution root for details. +# +# Never hand-hack what you can generate... +# +# This code generates template declarations for AIS-JSON parsing from a +# declarative specification of a JSON structure. +# +# This code runs under both Python 2 and Python 3. Preserve this property! +from __future__ import print_function + +import sys, getopt + +# +# Here is the information that makes it all work - attribute, type, and +# defult information for all fields. We generate a JSON +# parser template spec. Doing it this way guarantees consistency. +# +# Notes on the fields: +# initname: becomes the name of the generated structure initializer +# header: common header to include in front of the structure template +# structname: gets prepended to all fieldnames in the generated C +# fieldmap: each member fills an initializer slot +# stringbuffered: list strings that should be buffered rather than copied +# directly into the structure. + +ais_specs = ( + { + "initname": "json_ais1", + "headers": ("AIS_HEADER",), + "structname": "ais->type1", + "fieldmap": ( + # fieldname type default + ('status', 'uinteger', '0'), + ('status_text', 'ignore', None), + ('turn', 'integer', 'AIS_TURN_NOT_AVAILABLE'), + ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), + ('accuracy', 'boolean', 'false'), + ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), + ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), + ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), + ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), + ('maneuver', 'uinteger', 'AIS_SEC_INOPERATIVE'), + ('raim', 'boolean', 'false'), + ('radio', 'uinteger', '0'), + ), + }, + # Message types 2 and 3 duplicate 1 + { + "initname": "json_ais4", + "headers": ("AIS_HEADER",), + "structname": "ais->type4", + "fieldmap": ( + # fieldname type default + ('timestamp', 'string', None), + ('accuracy', 'boolean', "true"), + ('lon', 'integer', "AIS_LON_NOT_AVAILABLE"), + ('lat', 'integer', "AIS_LAT_NOT_AVAILABLE"), + ('epfd', 'uinteger', "0"), + ('epfd_text', 'ignore', None), + ('raim', 'boolean', "false"), + ('radio', 'uinteger', "0"), + ), + "stringbuffered": ("timestamp",), + }, + { + "initname": "json_ais5", + "headers": ("AIS_HEADER",), + "structname": "ais->type5", + "fieldmap": ( + # fieldname type default + ('imo', 'uinteger', '0'), + ('ais_version', 'uinteger', '0'), + ('callsign', 'string', None), + ('shipname', 'string', None), + ('shiptype', 'uinteger', '0'), + ('shiptype_text', 'ignore', None), + ('to_bow', 'uinteger', '0'), + ('to_stern', 'uinteger', '0'), + ('to_port', 'uinteger', '0'), + ('to_starboard', 'uinteger', '0'), + ('epfd', 'uinteger', '0'), + ('epfd_text', 'ignore', None), + ('eta', 'string', None), + ('draught', 'uinteger', '0'), + ('destination', 'string', None), + ('dte', 'uinteger', '1'), + ), + "stringbuffered": ("eta",), + }, + { + "initname": "json_ais6", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6", + "fieldmap": ( + # fieldname type default + ('data', 'string', None), + ), + "stringbuffered": ("data",), + }, + { + "initname": "json_ais6_fid10", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac235fid10", + "fieldmap": ( + # fieldname type default + ('ana_int', 'uinteger', '0'), + ('ana_ext1', 'uinteger', '0'), + ('ana_ext2', 'uinteger', '0'), + ('racon', 'uinteger', '0'), + ('racon_text', 'ignore', None), + ('light', 'uinteger', '0'), + ('light_text', 'ignore', None), + ('alarm', 'boolean', 'false'), + ('stat_ext', 'uinteger', '0'), + ('off_pos', 'boolean', 'false'), + ), + }, + { + "initname": "json_ais6_fid12", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid12", + "fieldmap": ( + # fieldname type default + ('lastport', 'string', None), + ('departure', 'string', None), + ('nextport', 'string', None), + ('eta', 'string', None), + ('dangerous', 'string', None), + ('imdcat', 'string', None), + ('unid', 'uinteger', '0'), + ('amount', 'uinteger', '0'), + ('unit', 'uinteger', '0'), + ), + "stringbuffered": ("departure", "eta",), + }, + { + "initname": "json_ais6_fid15", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid15", + "fieldmap": ( + # fieldname type default + ('airdraught', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais6_fid16", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid16", + "fieldmap": ( + # fieldname type default + ('persons', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais6_fid18", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid18", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('arrival', 'string', None), + ('portname', 'string', None), + ('destination', 'string', None), + ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), + ), + 'stringbuffered': ('arrival',), + }, + { + "initname": "json_ais6_fid20", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid20", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('berth_length', 'uinteger', '0'), + ('berth_depth', 'uinteger', '0'), + ('position', 'uinteger', '0'), + ('position_text', 'ignore', None), + ('arrival', 'string', None), + ('availability', 'uinteger', '0'), + ('agent', 'uinteger', '0'), + ('fuel', 'uinteger', '0'), + ('chandler', 'uinteger', '0'), + ('stevedore', 'uinteger', '0'), + ('electrical', 'uinteger', '0'), + ('water', 'uinteger', '0'), + ('customs', 'uinteger', '0'), + ('cartage', 'uinteger', '0'), + ('crane', 'uinteger', '0'), + ('lift', 'uinteger', '0'), + ('medical', 'uinteger', '0'), + ('navrepair', 'uinteger', '0'), + ('provisions', 'uinteger', '0'), + ('shiprepair', 'uinteger', '0'), + ('surveyor', 'uinteger', '0'), + ('steam', 'uinteger', '0'), + ('tugs', 'uinteger', '0'), + ('solidwaste', 'uinteger', '0'), + ('liquidwaste', 'uinteger', '0'), + ('hazardouswaste', 'uinteger', '0'), + ('ballast', 'uinteger', '0'), + ('additional', 'uinteger', '0'), + ('regional1', 'uinteger', '0'), + ('regional2', 'uinteger', '0'), + ('future1', 'uinteger', '0'), + ('future2', 'uinteger', '0'), + ('berth_name', 'string', None), + ('berth_lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), + ('berth_lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), + ), + 'stringbuffered': ('arrival', 'berth_name',), + }, + { + "initname": "json_ais6_fid21", + "headers": ("AIS_HEADER", "AIS_TYPE6"), + "structname": "ais->type6.dac200fid21", + "fieldmap": ( + # fieldname type default + ('country', 'string', None), + ('locode', 'string', None), + ('section', 'string', None), + ('terminal', 'string', None), + ('hectometre', 'string', None), + ('eta', 'string', None), + ('tugs', 'uinteger', '0'), + ('airdraught', 'uinteger', '0'), + ), + "stringbuffered": ("eta",), + }, + { + "initname": "json_ais6_fid22", + "headers": ("AIS_HEADER", "AIS_TYPE6"), + "structname": "ais->type6.dac200fid22", + "fieldmap": ( + # fieldname type default + ('country', 'string', None), + ('locode', 'string', None), + ('section', 'string', None), + ('terminal', 'string', None), + ('hectometre', 'string', None), + ('rta', 'string', None), + ('status', 'uinteger', 'DAC200FID22_STATUS_NOT_AVAILABLE'), + ), + "stringbuffered": ("rta",), + }, + { + "initname": "json_ais6_fid25", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid25", + "fieldmap": ( + # fieldname type default + ('unit', 'uinteger', '0'), + ('amount', 'uinteger', '0'), + ('cargos', 'array', ( + ('cargo_t', 'ncargos', ( + ('code', 'uinteger', '0'), + ('subtype', 'uinteger', '0'), + )))), + ), + }, + { + "initname": "json_ais6_fid28", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid28", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('sender', 'uinteger', '0'), + ('rtype', 'uinteger', '0'), + ('rtype_text', 'ignore', None), + ('start', 'string', None), + ('duration', 'uinteger', '0'), + ('waypoints', 'array', ( + ('waypoint_t', 'waycount', ( + ('lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), + )))), + ), + 'stringbuffered': ('start',), + }, + { + "initname": "json_ais6_fid30", + "headers": ("AIS_HEADER", "AIS_TYPE6",), + "structname": "ais->type6.dac1fid30", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('text', 'string', '0'), + ), + }, + { + "initname": "json_ais6_fid32", + "headers": ("AIS_HEADER", "AIS_TYPE6"), + "structname": "ais->type6.dac1fid32", + "fieldmap": ( + # fieldname type default + ('month', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), + ('day', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), + ('tidals', 'array', ( + ('tidal_t', 'ntidals', ( + ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), + ('from_hour', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), + ('from_min', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), + ('to_hour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), + ('to_min', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), + ('cdir', 'uinteger', 'DAC1FID32_CDIR_NOT_AVAILABLE'), + ('cspeed', 'uinteger', 'DAC1FID32_CSPEED_NOT_AVAILABLE'), + )))), + ), + }, + { + "initname": "json_ais6_fid55", + "headers": ("AIS_HEADER", "AIS_TYPE6"), + "structname": "ais->type6.dac200fid55", + "fieldmap": ( + # fieldname type default + ('crew', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), + ('passengers', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), + ('personnel', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), + ), + }, + { + "initname": "json_ais7", + "headers": ("AIS_HEADER",), + "structname": "ais->type7", + "fieldmap": ( + # fieldname type default + ('mmsi1', 'uinteger', '0'), + ('mmsi2', 'uinteger', '0'), + ('mmsi3', 'uinteger', '0'), + ('mmsi4', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais8", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8", + "fieldmap": ( + # fieldname type default + ('data', 'string', None), + ), + "stringbuffered": ("data",), + }, + { + "initname": "json_ais8_fid10", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac200fid10", + "fieldmap": ( + # fieldname type default + ('vin', 'string', None), + ('length', 'uinteger', '0'), + ('beam', 'uinteger', '0'), + ('shiptype', 'uinteger', '0'), + ('shiptype_text', 'ignore', None), + ('hazard', 'uinteger', '0'), + ('hazard_text', 'ignore', None), + ('draught', 'uinteger', '0'), + ('loaded', 'uinteger', '0'), + ('loaded_text', 'ignore', None), + ('speed_q', 'boolean', 'false'), + ('course_q', 'boolean', 'false'), + ('heading_q', 'boolean', 'false'), + ), + }, + { + "initname": "json_ais8_fid11", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid11", + "fieldmap": ( + # fieldname type default + ('lat', 'integer', 'DAC1FID11_LAT_NOT_AVAILABLE'), + ('lon', 'integer', 'DAC1FID11_LON_NOT_AVAILABLE'), + ('timestamp', 'string', None), + ('wspeed', 'uinteger', 'DAC1FID11_WSPEED_NOT_AVAILABLE'), + ('wgust', 'uinteger', 'DAC1FID11_WSPEED_NOT_AVAILABLE'), + ('wdir', 'uinteger', 'DAC1FID11_WDIR_NOT_AVAILABLE'), + ('wgustdir', 'uinteger', 'DAC1FID11_WDIR_NOT_AVAILABLE'), + ('airtemp', 'uinteger', 'DAC1FID11_AIRTEMP_NOT_AVAILABLE'), + ('humidity', 'uinteger', 'DAC1FID11_HUMIDITY_NOT_AVAILABLE'), + ('dewpoint', 'uinteger', 'DAC1FID11_DEWPOINT_NOT_AVAILABLE'), + ('pressure', 'uinteger', 'DAC1FID11_PRESSURE_NOT_AVAILABLE'), + ('pressuretend', 'uinteger', 'DAC1FID11_PRESSURETREND_NOT_AVAILABLE'), + ('visibility', 'uinteger', 'DAC1FID11_VISIBILITY_NOT_AVAILABLE'), + ('waterlevel', 'integer', 'DAC1FID11_WATERLEVEL_NOT_AVAILABLE'), + ('leveltrend', 'uinteger', 'DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE'), + ('cspeed', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), + ('cdir', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), + ('cspeed2', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), + ('cdir2', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), + ('cdepth2', 'uinteger', 'DAC1FID11_CDEPTH_NOT_AVAILABLE'), + ('cspeed3', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), + ('cdir3', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), + ('cdepth3', 'uinteger', 'DAC1FID11_CDEPTH_NOT_AVAILABLE'), + ('waveheight', 'uinteger', 'DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE'), + ('waveperiod', 'uinteger', 'DAC1FID11_WAVEPERIOD_NOT_AVAILABLE'), + ('wavedir', 'uinteger', 'DAC1FID11_WAVEDIR_NOT_AVAILABLE'), + ('swellheight', 'uinteger', 'DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE'), + ('swellperiod', 'uinteger', 'DAC1FID11_WAVEPERIOD_NOT_AVAILABLE'), + ('swelldir', 'uinteger', 'DAC1FID11_WAVEDIR_NOT_AVAILABLE'), + ('seastate', 'uinteger', 'DAC1FID11_SEASTATE_NOT_AVAILABLE'), + ('watertemp', 'uinteger', 'DAC1FID11_WATERTEMP_NOT_AVAILABLE'), + ('preciptype', 'uinteger', 'DAC1FID11_PRECIPTYPE_NOT_AVAILABLE'), + ('preciptype_text', 'ignore', None), + ('salinity', 'uinteger', 'DAC1FID11_SALINITY_NOT_AVAILABLE'), + ('ice', 'uinteger', 'DAC1FID11_ICE_NOT_AVAILABLE'), + ('ice_text', 'ignore', None), + ), + "stringbuffered": ("timestamp",), + }, + { + "initname": "json_ais8_fid13", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid13", + "fieldmap": ( + # fieldname type default + ('reason', 'string', None), + ('closefrom', 'string', None), + ('closeto', 'string', None), + ('radius', 'uinteger', 'AIS_DAC1FID13_RADIUS_NOT_AVAILABLE'), + ('extunit', 'uinteger', 'AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE'), + ('fday', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), + ('fmonth', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), + ('fhour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), + ('fminute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), + ('tday', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), + ('tmonth', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), + ('thour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), + ('tminute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), + ), + 'stringbuffered': ('closefrom', 'closeto'), + }, + { + "initname": "json_ais8_fid15", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid15", + "fieldmap": ( + # fieldname type default + ('airdraught', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais8_fid16", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid16", + "fieldmap": ( + # fieldname type default + ('persons', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais8_fid17", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid17", + "fieldmap": ( + # fieldname type default + ('targets', 'array', ( + ('target_t', 'ntargets', ( + ('idtype', 'uinteger', 'DAC1FID17_IDTYPE_OTHER'), + ("id.mmsi", 'uinteger', '0'), + ("id.imo", 'uinteger', '0'), + ("id.callsign", 'string', 'DAC1FID17_ID_LENGTH'), + ("id.other", 'string', 'DAC1FID17_ID_LENGTH'), + ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), + ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), + ('course', 'uinteger', 'DAC1FID17_COURSE_NOT_AVAILABLE'), + ('second', 'uinteger', 'AIS_SECOND_NOT_AVAILABLE'), + ('speed', 'uinteger', 'DAC1FID17_SPEED_NOT_AVAILABLE'), + )))), + ), + }, + { + "initname": "json_ais8_fid19", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid19", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('station', 'string', None), + ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), + ('status', 'uinteger', '0'), + ('signal', 'uinteger', '0'), + ('signal_text', 'ignore', None), + ('hour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), + ('minute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), + ('nextsignal', 'uinteger', '0'), + ('nextsignal_type', 'ignore', None), + ), + }, + { + "initname": "json_ais8_fid23", + "headers": ("AIS_HEADER", "AIS_TYPE8"), + "structname": "ais->type8.dac200fid23", + "fieldmap": ( + # fieldname type default + ('start', 'string', None), + ('end', 'string', None), + ('start_lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), + ('start_lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), + ('end_lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), + ('end_lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), + ('type', 'uinteger', 'DAC200FID23_TYPE_UNKNOWN'), + ('type_text', 'ignore', None), + ('min', 'integer', 'DAC200FID23_MIN_UNKNOWN'), + ('max', 'integer', 'DAC200FID23_MAX_UNKNOWN'), + ('intensity', 'uinteger', 'DAC200FID23_CLASS_UNKNOWN'), + ('intensity_text', 'ignore', None), + ('wind', 'uinteger', 'DAC200FID23_WIND_UNKNOWN'), + ('wind_text', 'ignore', None), + ), + 'stringbuffered': ('start', 'end'), + }, + { + "initname": "json_ais8_fid24", + "headers": ("AIS_HEADER", "AIS_TYPE8"), + "structname": "ais->type8.dac200fid24", + "fieldmap": ( + # fieldname type default + ('country', 'string', None), + ('gauges', 'array', ( + ('gauge_t', 'ngauges', ( + ('id', 'uinteger', 'DAC200FID24_GAUGE_ID_UNKNOWN'), + ('level', 'integer', 'DAC200FID24_GAUGE_LEVEL_UNKNOWN'), + )))), + ), + }, + { + "initname": "json_ais8_fid27", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid27", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('sender', 'uinteger', '0'), + ('rtype', 'uinteger', '0'), + ('rtype_text', 'ignore', None), + ('start', 'string', None), + ('duration', 'uinteger', '0'), + ('waypoints', 'array', ( + ('waypoint_t', 'waycount', ( + ('lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), + )))), + ), + 'stringbuffered': ('start',), + }, + { + "initname": "json_ais8_fid29", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid29", + "fieldmap": ( + # fieldname type default + ('linkage', 'uinteger', '0'), + ('text', 'string', '0'), + ), + }, + { + "initname": "json_ais8_fid31", + "headers": ("AIS_HEADER", "AIS_TYPE8",), + "structname": "ais->type8.dac1fid31", + "fieldmap": ( + # fieldname type default + ('lon', 'integer', 'DAC1FID31_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'DAC1FID31_LAT_NOT_AVAILABLE'), + ('accuracy', 'boolean', 'false'), + ('timestamp', 'string', None), + ('wspeed', 'uinteger', 'DAC1FID31_WIND_NOT_AVAILABLE'), + ('wgust', 'uinteger', 'DAC1FID31_WIND_NOT_AVAILABLE'), + ('wdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('wgustdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('airtemp', 'integer', 'DAC1FID31_AIRTEMP_NOT_AVAILABLE'), + ('humidity', 'uinteger', 'DAC1FID31_HUMIDITY_NOT_AVAILABLE'), + ('dewpoint', 'integer', 'DAC1FID31_DEWPOINT_NOT_AVAILABLE'), + ('pressure', 'uinteger', 'DAC1FID31_PRESSURE_NOT_AVAILABLE'), + ('pressuretend', 'uinteger', 'DAC1FID31_PRESSURETEND_NOT_AVAILABLE'), + ('visgreater', 'boolean', 'false'), + ('visibility', 'uinteger', 'DAC1FID31_VISIBILITY_NOT_AVAILABLE'), + ('waterlevel', 'integer', 'DAC1FID31_WATERLEVEL_NOT_AVAILABLE'), + ('leveltrend', 'uinteger', 'DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE'), + ('cspeed', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), + ('cdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('cspeed2', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), + ('cdir2', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('cdepth2', 'uinteger', 'DAC1FID31_CDEPTH_NOT_AVAILABLE'), + ('cspeed3', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), + ('cdir3', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('cdepth3', 'uinteger', 'DAC1FID31_CDEPTH_NOT_AVAILABLE'), + ('waveheight', 'uinteger', 'DAC1FID31_HEIGHT_NOT_AVAILABLE'), + ('waveperiod', 'uinteger', 'DAC1FID31_PERIOD_NOT_AVAILABLE'), + ('wavedir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('swellheight', 'uinteger', 'DAC1FID31_HEIGHT_NOT_AVAILABLE'), + ('swellperiod', 'uinteger', 'DAC1FID31_PERIOD_NOT_AVAILABLE'), + ('swelldir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), + ('seastate', 'uinteger', 'DAC1FID31_SEASTATE_NOT_AVAILABLE'), + ('watertemp', 'integer', 'DAC1FID31_WATERTEMP_NOT_AVAILABLE'), + ('preciptype', 'uinteger', 'DAC1FID31_PRECIPTYPE_NOT_AVAILABLE'), + ('preciptype_text', 'ignore', None), + ('salinity', 'uinteger', 'DAC1FID31_SALINITY_NOT_AVAILABLE'), + ('ice', 'uinteger', 'DAC1FID31_ICE_NOT_AVAILABLE'), + ), + "stringbuffered": ("timestamp",), + }, + { + "initname": "json_ais8_fid40", + "headers": ("AIS_HEADER", "AIS_TYPE8"), + "structname": "ais->type8.dac200fid40", + "fieldmap": ( + # fieldname type default + ('form', 'uinteger', 'DAC200FID40_FORM_UNKNOWN'), + ('facing', 'uinteger', 'DAC200FID40_FACING_UNKNOWN'), + ('direction', 'uinteger', 'DAC200FID40_DIRECTION_UNKNOWN'), + ('direction_text', 'ignore', None), + ('status', 'uinteger', 'DAC200FID40_STATUS_UNKNOWN'), + ('status_text', 'ignore', None), + ), + }, + { + "initname": "json_ais9", + "headers": ("AIS_HEADER",), + "structname": "ais->type9", + "fieldmap": ( + # fieldname type default + ('alt', 'uinteger', 'AIS_ALT_NOT_AVAILABLE'), + ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), + ('accuracy', 'boolean', 'false'), + ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), + ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), + ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), + ('regional', 'uinteger', '0'), + ('dte', 'uinteger', '1'), + ('raim', 'boolean', 'false'), + ('radio', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais10", + "headers": ("AIS_HEADER",), + "structname": "ais->type10", + "fieldmap": ( + # fieldname type default + ('dest_mmsi', 'uinteger', '0'), + ), + }, + # Message type 11 duplicates 4 + { + "initname": "json_ais12", + "headers": ("AIS_HEADER",), + "structname": "ais->type12", + "fieldmap": ( + # fieldname type default + ('seqno', 'uinteger', '0'), + ('dest_mmsi', 'uinteger', '0'), + ('retransmit', 'boolean', '0'), + ('text', 'string', None), + ), + }, + # Message type 13 duplicates 7 + { + "initname": "json_ais14", + "headers": ("AIS_HEADER",), + "structname": "ais->type14", + "fieldmap": ( + # fieldname type default + ('text', 'string', None), + ), + }, + { + "initname": "json_ais15", + "headers": ("AIS_HEADER",), + "structname": "ais->type15", + "fieldmap": ( + # fieldname type default + ('mmsi1', 'uinteger', '0'), + ('type1_1', 'uinteger', '0'), + ('offset1_1', 'uinteger', '0'), + ('type1_2', 'uinteger', '0'), + ('offset1_2', 'uinteger', '0'), + ('mmsi2', 'uinteger', '0'), + ('type2_1', 'uinteger', '0'), + ('offset2_1', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais16", + "headers": ("AIS_HEADER",), + "structname": "ais->type16", + "fieldmap": ( + # fieldname type default + ('mmsi1', 'uinteger', '0'), + ('offset1', 'uinteger', '0'), + ('increment1', 'uinteger', '0'), + ('mmsi2', 'uinteger', '0'), + ('offset2', 'uinteger', '0'), + ('increment2', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais17", + "headers": ("AIS_HEADER",), + "structname": "ais->type17", + "fieldmap": ( + # fieldname type default + ('lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), + ('data', 'string', None), + ), + "stringbuffered": ("data",), + }, + { + "initname": "json_ais18", + "headers": ("AIS_HEADER",), + "structname": "ais->type18", + "fieldmap": ( + # fieldname type default + ('reserved', 'uinteger', '0'), + ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), + ('accuracy', 'boolean', 'false'), + ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), + ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), + ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), + ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), + ('regional', 'uinteger', '0'), + ('cs', 'boolean', 'false'), + ('display', 'boolean', 'false'), + ('dsc', 'boolean', 'false'), + ('band', 'boolean', 'false'), + ('msg22', 'boolean', 'false'), + ('raim', 'boolean', 'false'), + ('radio', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais19", + "headers": ("AIS_HEADER",), + "structname": "ais->type19", + "fieldmap": ( + # fieldname type default + ('reserved', 'uinteger', '0'), + ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), + ('accuracy', 'boolean', 'false'), + ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), + ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), + ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), + ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), + ('regional', 'uinteger', '0'), + ('shipname', 'string', None), + ('shiptype', 'uinteger', '0'), + ('shiptype_text', 'ignore', None), + ('to_bow', 'uinteger', '0'), + ('to_stern', 'uinteger', '0'), + ('to_port', 'uinteger', '0'), + ('to_starboard', 'uinteger', '0'), + ('epfd', 'uinteger', '0'), + ('epfd_text', 'ignore', None), + ('raim', 'boolean', 'false'), + ('dte', 'uinteger', '1'), + ('assigned', 'boolean', 'false'), + ), + }, + { + "initname": "json_ais20", + "headers": ("AIS_HEADER",), + "structname": "ais->type20", + "fieldmap": ( + # fieldname type default + ('offset1', 'uinteger', '0'), + ('number1', 'uinteger', '0'), + ('timeout1', 'uinteger', '0'), + ('increment1', 'uinteger', '0'), + ('offset2', 'uinteger', '0'), + ('number2', 'uinteger', '0'), + ('timeout2', 'uinteger', '0'), + ('increment2', 'uinteger', '0'), + ('offset3', 'uinteger', '0'), + ('number3', 'uinteger', '0'), + ('timeout3', 'uinteger', '0'), + ('increment3', 'uinteger', '0'), + ('offset4', 'uinteger', '0'), + ('number4', 'uinteger', '0'), + ('timeout4', 'uinteger', '0'), + ('increment4', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais21", + "headers": ("AIS_HEADER",), + "structname": "ais->type21", + "fieldmap": ( + # fieldname type default + ('aid_type', 'uinteger', '0'), + ('aid_type_text', 'ignore', None), + ('name', 'string', None), + ('accuracy', 'boolean', 'false'), + ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), + ('to_bow', 'uinteger', '0'), + ('to_stern', 'uinteger', '0'), + ('to_port', 'uinteger', '0'), + ('to_starboard', 'uinteger', '0'), + ('epfd', 'uinteger', '0'), + ('epfd_text', 'ignore', None), + ('second', 'uinteger', '0'), + ('regional', 'uinteger', '0'), + ('off_position', 'boolean', 'false'), + ('raim', 'boolean', 'false'), + ('virtual_aid', 'boolean', 'false'), + ), + }, + { + "initname": "json_ais22", + "headers": ("AIS_HEADER",), + "structname": "ais->type22", + "fieldmap": ( + # fieldname type default + ('channel_a', 'uinteger', '0'), + ('channel_b', 'uinteger', '0'), + ('txrx', 'uinteger', '0'), + ('power', 'boolean', 'false'), + ('area.ne_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), + ('area.ne_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), + ('area.sw_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), + ('area.sw_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), + ('mmsi.dest1', 'uinteger', '0'), + ('mmsi.dest2', 'uinteger', '0'), + ('addressed', 'boolean', 'false'), + ('band_a', 'boolean', 'false'), + ('band_b', 'boolean', 'false'), + ('zonesize', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais23", + "headers": ("AIS_HEADER",), + "structname": "ais->type23", + "fieldmap": ( + # fieldname type default + ('ne_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), + ('ne_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), + ('sw_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), + ('sw_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), + ('stationtype', 'uinteger', '0'), + ('stationtype_text', 'ignore', None), + ('shiptype', 'uinteger', '0'), + ('shiptype_text', 'ignore', None), + ('txrx', 'uinteger', '0'), + ('interval', 'uinteger', '0'), + ('quiet', 'uinteger', '0'), + ), + }, + { + "initname": "json_ais24", + "headers": ("AIS_HEADER",), + "structname": "ais->type24", + "fieldmap": ( + # fieldname type default + ('shipname', 'string', None), # Part A + ('shiptype', 'uinteger', '0'), # Part B + ('shiptype_text', 'ignore', None), + ('vendorid', 'string', None), # Part B + ('model', 'uinteger', '0'), # Part B + ('serial', 'uinteger', '0'), # Part B + ('callsign', 'string', None), # Part B + ('mothership_mmsi', 'uinteger', '0'), # Part B + ('dim.to_bow', 'uinteger', '0'), # Part B + ('dim.to_stern', 'uinteger', '0'), # Part B + ('dim.to_port', 'uinteger', '0'), # Part B + ('dim.to_starboard', 'uinteger', '0'), # Part B + ), + }, + { + "initname": "json_ais25", + "headers": ("AIS_HEADER",), + "structname": "ais->type25", + "fieldmap": ( + # fieldname type default + ('addressed', 'boolean', 'false'), + ('structured', 'boolean', 'false'), + ('dest_mmsi', 'uinteger', '0'), + ('app_id', 'uinteger', '0'), + ('data', 'string', None), + ), + "stringbuffered": ("data",), + }, + { + "initname": "json_ais26", + "headers": ("AIS_HEADER",), + "structname": "ais->type26", + "fieldmap": ( + # fieldname type default + ('addressed', 'boolean', 'false'), + ('structured', 'boolean', 'false'), + ('dest_mmsi', 'uinteger', '0'), + ('app_id', 'uinteger', '0'), + ('data', 'string', None), + ('radio', 'uinteger', '0'), + ), + "stringbuffered": ("data",), + }, + { + "initname": "json_ais27", + "headers": ("AIS_HEADER",), + "structname": "ais->type27", + "fieldmap": ( + # fieldname type default + ('status', 'uinteger', '0'), + ('speed', 'uinteger', 'AIS_LONGRANGE_SPEED_NOT_AVAILABLE'), + ('accuracy', 'boolean', 'false'), + ('lon', 'integer', 'AIS_LONGRANGE_LON_NOT_AVAILABLE'), + ('lat', 'integer', 'AIS_LONGRANGE_LAT_NOT_AVAILABLE'), + ('course', 'uinteger', 'AIS_LONGRANGE_COURSE_NOT_AVAILABLE'), + ('raim', 'boolean', 'false'), + ('gnss', 'boolean', 'true'), + ), + }, +) + +# You should not need to modify anything below this line. + + +def generate(spec): + report = "" + leader = " " * 39 + initname = spec["initname"] + # Utter storage declarations for any fields that are declared to be + # stringbuffered. These will need to be postprocessed in json_ais_read(). + attributes = [t[0] for t in spec["fieldmap"]] + for attr in spec.get("stringbuffered", []): + if attr not in attributes: + sys.stderr.write("buffered %s is not in base attributes of %s\n" + % (attr, initname)) + raise SystemExit(1) + elif attr not in outboard: + report += " char %s[JSON_VAL_MAX+1];\n" % attr + outboard.append(attr) + + structname = spec["structname"] + # If there are structarrays describing array subobjects, we need + # to make a separate parse control initializer for each one. The + # attribute name is the name of the array; substructure and length + # fieldnames must be given in the defaults part. + for (attr, itype, arrayparts) in spec["fieldmap"]: + if itype == 'array': + (innerstruct, lengthfield, elements) = arrayparts + report += " const struct json_attr_t %s_%s_subtype[] = {\n" % (initname, attr) + for (subattr, subitype, default) in elements: + report += '\t{"%s",%st_%s,%sSTRUCTOBJECT(struct %s, %s),\n' % \ + (subattr, " " * (14 - len(subattr)), subitype, " " * (8 - len(subitype)), innerstruct, subattr) + if subitype != "string": + report += leader + ".dflt.%s = %s},\n" % (subitype, default) + elif default: + report += leader + ".len = %s},\n" % (default,) + else: + sys.stderr.write("explicit length specification required\n") + raise SystemExit(1) + report += """\ + {NULL} + }; +""" + # Generate the main structure definition describing this parse. + # It may have object subarrays. + report += " const struct json_attr_t %s[] = {\n" % initname + if "headers" in spec: + for header in spec["headers"]: + report += '\t' + header + "\n" + for (attr, itype, default) in spec["fieldmap"]: + if itype == 'array': + (innerstruct, lengthfield, elements) = default + report += '\t{"%s",%st_array, STRUCTARRAY(%s.%s, %s_%s_subtype, &%s.%s)},\n' \ + % (attr, " " * (14 - len(attr)), structname, attr, initname, attr, structname, lengthfield) + else: + if itype == "string": + deref = "" + else: + deref = "&" + if attr in spec.get("stringbuffered", []): + target = attr + else: + target = structname + "." + attr + if "." in attr: + attr = attr[attr.rfind(".") + 1:] + if itype == 'ignore': + report += '\t{"%s", t_ignore},\n' % attr + continue + report += '\t{"%s",%st_%s,%s.addr.%s = %s%s,\n' % \ + (attr, " " * (14 - len(attr)), itype, " " * (10 - len(itype)), itype, deref, target) + if itype == "string": + report += leader + ".len = sizeof(%s)},\n" % target + else: + report += leader + ".dflt.%s = %s},\n" % (itype, default) + report += """\ + {NULL} + }; +""" + print(report) + +if __name__ == '__main__': + try: + # The --ais and --target= options are (required) placeholders. + # In the future, this script will generate more different kinds + # of code. + (options, arguments) = getopt.getopt(sys.argv[1:], "", ["ais", "target="]) + except getopt.GetoptError as msg: + print("jsongen.py: " + str(msg)) + raise SystemExit(1) + + spec = None + target = None + for (switch, val) in options: + if switch == '--ais': + spec = ais_specs + elif switch == '--target': + target = val + + if not target or not spec: + print("jsongen.py: must specify type and target.") + raise SystemExit(1) + + if target == 'parser': + print("""/* + * This is code generated by jsongen.py. Do not hand-hack it! + */ + #define NITEMS(x) (int)(sizeof(x)/sizeof(x[0])) + +/*@ -fullinitblock */ + +""") + outboard = [] + for description in spec: + generate(description) + print(""" +/*@ +fullinitblock */ + +/* Generated code ends. */ +""") +# The following sets edit modes for GNU EMACS +# Local Variables: +# mode:python +# End: diff --git a/jsongen.py.in b/jsongen.py.in deleted file mode 100644 index 6dbd93c6..00000000 --- a/jsongen.py.in +++ /dev/null @@ -1,1049 +0,0 @@ -#!/usr/bin/env python -# -# @MASTER@ -# -# This file is Copyright (c) 2010 by the GPSD project -# BSD terms apply: see the file COPYING in the distribution root for details. -# -# Never hand-hack what you can generate... -# -# This code generates template declarations for AIS-JSON parsing from a -# declarative specification of a JSON structure. -# -# This code runs under both Python 2 and Python 3. Preserve this property! -from __future__ import print_function - -import sys, getopt - -# -# Here is the information that makes it all work - attribute, type, and -# defult information for all fields. We generate a JSON -# parser template spec. Doing it this way guarantees consistency. -# -# Notes on the fields: -# initname: becomes the name of the generated structure initializer -# header: common header to include in front of the structure template -# structname: gets prepended to all fieldnames in the generated C -# fieldmap: each member fills an initializer slot -# stringbuffered: list strings that should be buffered rather than copied -# directly into the structure. - -ais_specs = ( - { - "initname": "json_ais1", - "headers": ("AIS_HEADER",), - "structname": "ais->type1", - "fieldmap": ( - # fieldname type default - ('status', 'uinteger', '0'), - ('status_text', 'ignore', None), - ('turn', 'integer', 'AIS_TURN_NOT_AVAILABLE'), - ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), - ('accuracy', 'boolean', 'false'), - ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), - ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), - ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), - ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), - ('maneuver', 'uinteger', 'AIS_SEC_INOPERATIVE'), - ('raim', 'boolean', 'false'), - ('radio', 'uinteger', '0'), - ), - }, - # Message types 2 and 3 duplicate 1 - { - "initname": "json_ais4", - "headers": ("AIS_HEADER",), - "structname": "ais->type4", - "fieldmap": ( - # fieldname type default - ('timestamp', 'string', None), - ('accuracy', 'boolean', "true"), - ('lon', 'integer', "AIS_LON_NOT_AVAILABLE"), - ('lat', 'integer', "AIS_LAT_NOT_AVAILABLE"), - ('epfd', 'uinteger', "0"), - ('epfd_text', 'ignore', None), - ('raim', 'boolean', "false"), - ('radio', 'uinteger', "0"), - ), - "stringbuffered": ("timestamp",), - }, - { - "initname": "json_ais5", - "headers": ("AIS_HEADER",), - "structname": "ais->type5", - "fieldmap": ( - # fieldname type default - ('imo', 'uinteger', '0'), - ('ais_version', 'uinteger', '0'), - ('callsign', 'string', None), - ('shipname', 'string', None), - ('shiptype', 'uinteger', '0'), - ('shiptype_text', 'ignore', None), - ('to_bow', 'uinteger', '0'), - ('to_stern', 'uinteger', '0'), - ('to_port', 'uinteger', '0'), - ('to_starboard', 'uinteger', '0'), - ('epfd', 'uinteger', '0'), - ('epfd_text', 'ignore', None), - ('eta', 'string', None), - ('draught', 'uinteger', '0'), - ('destination', 'string', None), - ('dte', 'uinteger', '1'), - ), - "stringbuffered": ("eta",), - }, - { - "initname": "json_ais6", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6", - "fieldmap": ( - # fieldname type default - ('data', 'string', None), - ), - "stringbuffered": ("data",), - }, - { - "initname": "json_ais6_fid10", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac235fid10", - "fieldmap": ( - # fieldname type default - ('ana_int', 'uinteger', '0'), - ('ana_ext1', 'uinteger', '0'), - ('ana_ext2', 'uinteger', '0'), - ('racon', 'uinteger', '0'), - ('racon_text', 'ignore', None), - ('light', 'uinteger', '0'), - ('light_text', 'ignore', None), - ('alarm', 'boolean', 'false'), - ('stat_ext', 'uinteger', '0'), - ('off_pos', 'boolean', 'false'), - ), - }, - { - "initname": "json_ais6_fid12", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid12", - "fieldmap": ( - # fieldname type default - ('lastport', 'string', None), - ('departure', 'string', None), - ('nextport', 'string', None), - ('eta', 'string', None), - ('dangerous', 'string', None), - ('imdcat', 'string', None), - ('unid', 'uinteger', '0'), - ('amount', 'uinteger', '0'), - ('unit', 'uinteger', '0'), - ), - "stringbuffered": ("departure", "eta",), - }, - { - "initname": "json_ais6_fid15", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid15", - "fieldmap": ( - # fieldname type default - ('airdraught', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais6_fid16", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid16", - "fieldmap": ( - # fieldname type default - ('persons', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais6_fid18", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid18", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('arrival', 'string', None), - ('portname', 'string', None), - ('destination', 'string', None), - ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), - ), - 'stringbuffered': ('arrival',), - }, - { - "initname": "json_ais6_fid20", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid20", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('berth_length', 'uinteger', '0'), - ('berth_depth', 'uinteger', '0'), - ('position', 'uinteger', '0'), - ('position_text', 'ignore', None), - ('arrival', 'string', None), - ('availability', 'uinteger', '0'), - ('agent', 'uinteger', '0'), - ('fuel', 'uinteger', '0'), - ('chandler', 'uinteger', '0'), - ('stevedore', 'uinteger', '0'), - ('electrical', 'uinteger', '0'), - ('water', 'uinteger', '0'), - ('customs', 'uinteger', '0'), - ('cartage', 'uinteger', '0'), - ('crane', 'uinteger', '0'), - ('lift', 'uinteger', '0'), - ('medical', 'uinteger', '0'), - ('navrepair', 'uinteger', '0'), - ('provisions', 'uinteger', '0'), - ('shiprepair', 'uinteger', '0'), - ('surveyor', 'uinteger', '0'), - ('steam', 'uinteger', '0'), - ('tugs', 'uinteger', '0'), - ('solidwaste', 'uinteger', '0'), - ('liquidwaste', 'uinteger', '0'), - ('hazardouswaste', 'uinteger', '0'), - ('ballast', 'uinteger', '0'), - ('additional', 'uinteger', '0'), - ('regional1', 'uinteger', '0'), - ('regional2', 'uinteger', '0'), - ('future1', 'uinteger', '0'), - ('future2', 'uinteger', '0'), - ('berth_name', 'string', None), - ('berth_lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), - ('berth_lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), - ), - 'stringbuffered': ('arrival', 'berth_name',), - }, - { - "initname": "json_ais6_fid21", - "headers": ("AIS_HEADER", "AIS_TYPE6"), - "structname": "ais->type6.dac200fid21", - "fieldmap": ( - # fieldname type default - ('country', 'string', None), - ('locode', 'string', None), - ('section', 'string', None), - ('terminal', 'string', None), - ('hectometre', 'string', None), - ('eta', 'string', None), - ('tugs', 'uinteger', '0'), - ('airdraught', 'uinteger', '0'), - ), - "stringbuffered": ("eta",), - }, - { - "initname": "json_ais6_fid22", - "headers": ("AIS_HEADER", "AIS_TYPE6"), - "structname": "ais->type6.dac200fid22", - "fieldmap": ( - # fieldname type default - ('country', 'string', None), - ('locode', 'string', None), - ('section', 'string', None), - ('terminal', 'string', None), - ('hectometre', 'string', None), - ('rta', 'string', None), - ('status', 'uinteger', 'DAC200FID22_STATUS_NOT_AVAILABLE'), - ), - "stringbuffered": ("rta",), - }, - { - "initname": "json_ais6_fid25", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid25", - "fieldmap": ( - # fieldname type default - ('unit', 'uinteger', '0'), - ('amount', 'uinteger', '0'), - ('cargos', 'array', ( - ('cargo_t', 'ncargos', ( - ('code', 'uinteger', '0'), - ('subtype', 'uinteger', '0'), - )))), - ), - }, - { - "initname": "json_ais6_fid28", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid28", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('sender', 'uinteger', '0'), - ('rtype', 'uinteger', '0'), - ('rtype_text', 'ignore', None), - ('start', 'string', None), - ('duration', 'uinteger', '0'), - ('waypoints', 'array', ( - ('waypoint_t', 'waycount', ( - ('lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), - )))), - ), - 'stringbuffered': ('start',), - }, - { - "initname": "json_ais6_fid30", - "headers": ("AIS_HEADER", "AIS_TYPE6",), - "structname": "ais->type6.dac1fid30", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('text', 'string', '0'), - ), - }, - { - "initname": "json_ais6_fid32", - "headers": ("AIS_HEADER", "AIS_TYPE6"), - "structname": "ais->type6.dac1fid32", - "fieldmap": ( - # fieldname type default - ('month', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), - ('day', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), - ('tidals', 'array', ( - ('tidal_t', 'ntidals', ( - ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), - ('from_hour', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), - ('from_min', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), - ('to_hour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), - ('to_min', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), - ('cdir', 'uinteger', 'DAC1FID32_CDIR_NOT_AVAILABLE'), - ('cspeed', 'uinteger', 'DAC1FID32_CSPEED_NOT_AVAILABLE'), - )))), - ), - }, - { - "initname": "json_ais6_fid55", - "headers": ("AIS_HEADER", "AIS_TYPE6"), - "structname": "ais->type6.dac200fid55", - "fieldmap": ( - # fieldname type default - ('crew', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), - ('passengers', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), - ('personnel', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), - ), - }, - { - "initname": "json_ais7", - "headers": ("AIS_HEADER",), - "structname": "ais->type7", - "fieldmap": ( - # fieldname type default - ('mmsi1', 'uinteger', '0'), - ('mmsi2', 'uinteger', '0'), - ('mmsi3', 'uinteger', '0'), - ('mmsi4', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais8", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8", - "fieldmap": ( - # fieldname type default - ('data', 'string', None), - ), - "stringbuffered": ("data",), - }, - { - "initname": "json_ais8_fid10", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac200fid10", - "fieldmap": ( - # fieldname type default - ('vin', 'string', None), - ('length', 'uinteger', '0'), - ('beam', 'uinteger', '0'), - ('shiptype', 'uinteger', '0'), - ('shiptype_text', 'ignore', None), - ('hazard', 'uinteger', '0'), - ('hazard_text', 'ignore', None), - ('draught', 'uinteger', '0'), - ('loaded', 'uinteger', '0'), - ('loaded_text', 'ignore', None), - ('speed_q', 'boolean', 'false'), - ('course_q', 'boolean', 'false'), - ('heading_q', 'boolean', 'false'), - ), - }, - { - "initname": "json_ais8_fid11", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid11", - "fieldmap": ( - # fieldname type default - ('lat', 'integer', 'DAC1FID11_LAT_NOT_AVAILABLE'), - ('lon', 'integer', 'DAC1FID11_LON_NOT_AVAILABLE'), - ('timestamp', 'string', None), - ('wspeed', 'uinteger', 'DAC1FID11_WSPEED_NOT_AVAILABLE'), - ('wgust', 'uinteger', 'DAC1FID11_WSPEED_NOT_AVAILABLE'), - ('wdir', 'uinteger', 'DAC1FID11_WDIR_NOT_AVAILABLE'), - ('wgustdir', 'uinteger', 'DAC1FID11_WDIR_NOT_AVAILABLE'), - ('airtemp', 'uinteger', 'DAC1FID11_AIRTEMP_NOT_AVAILABLE'), - ('humidity', 'uinteger', 'DAC1FID11_HUMIDITY_NOT_AVAILABLE'), - ('dewpoint', 'uinteger', 'DAC1FID11_DEWPOINT_NOT_AVAILABLE'), - ('pressure', 'uinteger', 'DAC1FID11_PRESSURE_NOT_AVAILABLE'), - ('pressuretend', 'uinteger', 'DAC1FID11_PRESSURETREND_NOT_AVAILABLE'), - ('visibility', 'uinteger', 'DAC1FID11_VISIBILITY_NOT_AVAILABLE'), - ('waterlevel', 'integer', 'DAC1FID11_WATERLEVEL_NOT_AVAILABLE'), - ('leveltrend', 'uinteger', 'DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE'), - ('cspeed', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), - ('cdir', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), - ('cspeed2', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), - ('cdir2', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), - ('cdepth2', 'uinteger', 'DAC1FID11_CDEPTH_NOT_AVAILABLE'), - ('cspeed3', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), - ('cdir3', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), - ('cdepth3', 'uinteger', 'DAC1FID11_CDEPTH_NOT_AVAILABLE'), - ('waveheight', 'uinteger', 'DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE'), - ('waveperiod', 'uinteger', 'DAC1FID11_WAVEPERIOD_NOT_AVAILABLE'), - ('wavedir', 'uinteger', 'DAC1FID11_WAVEDIR_NOT_AVAILABLE'), - ('swellheight', 'uinteger', 'DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE'), - ('swellperiod', 'uinteger', 'DAC1FID11_WAVEPERIOD_NOT_AVAILABLE'), - ('swelldir', 'uinteger', 'DAC1FID11_WAVEDIR_NOT_AVAILABLE'), - ('seastate', 'uinteger', 'DAC1FID11_SEASTATE_NOT_AVAILABLE'), - ('watertemp', 'uinteger', 'DAC1FID11_WATERTEMP_NOT_AVAILABLE'), - ('preciptype', 'uinteger', 'DAC1FID11_PRECIPTYPE_NOT_AVAILABLE'), - ('preciptype_text', 'ignore', None), - ('salinity', 'uinteger', 'DAC1FID11_SALINITY_NOT_AVAILABLE'), - ('ice', 'uinteger', 'DAC1FID11_ICE_NOT_AVAILABLE'), - ('ice_text', 'ignore', None), - ), - "stringbuffered": ("timestamp",), - }, - { - "initname": "json_ais8_fid13", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid13", - "fieldmap": ( - # fieldname type default - ('reason', 'string', None), - ('closefrom', 'string', None), - ('closeto', 'string', None), - ('radius', 'uinteger', 'AIS_DAC1FID13_RADIUS_NOT_AVAILABLE'), - ('extunit', 'uinteger', 'AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE'), - ('fday', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), - ('fmonth', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), - ('fhour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), - ('fminute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), - ('tday', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), - ('tmonth', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), - ('thour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), - ('tminute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), - ), - 'stringbuffered': ('closefrom', 'closeto'), - }, - { - "initname": "json_ais8_fid15", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid15", - "fieldmap": ( - # fieldname type default - ('airdraught', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais8_fid16", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid16", - "fieldmap": ( - # fieldname type default - ('persons', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais8_fid17", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid17", - "fieldmap": ( - # fieldname type default - ('targets', 'array', ( - ('target_t', 'ntargets', ( - ('idtype', 'uinteger', 'DAC1FID17_IDTYPE_OTHER'), - ("id.mmsi", 'uinteger', '0'), - ("id.imo", 'uinteger', '0'), - ("id.callsign", 'string', 'DAC1FID17_ID_LENGTH'), - ("id.other", 'string', 'DAC1FID17_ID_LENGTH'), - ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), - ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), - ('course', 'uinteger', 'DAC1FID17_COURSE_NOT_AVAILABLE'), - ('second', 'uinteger', 'AIS_SECOND_NOT_AVAILABLE'), - ('speed', 'uinteger', 'DAC1FID17_SPEED_NOT_AVAILABLE'), - )))), - ), - }, - { - "initname": "json_ais8_fid19", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid19", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('station', 'string', None), - ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), - ('status', 'uinteger', '0'), - ('signal', 'uinteger', '0'), - ('signal_text', 'ignore', None), - ('hour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), - ('minute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), - ('nextsignal', 'uinteger', '0'), - ('nextsignal_type', 'ignore', None), - ), - }, - { - "initname": "json_ais8_fid23", - "headers": ("AIS_HEADER", "AIS_TYPE8"), - "structname": "ais->type8.dac200fid23", - "fieldmap": ( - # fieldname type default - ('start', 'string', None), - ('end', 'string', None), - ('start_lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), - ('start_lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), - ('end_lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), - ('end_lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), - ('type', 'uinteger', 'DAC200FID23_TYPE_UNKNOWN'), - ('type_text', 'ignore', None), - ('min', 'integer', 'DAC200FID23_MIN_UNKNOWN'), - ('max', 'integer', 'DAC200FID23_MAX_UNKNOWN'), - ('intensity', 'uinteger', 'DAC200FID23_CLASS_UNKNOWN'), - ('intensity_text', 'ignore', None), - ('wind', 'uinteger', 'DAC200FID23_WIND_UNKNOWN'), - ('wind_text', 'ignore', None), - ), - 'stringbuffered': ('start', 'end'), - }, - { - "initname": "json_ais8_fid24", - "headers": ("AIS_HEADER", "AIS_TYPE8"), - "structname": "ais->type8.dac200fid24", - "fieldmap": ( - # fieldname type default - ('country', 'string', None), - ('gauges', 'array', ( - ('gauge_t', 'ngauges', ( - ('id', 'uinteger', 'DAC200FID24_GAUGE_ID_UNKNOWN'), - ('level', 'integer', 'DAC200FID24_GAUGE_LEVEL_UNKNOWN'), - )))), - ), - }, - { - "initname": "json_ais8_fid27", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid27", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('sender', 'uinteger', '0'), - ('rtype', 'uinteger', '0'), - ('rtype_text', 'ignore', None), - ('start', 'string', None), - ('duration', 'uinteger', '0'), - ('waypoints', 'array', ( - ('waypoint_t', 'waycount', ( - ('lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), - )))), - ), - 'stringbuffered': ('start',), - }, - { - "initname": "json_ais8_fid29", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid29", - "fieldmap": ( - # fieldname type default - ('linkage', 'uinteger', '0'), - ('text', 'string', '0'), - ), - }, - { - "initname": "json_ais8_fid31", - "headers": ("AIS_HEADER", "AIS_TYPE8",), - "structname": "ais->type8.dac1fid31", - "fieldmap": ( - # fieldname type default - ('lon', 'integer', 'DAC1FID31_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'DAC1FID31_LAT_NOT_AVAILABLE'), - ('accuracy', 'boolean', 'false'), - ('timestamp', 'string', None), - ('wspeed', 'uinteger', 'DAC1FID31_WIND_NOT_AVAILABLE'), - ('wgust', 'uinteger', 'DAC1FID31_WIND_NOT_AVAILABLE'), - ('wdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('wgustdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('airtemp', 'integer', 'DAC1FID31_AIRTEMP_NOT_AVAILABLE'), - ('humidity', 'uinteger', 'DAC1FID31_HUMIDITY_NOT_AVAILABLE'), - ('dewpoint', 'integer', 'DAC1FID31_DEWPOINT_NOT_AVAILABLE'), - ('pressure', 'uinteger', 'DAC1FID31_PRESSURE_NOT_AVAILABLE'), - ('pressuretend', 'uinteger', 'DAC1FID31_PRESSURETEND_NOT_AVAILABLE'), - ('visgreater', 'boolean', 'false'), - ('visibility', 'uinteger', 'DAC1FID31_VISIBILITY_NOT_AVAILABLE'), - ('waterlevel', 'integer', 'DAC1FID31_WATERLEVEL_NOT_AVAILABLE'), - ('leveltrend', 'uinteger', 'DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE'), - ('cspeed', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), - ('cdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('cspeed2', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), - ('cdir2', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('cdepth2', 'uinteger', 'DAC1FID31_CDEPTH_NOT_AVAILABLE'), - ('cspeed3', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), - ('cdir3', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('cdepth3', 'uinteger', 'DAC1FID31_CDEPTH_NOT_AVAILABLE'), - ('waveheight', 'uinteger', 'DAC1FID31_HEIGHT_NOT_AVAILABLE'), - ('waveperiod', 'uinteger', 'DAC1FID31_PERIOD_NOT_AVAILABLE'), - ('wavedir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('swellheight', 'uinteger', 'DAC1FID31_HEIGHT_NOT_AVAILABLE'), - ('swellperiod', 'uinteger', 'DAC1FID31_PERIOD_NOT_AVAILABLE'), - ('swelldir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), - ('seastate', 'uinteger', 'DAC1FID31_SEASTATE_NOT_AVAILABLE'), - ('watertemp', 'integer', 'DAC1FID31_WATERTEMP_NOT_AVAILABLE'), - ('preciptype', 'uinteger', 'DAC1FID31_PRECIPTYPE_NOT_AVAILABLE'), - ('preciptype_text', 'ignore', None), - ('salinity', 'uinteger', 'DAC1FID31_SALINITY_NOT_AVAILABLE'), - ('ice', 'uinteger', 'DAC1FID31_ICE_NOT_AVAILABLE'), - ), - "stringbuffered": ("timestamp",), - }, - { - "initname": "json_ais8_fid40", - "headers": ("AIS_HEADER", "AIS_TYPE8"), - "structname": "ais->type8.dac200fid40", - "fieldmap": ( - # fieldname type default - ('form', 'uinteger', 'DAC200FID40_FORM_UNKNOWN'), - ('facing', 'uinteger', 'DAC200FID40_FACING_UNKNOWN'), - ('direction', 'uinteger', 'DAC200FID40_DIRECTION_UNKNOWN'), - ('direction_text', 'ignore', None), - ('status', 'uinteger', 'DAC200FID40_STATUS_UNKNOWN'), - ('status_text', 'ignore', None), - ), - }, - { - "initname": "json_ais9", - "headers": ("AIS_HEADER",), - "structname": "ais->type9", - "fieldmap": ( - # fieldname type default - ('alt', 'uinteger', 'AIS_ALT_NOT_AVAILABLE'), - ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), - ('accuracy', 'boolean', 'false'), - ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), - ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), - ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), - ('regional', 'uinteger', '0'), - ('dte', 'uinteger', '1'), - ('raim', 'boolean', 'false'), - ('radio', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais10", - "headers": ("AIS_HEADER",), - "structname": "ais->type10", - "fieldmap": ( - # fieldname type default - ('dest_mmsi', 'uinteger', '0'), - ), - }, - # Message type 11 duplicates 4 - { - "initname": "json_ais12", - "headers": ("AIS_HEADER",), - "structname": "ais->type12", - "fieldmap": ( - # fieldname type default - ('seqno', 'uinteger', '0'), - ('dest_mmsi', 'uinteger', '0'), - ('retransmit', 'boolean', '0'), - ('text', 'string', None), - ), - }, - # Message type 13 duplicates 7 - { - "initname": "json_ais14", - "headers": ("AIS_HEADER",), - "structname": "ais->type14", - "fieldmap": ( - # fieldname type default - ('text', 'string', None), - ), - }, - { - "initname": "json_ais15", - "headers": ("AIS_HEADER",), - "structname": "ais->type15", - "fieldmap": ( - # fieldname type default - ('mmsi1', 'uinteger', '0'), - ('type1_1', 'uinteger', '0'), - ('offset1_1', 'uinteger', '0'), - ('type1_2', 'uinteger', '0'), - ('offset1_2', 'uinteger', '0'), - ('mmsi2', 'uinteger', '0'), - ('type2_1', 'uinteger', '0'), - ('offset2_1', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais16", - "headers": ("AIS_HEADER",), - "structname": "ais->type16", - "fieldmap": ( - # fieldname type default - ('mmsi1', 'uinteger', '0'), - ('offset1', 'uinteger', '0'), - ('increment1', 'uinteger', '0'), - ('mmsi2', 'uinteger', '0'), - ('offset2', 'uinteger', '0'), - ('increment2', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais17", - "headers": ("AIS_HEADER",), - "structname": "ais->type17", - "fieldmap": ( - # fieldname type default - ('lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), - ('data', 'string', None), - ), - "stringbuffered": ("data",), - }, - { - "initname": "json_ais18", - "headers": ("AIS_HEADER",), - "structname": "ais->type18", - "fieldmap": ( - # fieldname type default - ('reserved', 'uinteger', '0'), - ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), - ('accuracy', 'boolean', 'false'), - ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), - ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), - ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), - ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), - ('regional', 'uinteger', '0'), - ('cs', 'boolean', 'false'), - ('display', 'boolean', 'false'), - ('dsc', 'boolean', 'false'), - ('band', 'boolean', 'false'), - ('msg22', 'boolean', 'false'), - ('raim', 'boolean', 'false'), - ('radio', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais19", - "headers": ("AIS_HEADER",), - "structname": "ais->type19", - "fieldmap": ( - # fieldname type default - ('reserved', 'uinteger', '0'), - ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), - ('accuracy', 'boolean', 'false'), - ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), - ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), - ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), - ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), - ('regional', 'uinteger', '0'), - ('shipname', 'string', None), - ('shiptype', 'uinteger', '0'), - ('shiptype_text', 'ignore', None), - ('to_bow', 'uinteger', '0'), - ('to_stern', 'uinteger', '0'), - ('to_port', 'uinteger', '0'), - ('to_starboard', 'uinteger', '0'), - ('epfd', 'uinteger', '0'), - ('epfd_text', 'ignore', None), - ('raim', 'boolean', 'false'), - ('dte', 'uinteger', '1'), - ('assigned', 'boolean', 'false'), - ), - }, - { - "initname": "json_ais20", - "headers": ("AIS_HEADER",), - "structname": "ais->type20", - "fieldmap": ( - # fieldname type default - ('offset1', 'uinteger', '0'), - ('number1', 'uinteger', '0'), - ('timeout1', 'uinteger', '0'), - ('increment1', 'uinteger', '0'), - ('offset2', 'uinteger', '0'), - ('number2', 'uinteger', '0'), - ('timeout2', 'uinteger', '0'), - ('increment2', 'uinteger', '0'), - ('offset3', 'uinteger', '0'), - ('number3', 'uinteger', '0'), - ('timeout3', 'uinteger', '0'), - ('increment3', 'uinteger', '0'), - ('offset4', 'uinteger', '0'), - ('number4', 'uinteger', '0'), - ('timeout4', 'uinteger', '0'), - ('increment4', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais21", - "headers": ("AIS_HEADER",), - "structname": "ais->type21", - "fieldmap": ( - # fieldname type default - ('aid_type', 'uinteger', '0'), - ('aid_type_text', 'ignore', None), - ('name', 'string', None), - ('accuracy', 'boolean', 'false'), - ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), - ('to_bow', 'uinteger', '0'), - ('to_stern', 'uinteger', '0'), - ('to_port', 'uinteger', '0'), - ('to_starboard', 'uinteger', '0'), - ('epfd', 'uinteger', '0'), - ('epfd_text', 'ignore', None), - ('second', 'uinteger', '0'), - ('regional', 'uinteger', '0'), - ('off_position', 'boolean', 'false'), - ('raim', 'boolean', 'false'), - ('virtual_aid', 'boolean', 'false'), - ), - }, - { - "initname": "json_ais22", - "headers": ("AIS_HEADER",), - "structname": "ais->type22", - "fieldmap": ( - # fieldname type default - ('channel_a', 'uinteger', '0'), - ('channel_b', 'uinteger', '0'), - ('txrx', 'uinteger', '0'), - ('power', 'boolean', 'false'), - ('area.ne_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), - ('area.ne_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), - ('area.sw_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), - ('area.sw_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), - ('mmsi.dest1', 'uinteger', '0'), - ('mmsi.dest2', 'uinteger', '0'), - ('addressed', 'boolean', 'false'), - ('band_a', 'boolean', 'false'), - ('band_b', 'boolean', 'false'), - ('zonesize', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais23", - "headers": ("AIS_HEADER",), - "structname": "ais->type23", - "fieldmap": ( - # fieldname type default - ('ne_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), - ('ne_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), - ('sw_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), - ('sw_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), - ('stationtype', 'uinteger', '0'), - ('stationtype_text', 'ignore', None), - ('shiptype', 'uinteger', '0'), - ('shiptype_text', 'ignore', None), - ('txrx', 'uinteger', '0'), - ('interval', 'uinteger', '0'), - ('quiet', 'uinteger', '0'), - ), - }, - { - "initname": "json_ais24", - "headers": ("AIS_HEADER",), - "structname": "ais->type24", - "fieldmap": ( - # fieldname type default - ('shipname', 'string', None), # Part A - ('shiptype', 'uinteger', '0'), # Part B - ('shiptype_text', 'ignore', None), - ('vendorid', 'string', None), # Part B - ('model', 'uinteger', '0'), # Part B - ('serial', 'uinteger', '0'), # Part B - ('callsign', 'string', None), # Part B - ('mothership_mmsi', 'uinteger', '0'), # Part B - ('dim.to_bow', 'uinteger', '0'), # Part B - ('dim.to_stern', 'uinteger', '0'), # Part B - ('dim.to_port', 'uinteger', '0'), # Part B - ('dim.to_starboard', 'uinteger', '0'), # Part B - ), - }, - { - "initname": "json_ais25", - "headers": ("AIS_HEADER",), - "structname": "ais->type25", - "fieldmap": ( - # fieldname type default - ('addressed', 'boolean', 'false'), - ('structured', 'boolean', 'false'), - ('dest_mmsi', 'uinteger', '0'), - ('app_id', 'uinteger', '0'), - ('data', 'string', None), - ), - "stringbuffered": ("data",), - }, - { - "initname": "json_ais26", - "headers": ("AIS_HEADER",), - "structname": "ais->type26", - "fieldmap": ( - # fieldname type default - ('addressed', 'boolean', 'false'), - ('structured', 'boolean', 'false'), - ('dest_mmsi', 'uinteger', '0'), - ('app_id', 'uinteger', '0'), - ('data', 'string', None), - ('radio', 'uinteger', '0'), - ), - "stringbuffered": ("data",), - }, - { - "initname": "json_ais27", - "headers": ("AIS_HEADER",), - "structname": "ais->type27", - "fieldmap": ( - # fieldname type default - ('status', 'uinteger', '0'), - ('speed', 'uinteger', 'AIS_LONGRANGE_SPEED_NOT_AVAILABLE'), - ('accuracy', 'boolean', 'false'), - ('lon', 'integer', 'AIS_LONGRANGE_LON_NOT_AVAILABLE'), - ('lat', 'integer', 'AIS_LONGRANGE_LAT_NOT_AVAILABLE'), - ('course', 'uinteger', 'AIS_LONGRANGE_COURSE_NOT_AVAILABLE'), - ('raim', 'boolean', 'false'), - ('gnss', 'boolean', 'true'), - ), - }, -) - -# You should not need to modify anything below this line. - - -def generate(spec): - report = "" - leader = " " * 39 - initname = spec["initname"] - # Utter storage declarations for any fields that are declared to be - # stringbuffered. These will need to be postprocessed in json_ais_read(). - attributes = [t[0] for t in spec["fieldmap"]] - for attr in spec.get("stringbuffered", []): - if attr not in attributes: - sys.stderr.write("buffered %s is not in base attributes of %s\n" - % (attr, initname)) - raise SystemExit(1) - elif attr not in outboard: - report += " char %s[JSON_VAL_MAX+1];\n" % attr - outboard.append(attr) - - structname = spec["structname"] - # If there are structarrays describing array subobjects, we need - # to make a separate parse control initializer for each one. The - # attribute name is the name of the array; substructure and length - # fieldnames must be given in the defaults part. - for (attr, itype, arrayparts) in spec["fieldmap"]: - if itype == 'array': - (innerstruct, lengthfield, elements) = arrayparts - report += " const struct json_attr_t %s_%s_subtype[] = {\n" % (initname, attr) - for (subattr, subitype, default) in elements: - report += '\t{"%s",%st_%s,%sSTRUCTOBJECT(struct %s, %s),\n' % \ - (subattr, " " * (14 - len(subattr)), subitype, " " * (8 - len(subitype)), innerstruct, subattr) - if subitype != "string": - report += leader + ".dflt.%s = %s},\n" % (subitype, default) - elif default: - report += leader + ".len = %s},\n" % (default,) - else: - sys.stderr.write("explicit length specification required\n") - raise SystemExit(1) - report += """\ - {NULL} - }; -""" - # Generate the main structure definition describing this parse. - # It may have object subarrays. - report += " const struct json_attr_t %s[] = {\n" % initname - if "headers" in spec: - for header in spec["headers"]: - report += '\t' + header + "\n" - for (attr, itype, default) in spec["fieldmap"]: - if itype == 'array': - (innerstruct, lengthfield, elements) = default - report += '\t{"%s",%st_array, STRUCTARRAY(%s.%s, %s_%s_subtype, &%s.%s)},\n' \ - % (attr, " " * (14 - len(attr)), structname, attr, initname, attr, structname, lengthfield) - else: - if itype == "string": - deref = "" - else: - deref = "&" - if attr in spec.get("stringbuffered", []): - target = attr - else: - target = structname + "." + attr - if "." in attr: - attr = attr[attr.rfind(".") + 1:] - if itype == 'ignore': - report += '\t{"%s", t_ignore},\n' % attr - continue - report += '\t{"%s",%st_%s,%s.addr.%s = %s%s,\n' % \ - (attr, " " * (14 - len(attr)), itype, " " * (10 - len(itype)), itype, deref, target) - if itype == "string": - report += leader + ".len = sizeof(%s)},\n" % target - else: - report += leader + ".dflt.%s = %s},\n" % (itype, default) - report += """\ - {NULL} - }; -""" - print(report) - -if __name__ == '__main__': - try: - # The --ais and --target= options are (required) placeholders. - # In the future, this script will generate more different kinds - # of code. - (options, arguments) = getopt.getopt(sys.argv[1:], "", ["ais", "target="]) - except getopt.GetoptError as msg: - print("jsongen.py: " + str(msg)) - raise SystemExit(1) - - spec = None - target = None - for (switch, val) in options: - if switch == '--ais': - spec = ais_specs - elif switch == '--target': - target = val - - if not target or not spec: - print("jsongen.py: must specify type and target.") - raise SystemExit(1) - - if target == 'parser': - print("""/* - * This is code generated by jsongen.py. Do not hand-hack it! - */ - #define NITEMS(x) (int)(sizeof(x)/sizeof(x[0])) - -/*@ -fullinitblock */ - -""") - outboard = [] - for description in spec: - generate(description) - print(""" -/*@ +fullinitblock */ - -/* Generated code ends. */ -""") -# The following sets edit modes for GNU EMACS -# Local Variables: -# mode:python -# End: diff --git a/maskaudit.py b/maskaudit.py new file mode 100755 index 00000000..cfa07785 --- /dev/null +++ b/maskaudit.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python +# +# This file is Copyright (c) 2010 by the GPSD project +# BSD terms apply: see the file COPYING in the distribution root for details. +# +# With -p, dump a Python status mask list translated from the C one. +# +# With -c, generate C code to dump masks for debugging purposes. +# +# With -t, tabulate usage of defines to find unused ones. Requires -c or -d. + +# This code runs under both Python 2 and Python 3. Preserve this property! +from __future__ import print_function + +import getopt +import glob +import sys + +try: + from subprocess import getstatusoutput +except ImportError: + from commands import getstatusoutput + +class SourceExtractor: + def __init__(self, sourcefile, clientside): + self.sourcefile = sourcefile + self.clientside = clientside + self.daemonfiles = [ + "gpsd.c", + "libgpsd_core.c", + "pseudonmea.c", + "drivers.c", + "gpsmon.c", + "subframe.c" + ] + glob.glob("driver_*.c") + glob.glob("monitor_*.c") + self.masks = [] + self.primitive_masks = [] + for line in open(self.sourcefile): + if line.startswith("#define") and ("_SET" in line or "_IS" in line): + fields = line.split() + self.masks.append((fields[1], fields[2])) + if fields[2].startswith("(1llu<<") or fields[2].startswith("INTERNAL_SET"): + self.primitive_masks.append((fields[1], fields[2])) + + def in_library(self, flag): + (status, _output) = getstatusoutput("grep %s libgps_core.c libgps_json.c gpsctl.c" % flag) + return status == 0 + + def in_daemon(self, flag): + (status, _output) = getstatusoutput("grep %s %s" % (flag, " ".join(self.daemonfiles))) + return status == 0 + + def relevant(self, flag): + if self.clientside: + return self.in_library(flag) + else: + return self.in_daemon(flag) + +if __name__ == '__main__': + try: + (options, arguments) = getopt.getopt(sys.argv[1:], "cdpt") + pythonize = tabulate = False + clientgen = daemongen = False + for (switch, val) in options: + if switch == '-p': + pythonize = True + if switch == '-c': + clientgen = True + if switch == '-d': + daemongen = True + if switch == '-t': + tabulate = True + + if not arguments: + srcdir = '.' + else: + srcdir = arguments[0] + + clientside = SourceExtractor(srcdir + "/gps.h", clientside=True) + daemonside = SourceExtractor(srcdir + "/gpsd.h", clientside=False) + if clientgen: + source = clientside + banner = "Library" + elif daemongen: + source = daemonside + banner = "Daemon" + else: + sys.stderr.write("maskaudit: need -c or -d option\n") + sys.exit(1) + + if tabulate: + print("%-14s %8s" % (" ", banner)) + for (flag, value) in source.masks: + print("%-14s %8s" % (flag, source.relevant(flag))) + if pythonize: + for (d, v) in source.masks: + if v[-1] == 'u': + v = v[:-1] + print("%-15s\t= %s" % (d, v)) + if not pythonize and not tabulate: + maxout = 0 + for (d, v) in source.primitive_masks: + if source.relevant(d): + stem = d + if stem.endswith("_SET"): + stem = stem[:-4] + if stem.endswith("_IS"): + stem = stem[:-3] + maxout += len(stem) + 1 + print("""/* This code is generated. Do not hand-hack it! */ + +/* + * Also, beware that it is something of a CPU hog when called on every packet. + * Try to write guards so it is only called at higher log levels. + */ + +#include +#include + +#include \"gpsd.h\" + +const char *gps_maskdump(gps_mask_t set) +{ + static char buf[%d]; + const struct { + gps_mask_t mask; + const char *name; + } *sp, names[] = {""" % (maxout + 3,)) + for (flag, value) in clientside.primitive_masks + daemonside.primitive_masks: + stem = flag + if stem.endswith("_SET"): + stem = stem[:-4] + if stem.endswith("_IS"): + stem = stem[:-3] + print(" {%s,\t\"%s\"}," % (flag, stem)) + print('''\ + }; + + memset(buf, '\\0', sizeof(buf)); + buf[0] = '{'; + for (sp = names; sp < names + sizeof(names)/sizeof(names[0]); sp++) + if ((set & sp->mask)!=0) { + (void)strlcat(buf, sp->name, sizeof(buf)); + (void)strlcat(buf, "|", sizeof(buf)); + } + if (buf[1] != \'\\0\') + buf[strlen(buf)-1] = \'\\0\'; + (void)strlcat(buf, "}", sizeof(buf)); + return buf; +} +''') + except KeyboardInterrupt: + pass + +# The following sets edit modes for GNU EMACS +# Local Variables: +# mode:python +# End: diff --git a/maskaudit.py.in b/maskaudit.py.in deleted file mode 100644 index c1579317..00000000 --- a/maskaudit.py.in +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python -# -# @MASTER@ -# -# This file is Copyright (c) 2010 by the GPSD project -# BSD terms apply: see the file COPYING in the distribution root for details. -# -# With -p, dump a Python status mask list translated from the C one. -# -# With -c, generate C code to dump masks for debugging purposes. -# -# With -t, tabulate usage of defines to find unused ones. Requires -c or -d. - -# This code runs under both Python 2 and Python 3. Preserve this property! -from __future__ import print_function - -import getopt -import glob -import sys - -try: - from subprocess import getstatusoutput -except ImportError: - from commands import getstatusoutput - -class SourceExtractor: - def __init__(self, sourcefile, clientside): - self.sourcefile = sourcefile - self.clientside = clientside - self.daemonfiles = [ - "gpsd.c", - "libgpsd_core.c", - "pseudonmea.c", - "drivers.c", - "gpsmon.c", - "subframe.c" - ] + glob.glob("driver_*.c") + glob.glob("monitor_*.c") - self.masks = [] - self.primitive_masks = [] - for line in open(self.sourcefile): - if line.startswith("#define") and ("_SET" in line or "_IS" in line): - fields = line.split() - self.masks.append((fields[1], fields[2])) - if fields[2].startswith("(1llu<<") or fields[2].startswith("INTERNAL_SET"): - self.primitive_masks.append((fields[1], fields[2])) - - def in_library(self, flag): - (status, _output) = getstatusoutput("grep %s libgps_core.c libgps_json.c gpsctl.c" % flag) - return status == 0 - - def in_daemon(self, flag): - (status, _output) = getstatusoutput("grep %s %s" % (flag, " ".join(self.daemonfiles))) - return status == 0 - - def relevant(self, flag): - if self.clientside: - return self.in_library(flag) - else: - return self.in_daemon(flag) - -if __name__ == '__main__': - try: - (options, arguments) = getopt.getopt(sys.argv[1:], "cdpt") - pythonize = tabulate = False - clientgen = daemongen = False - for (switch, val) in options: - if switch == '-p': - pythonize = True - if switch == '-c': - clientgen = True - if switch == '-d': - daemongen = True - if switch == '-t': - tabulate = True - - if not arguments: - srcdir = '.' - else: - srcdir = arguments[0] - - clientside = SourceExtractor(srcdir + "/gps.h", clientside=True) - daemonside = SourceExtractor(srcdir + "/gpsd.h", clientside=False) - if clientgen: - source = clientside - banner = "Library" - elif daemongen: - source = daemonside - banner = "Daemon" - else: - sys.stderr.write("maskaudit: need -c or -d option\n") - sys.exit(1) - - if tabulate: - print("%-14s %8s" % (" ", banner)) - for (flag, value) in source.masks: - print("%-14s %8s" % (flag, source.relevant(flag))) - if pythonize: - for (d, v) in source.masks: - if v[-1] == 'u': - v = v[:-1] - print("%-15s\t= %s" % (d, v)) - if not pythonize and not tabulate: - maxout = 0 - for (d, v) in source.primitive_masks: - if source.relevant(d): - stem = d - if stem.endswith("_SET"): - stem = stem[:-4] - if stem.endswith("_IS"): - stem = stem[:-3] - maxout += len(stem) + 1 - print("""/* This code is generated. Do not hand-hack it! */ - -/* - * Also, beware that it is something of a CPU hog when called on every packet. - * Try to write guards so it is only called at higher log levels. - */ - -#include -#include - -#include \"gpsd.h\" - -const char *gps_maskdump(gps_mask_t set) -{ - static char buf[%d]; - const struct { - gps_mask_t mask; - const char *name; - } *sp, names[] = {""" % (maxout + 3,)) - for (flag, value) in clientside.primitive_masks + daemonside.primitive_masks: - stem = flag - if stem.endswith("_SET"): - stem = stem[:-4] - if stem.endswith("_IS"): - stem = stem[:-3] - print(" {%s,\t\"%s\"}," % (flag, stem)) - print('''\ - }; - - memset(buf, '\\0', sizeof(buf)); - buf[0] = '{'; - for (sp = names; sp < names + sizeof(names)/sizeof(names[0]); sp++) - if ((set & sp->mask)!=0) { - (void)strlcat(buf, sp->name, sizeof(buf)); - (void)strlcat(buf, "|", sizeof(buf)); - } - if (buf[1] != \'\\0\') - buf[strlen(buf)-1] = \'\\0\'; - (void)strlcat(buf, "}", sizeof(buf)); - return buf; -} -''') - except KeyboardInterrupt: - pass - -# The following sets edit modes for GNU EMACS -# Local Variables: -# mode:python -# End: diff --git a/valgrind-audit.py b/valgrind-audit.py new file mode 100755 index 00000000..caa56c0a --- /dev/null +++ b/valgrind-audit.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# +# This is a valgrind torture test for the gpsd daemon. +# It's not really expected to spot anything as long as we aren't using +# malloc and friends in the daemon. +# +# This file is Copyright (c) 2010 by the GPSD project +# BSD terms apply: see the file COPYING in the distribution root for details. +# +from __future__ import print_function + +import sys, gps.fake + +debuglevel = 1 + +invocation = "valgrind --tool=memcheck --gen-suppressions=yes --leak-check=yes --suppressions=valgrind-suppressions" +test = gps.fake.TestSession(prefix=invocation, options="-D %d" % debuglevel) +test.progress = sys.stderr.write + +try: + test.spawn() + print("\n*** Test #1: Normal single-client-session behavior.") + print("**** Add a GPS.\n") + gps1 = test.gps_add("test/daemon/bu303-moving.log") + + print("\n**** Add and remove a client.\n") + c1 = test.client_add("w\n") + test.gather(3) + test.client_remove(c1) + + print("\n**** Remove the GPS.") + test.gps_remove(gps1) + print("*** Test #1 complete.\n") + test.wait(3) + + ###################################################################### + + print("\n*** Test #2: Successive non-overlapping client sessions.") + print("**** Add a GPS.\n") + gps1 = test.gps_add("test/daemon/bu303-climbing.log") + + print("\n**** Add and remove first client.\n") + c1 = test.client_add("w\n") + test.gather(3) + test.client_remove(c1) + test.wait(3) + + print("\n**** Add and remove second client.\n") + c2 = test.client_add("w\n") + test.gather(3) + test.client_remove(c2) + test.wait(3) + + print("\n**** Remove the GPS.") + test.gps_remove(gps1) + print("*** Test #2 complete.\n") + test.wait(3) + + ###################################################################### + + print("\n*** Test #3: Overlapping client sessions.") + print("**** Add a GPS.\n") + gps1 = test.gps_add("test/daemon/bu303-climbing.log") + + print("\n**** Add first client.\n") + c1 = test.client_add("w\n") + test.gather(2) + print("\n**** Add second client.\n") + c2 = test.client_add("w\n") + test.gather(3) + print("\n**** Remove first client.\n") + test.client_remove(c1) + test.gather(2) + print("\n**** Remove second client.\n") + test.client_remove(c2) + + print("\n**** Remove the GPS.") + test.gps_remove(gps1) + print("*** Test #3 complete.\n") + + ###################################################################### + + print("\n*** Test #4: GPS removed while client still active.") + print("**** Add a GPS.\n") + gps1 = test.gps_add("test/daemon/bu303-moving.log") + + print("\n**** Add a client.\n") + c1 = test.client_add("w\n") + test.gather(3) + print("\n**** Remove the GPS.") + test.gps_remove(gps1) + test.wait(3) + print("\n**** Remove the client.\n") + test.client_remove(c1) + + print("*** Test #4 complete.\n") +finally: + test.cleanup() + +# The following sets edit modes for GNU EMACS +# Local Variables: +# mode:python +# End: diff --git a/valgrind-audit.py.in b/valgrind-audit.py.in deleted file mode 100644 index ea34a6a3..00000000 --- a/valgrind-audit.py.in +++ /dev/null @@ -1,105 +0,0 @@ -#!@PYTHON@ -# -# @MASTER@ -# -# This is a valgrind torture test for the gpsd daemon. -# It's not really expected to spot anything as long as we aren't using -# malloc and friends in the daemon. -# -# This file is Copyright (c) 2010 by the GPSD project -# BSD terms apply: see the file COPYING in the distribution root for details. -# -from __future__ import print_function - -import sys, gps.fake - -debuglevel = 1 - -invocation = "valgrind --tool=memcheck --gen-suppressions=yes --leak-check=yes --suppressions=valgrind-suppressions" -test = gps.fake.TestSession(prefix=invocation, options="-D %d" % debuglevel) -test.progress = sys.stderr.write - -try: - test.spawn() - print("\n*** Test #1: Normal single-client-session behavior.") - print("**** Add a GPS.\n") - gps1 = test.gps_add("test/daemon/bu303-moving.log") - - print("\n**** Add and remove a client.\n") - c1 = test.client_add("w\n") - test.gather(3) - test.client_remove(c1) - - print("\n**** Remove the GPS.") - test.gps_remove(gps1) - print("*** Test #1 complete.\n") - test.wait(3) - - ###################################################################### - - print("\n*** Test #2: Successive non-overlapping client sessions.") - print("**** Add a GPS.\n") - gps1 = test.gps_add("test/daemon/bu303-climbing.log") - - print("\n**** Add and remove first client.\n") - c1 = test.client_add("w\n") - test.gather(3) - test.client_remove(c1) - test.wait(3) - - print("\n**** Add and remove second client.\n") - c2 = test.client_add("w\n") - test.gather(3) - test.client_remove(c2) - test.wait(3) - - print("\n**** Remove the GPS.") - test.gps_remove(gps1) - print("*** Test #2 complete.\n") - test.wait(3) - - ###################################################################### - - print("\n*** Test #3: Overlapping client sessions.") - print("**** Add a GPS.\n") - gps1 = test.gps_add("test/daemon/bu303-climbing.log") - - print("\n**** Add first client.\n") - c1 = test.client_add("w\n") - test.gather(2) - print("\n**** Add second client.\n") - c2 = test.client_add("w\n") - test.gather(3) - print("\n**** Remove first client.\n") - test.client_remove(c1) - test.gather(2) - print("\n**** Remove second client.\n") - test.client_remove(c2) - - print("\n**** Remove the GPS.") - test.gps_remove(gps1) - print("*** Test #3 complete.\n") - - ###################################################################### - - print("\n*** Test #4: GPS removed while client still active.") - print("**** Add a GPS.\n") - gps1 = test.gps_add("test/daemon/bu303-moving.log") - - print("\n**** Add a client.\n") - c1 = test.client_add("w\n") - test.gather(3) - print("\n**** Remove the GPS.") - test.gps_remove(gps1) - test.wait(3) - print("\n**** Remove the client.\n") - test.client_remove(c1) - - print("*** Test #4 complete.\n") -finally: - test.cleanup() - -# The following sets edit modes for GNU EMACS -# Local Variables: -# mode:python -# End: -- cgit v1.2.1